提问者:小点点

scikits learn和nltk:朴素贝叶斯分类器性能差异很大


我比较了两个朴素贝叶斯分类器:一个来自NLTK,一个来自Scikit学习。我正在处理一个多类分类问题(3类:正(1)、负(-1)和中性(0))。

在不执行任何特征选择(即使用所有可用特征)的情况下,并使用70000个实例的训练数据集(带噪标签,实例分布为17%正、4%负和78%中性),我训练了两个分类器,第一个是nltk。NaiveBayesClassifier,第二个是sklearn。天真的贝耶斯。多项式nb(具有fit\u prior=True)。

经过培训,我在30000个实例的测试集上评估了分类器,得到了以下结果:

**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

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


共2个答案

匿名用户

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

匿名用户

朴素贝叶斯分类器通常是指在假定为独立的二元特征上的贝叶斯分类器。这就是NLTK的朴素贝叶斯分类器实现的。相应的scikit分类器是BernoulliNB分类器。

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

MultinomialNB用于具有整数值输入特征的数据,这些输入特征假定是多项式分布的。

Sckit还具有GaussianNB,用于假定为理想高斯分布的连续值特征。