文档中的朴素贝叶斯分类器的长度归一化

我正在尝试实现一个朴素贝叶斯分类器来对文档进行分类,这些文档本质上是集合(而不是袋子)形式的特征,即每个特征包含一组独特的特征,每个特征在文档中最多只能出现一次。例如,你可以将这些特征视为文档的独特关键词。

我仔细阅读了Rennie等人发表在http://www.aaai.org/Papers/ICML/2003/ICML03-081.pdf的论文,但遇到了一个似乎未被解决的问题。具体来说,分类短文档时,由于文档的特征数量较少,导致后验概率显著提高;反之,长文档则相反。

这是因为后验概率的定义是(忽略分母):

P(class|document) = P(class) * P(document|class)

这可以展开为

P(class|document) = P(class) * P(feature1|class) * ... * P(featureK|class)

由此可见,特征较少的短文档会因为需要相乘的项较少而具有更高的后验概率。

例如,假设特征“foo”、“bar”和“baz”都在正向训练观察中出现。那么,仅包含特征“foo”的文档在正向类别中的后验概率会高于包含特征集{“foo”, “bar”, “baz”}的文档。这似乎违反直觉,但我还不确定如何解决这个问题。

是否有某种长度归一化的方法?一个想法是将文档的大小作为一个特征添加进去,但这似乎不太对,因为结果会受到训练数据中文档大小的影响而出现偏差。


回答:

这是一个好问题;现在我并不完全确定这里是否存在问题。后验概率只是给你提供了一个给定文档的每个类别的概率(即每个文档类别的概率)。因此,在对文档进行分类时,你只是在比较给定同一文档的后验概率,因此特征的数量不会改变(因为你没有跨文档比较),也就是说:

P(class1|document) = P(class1) * P(feature1|class1) * ... * P(featureK|class1)...P(classN|document) = P(classN) * P(feature1|classN) * ... * P(featureK|classN)

后验概率最高的类别将被称为文档的标签。因此,由于特征的数量似乎取决于文档而不是类别,所以不需要进行归一化。

我是否遗漏了什么?如果你想做一些比分类更多的事情,例如想要比较某个类别中最可能的文档,那么你就必须使用后验概率的实际定义:

P(class1|document) = P(class1) * P(feature1|class1) * ... * P(featureK|class1)/Sum_over_all_numerators

这样就可以正确地对不同特征长度的文档进行归一化。

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中创建了一个多类分类项目。该项目可以对…

发表回复

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