scikit learn 使用多项式朴素贝叶斯作为三元分类器?

Posted

技术标签:

【中文标题】scikit learn 使用多项式朴素贝叶斯作为三元分类器?【英文标题】:scikit learn use multinomial naive bayes for a trigram classifier? 【发布时间】:2013-06-24 09:36:49 【问题描述】:

我已经查看并试用了 scikit-learn 关于其多项式朴素贝叶斯分类器的教程。

我想用它来对文本文档进行分类,而关于 NB 的问题在于它将其 P(document|label) 视为其所有独立特征(单词)的乘积。现在,我需要尝试做 3 个三元分类器,其中 P(document|label) = P(wordX|wordX-1,wordX-2,label) * P(wordX-1|wordX-2,wordX-3,标签)。

scikit learn 在哪里支持我可以实现此语言模型并扩展 NB 分类器以基于此执行分类的任何内容?

【问题讨论】:

【参考方案1】:

CountVectorizer 将为您提取三元组(使用ngram_range=(3, 3))。 text feature extraction documentation 介绍了这一点。然后,只需像以前一样使用 MultinomialNB 和转换后的特征矩阵。

请注意,这实际上是建模:

P(document | label) = P(wordX, wordX-1, wordX-2 | label) * P (wordX-1, wordX-2, wordX-3 | 标签) * ...

这有什么不同?那么,第一项可以写成

P(wordX, wordX-1, wordX-2 | 标签) = P(wordX | wordX-1, wordX-2, 标签) * P(wordX-1, wordX -2 | 标签)

当然,所有其他术语也可以这样写,所以你最终会得到(为了简洁,去掉标签上的下标和条件):

P(X | X-1, X-2) P(X-1 | X-2, X-3) ... P(3 | 2, 1) P(X-1, X-2) P(X-2, X-3) ... P(2, 1)

现在,P(X-1, X-2) 可以写成 P(X-1 | X-2) P(X-2)。因此,如果我们对所有这些条款都这样做,我们就有

P(X | X-1, X-2) P(X-1 | X-2, X-3) ... P(3 | 2, 1) P(X-1 | X-2) P(X-2 | X-3) ... P(2 | 1) P(X-2) P(X-1) ... P(1)

所以这实际上就像使用三元组、二元组和一元组(尽管不直接估计二元组/一元组)。

【讨论】:

无可挑剔的答案,只是它是 ngram_range。另外,在这里提问。假设每个元组 (word1, word2, word3) 是一个特征,MultinomialNB 是如何知道这种条件概率依赖的? 哎呀,抱歉打错了。而且:它实际上并不知道条件依赖。一个三元组特征意味着它正在对列出的第一个方程进行建模。这只是概率的事实,相当于独立地建模三元组,二元组,一元组,除了它丢弃 P(X | X-1) P(X) P(X-1) 并且估计基于三元组等等可能比你最后直接估计公式更糟糕。 Dougal,这真是一个很好的解释。但是,您所说的“估计是基于三元组的,因此可能比最后直接估计公式更糟糕”是什么意思。 P(X, X-1, X-2) = P(X | X-1, X-2) P(X-2 | X-1) P(X-1) 是真的。但是,当您对上述三元组的联合分布进行建模时,您通过计算您看到该三元组的次数来估计 P(X, X-1, X-2)。如果您想直接估计P(X|X-1, X-2) P(X-1|X-2) P(X-2),则改为基于三元组、二元组和一元组的计数。您对二元组,尤其是一元组概率的估计会更好(方差更低),因为看到的可能性更少。因此,估计值可能会比您同时使用这三个时更差。 哦,哇,我没有意识到这一点,但现在你这么说,它确实有道理。谢谢你,你的解释让我很开心!

以上是关于scikit learn 使用多项式朴素贝叶斯作为三元分类器?的主要内容,如果未能解决你的问题,请参考以下文章

Hashingvectorizer 和多项式朴素贝叶斯不能一起工作

机器学习之朴素贝叶斯(分类)

利用sklearn进行朴素贝叶斯分类

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

实验三 朴素贝叶斯算法及应用

如何为 scikit-learn 的朴素贝叶斯指定先验概率