2012-05-02 43 views
13

我比较两个朴素贝叶斯分类器:一个from NLTK和一个from scikit-learn。我正在处理多类分类问题(3类:正(1),负(-1)和中立(0))。如果不执行任何特征选择(即使用所有可用特征),并且使用70,000个实例(嘈杂标记的,实例分布为17%阳性,4%阴性和78%中性)的训练数据集,我训练两个分类器,第一个是nltk.NaiveBayesClassifier,第二个是sklearn.naive_bayes.MultinomialNB(与fit_prior=True)。scikits学习和nltk:朴素贝叶斯分类器性能高度不同

训练结束后,我评估了我的测试集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相比较低,至少在我的数据。考虑到它们可能(几乎)是相同的分类器,这不奇怪吗?

+0

有什么特点?你也尝试过'BernoulliNB'吗?这应该更接近NLTK朴素贝叶斯。 –

+0

感谢您的回复。如果文档中存在特征(布尔值),则这些特征是值为1的词。对于scikits BernoulliNB结果非常接近MultinomialNB:'精度:0.834680 类:1 \t精度:0.400380 \t回忆:0.125361 \t F-措施:0.190934 类:-1 \t精度:0.330836 \t回忆: 0.012441 \t F-措施:0.023939 类:0 \t精度:0.852998 \t回忆:0.973418 \t F-措施:0.909197' –

+4

我可以在documentat看到的唯一的事离子是NLTK的NB分类器显然不会平滑。我不希望这会导致很大的区别,尽管... –

回答

3

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

+0

NLTK中的朴素贝叶斯将事先标签概率考虑进去,(我认为)使用fit_prior时, =真实参数... –

+2

我的(可能是错误的)理解是,fit_prior = True将使用实际的类权重,例如,将所有否定示例(样本的4%)分配给中性类只会导致-4%的准确性命中这似乎是这样做的)。尝试使用fit_prior = False运行它。 –

+0

谢谢。我试着用fit_prior = False运行它,并且令人惊讶的是它给出了几乎相同的结果(我更新了主帖) –

2

朴素贝叶斯分类器通常意味着对假定为独立的二元特征的贝叶斯分类器。这是NLTK's Naive Bayes classifier实现的内容。相应的scikit分类器是BernoulliNB分类器。

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

MultinomialNB适用于假定为多项式分布的整数值输入要素的数据。

Sckit也有GaussianNB对连续值特征,假设独立高斯分布。