朴素贝叶斯文本分类错误结果
Posted
技术标签:
【中文标题】朴素贝叶斯文本分类错误结果【英文标题】:Naive Bayes text classification incorrect results 【发布时间】:2016-10-04 06:52:03 【问题描述】:我编写了一个朴素贝叶斯分类器,但它似乎并没有特别好用。数单词等不是问题,但概率是。
我一直使用的方法从this book 的第 180 页开始 但我将使用wiki article 中的术语来使其更加通用。
培训
通过训练,我正在为某个类别中出现的每个单词创建一个概率:
for category in categories:
for word in category_vocabulary[category]:
word_probability[category][word] = (category_vocabulary[category][word] + 1) / (total_words_in_category[category] + len(vocabulary))
所以我得到一个词在一个类别中出现的总次数,加一个,然后除以一个类别中的总词数,再加上词汇表的大小(不同的词)。这是 P(xi|Ck)
我还计算了一个类别的概率p(Ck),category_probability,简单来说就是一个类别中的词数除以所有类别中的词数
for category in categories:
category_probability[category] = total_words_in_category[category] / sum(total_words_in_category.values())
分类
为了分类,我循环遍历待分类文档的所有标记,并计算文本中所有单词的 word_probability 的乘积。
for category in categories:
if word in word_probability[category]:
if final_probability[category] == 0:
final_probability[category] = word_probability[category][word]
else:
final_probability[category] *= word_probability[category][word]
最后为了计算分数,我将其乘以类别概率
score = category_probability[category] * final_probability[category]
这个分数似乎完全错误,我不知道该怎么办。当我查看其他人的方法时,它们似乎涉及一些日志和指数,但我不确定它们如何与本书和 wiki 文章相匹配。
任何帮助都将不胜感激,因为我想我做错了什么对于更了解它的人来说有些明显。
【问题讨论】:
【参考方案1】:这个分数似乎完全错误,我不知道该怎么办。
首先,类别概率不是通过类别中的单词与总单词数的比例来估计的
for category in categories:
category_probability[category] = total_words_in_category[category] / sum(total_words_in_category.values())
但是一个类别中的 句子 数与句子总数(或段落、文档、对象 - 您正在分类的事物)的总数。因此
for category in categories:
category_probability[category] = total_objects_in_category[category] / sum(total_objects_in_category.values())
当我查看其他人的方法时,他们似乎涉及一些日志和指数,但我不确定它们是否适合书籍和 wiki 文章。
这是因为直接概率计算(您所做的)数值不稳定。您最终将乘以许多微小的数字,因此精度将成倍下降。因此,人们使用了这个简单的数学等式:
PROD_i P(x) = exp [ log [ PROD_i P_i(x) ] ] = exp [ SUM_i log P_i(X) ]
因此,不是存储 概率,而是存储 概率的对数,而不是将它们相乘,而是求和。如果你想恢复真实概率,你所要做的就是取 exp 值,但对于分类你不必,如P(x) > P(y) <-> log P(x) > log P(y)
【讨论】:
这说明了很多。我已经开始明白日志对于计算的精度是必要的,但我不明白它如何与乘法和求和相匹配。我现在将尝试实施它。非常感谢!以上是关于朴素贝叶斯文本分类错误结果的主要内容,如果未能解决你的问题,请参考以下文章