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

我已经编写了一个朴素贝叶斯分类器,但似乎效果不太好。词汇计数等方面没有问题,但概率计算出现了问题。

我使用的方法是从这本书的第180页开始的,但我会使用维基百科文章中的术语,使其更具通用性。

训练

在训练过程中,我为每个类别中的每个词创建一个概率:

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))

因此,我计算一个词在一个类别中出现的总次数,加上1,然后除以该类别中的总词数,再加上词汇表的大小(不同的词)。这是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]

这个得分似乎完全错误,我不知道该怎么办。当我查看其他人的方法时,他们似乎涉及一些对数和指数,但我不知道它们如何与书籍和维基百科文章相符。

任何帮助都将不胜感激,因为我认为我做错的地方对于更好理解它的人来说是相当明显的。


回答:

这个得分似乎完全错误,我不知道该怎么办。

首先,类别概率不是通过类别中词的比例与总词数来估计的

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)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注