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 使用多项式朴素贝叶斯作为三元分类器?的主要内容,如果未能解决你的问题,请参考以下文章