scikits learn and nltk:Naive Bayes分类器性能差异很大

D T*_*D T 13 python machine-learning nltk scikits scikit-learn

我正在比较两个Naive Bayes分类器:一个来自NLTK,另一个来自scikit-learn.我正在处理一个多类分类问题(3个类:正(1),负(-1)和中性(0)).

在不执行任何特征选择的情况下(即,使用所有可用功能),并使用70,000个实例的训练数据集(噪声标记,实例分布为17%为正,4%为负,78%为中性),我训练了两个分类器,第一个是nltk.NaiveBayesClassifier,第二个是sklearn.naive_bayes.MultinomialNB(带fit_prior=True).

训练结束后,我在30,000个实例的测试集上评估了分类器,得到了以下结果:

**NLTK's NaiveBayes**
accuracy: 0.568740
class: 1
     precision: 0.331229
     recall: 0.331565
     F-Measure: 0.331355
class: -1
     precision: 0.079253 
     recall: 0.446331 
     F-Measure: 0.134596 
class: 0
     precision: 0.849842 
     recall: 0.628126 
     F-Measure: 0.722347 


**Scikit's MultinomialNB (with fit_prior=True)**
accuracy: 0.834670
class: 1
     precision: 0.400247
     recall: 0.125359
     F-Measure: 0.190917
class: -1
     precision: 0.330836
     recall: 0.012441
     F-Measure: 0.023939
class: 0
     precision: 0.852997
     recall: 0.973406
     F-Measure: 0.909191

**Scikit's MultinomialNB (with fit_prior=False)**
accuracy: 0.834680
class: 1
     precision: 0.400380
     recall: 0.125361
     F-Measure: 0.190934
class: -1
     precision: 0.330836
     recall: 0.012441
     F-Measure: 0.023939
class: 0
     precision: 0.852998
     recall: 0.973418
     F-Measure: 0.909197
Run Code Online (Sandbox Code Playgroud)

我注意到虽然Scikit的分类器具有更好的整体准确性和精确度,但与NLTK相比,它的召回率非常低,至少在我的数据方面.考虑到它们可能(几乎)是相同的分类器,这不是很奇怪吗?

Dan*_*ler 5

朴素贝叶斯分类器通常是指基于假定独立的二元特征的贝叶斯分类器。这就是NLTK 的朴素贝叶斯分类器所实现的。对应的scikit分类器是BernoulliNB分类器。

对布尔值特征的限制实际上并不是必需的,它只是最简单的实现方式。可以为来自任何参数分布的(假设的)独立特征定义朴素贝叶斯分类器。

MultinomialNB适用于具有假定为多项分布的整数值输入特征的数据。

Sckit 还具有GaussianNB,用于假设为独立高斯分布的连续值特征。


Mar*_*ers 3

两个库中类权重的默认行为是否相同?稀有类别(-1)的精度差异看起来可能是原因......

  • 我的(可能是错误的)理解是 fit_prior=True 将使用实际的类权重,因此,例如,将所有负面示例(样本的 4%)分配给中性类只会导致准确率达到 -4%(这这就是它似乎正在做的事情)。尝试使用 fit_prior=False 运行它。 (2认同)