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

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

我使用的方法是从这本书的第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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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