朴素贝叶斯文本分类错误结果

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)

【讨论】:

这说明了很多。我已经开始明白日志对于计算的精度是必要的,但我不明白它如何与乘法和求和相匹配。我现在将尝试实施它。非常感谢!

以上是关于朴素贝叶斯文本分类错误结果的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯算法(python)

我需要提高朴素贝叶斯文本分类的准确性

朴素贝叶斯分类算法的sklearn实现

机器学习之朴素贝叶斯

如何在文本分类中使用朴素贝叶斯预测所需的类

实战:朴素贝叶斯对文档进行分类