朴素贝叶斯文本分类不正确的结果

时间:2016-06-04 06:55:54

标签: python machine-learning naivebayes

我编写了朴素贝叶斯分类器,但它似乎并没有起到特别好的作用。计算单词等不是问题,但概率已经存在。

我使用的方法从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]

这个分数似乎完全错误,我不知道该怎么做。当我查找其他人的方法时,他们似乎涉及一些日志和指数,但我不确定他们如何适应这本书和维基文章。

任何帮助都会非常感激,因为我想象我做错了什么对于那些更了解它的人来说有点明显。

1 个答案:

答案 0 :(得分: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())
  

当我查找其他人的方法时,他们似乎涉及一些日志和指数,但我不确定他们如何适应这本书和维基文章。

这是因为直接概率计算(你做的)数值不稳定。你将最终乘以大量的微小数字,因此精度将呈指数下降。因此,人们使用这种简单的数学平等:

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)