我正在比较两个朴素贝叶斯分类器:一个from NLTK和一个from scikit-learn。我处理多类分类问题(3类:正(1),负(-1)和中性(0))。
不执行任何特征选择(即使用所有可用功能),并使用70,000个实例的训练数据集(噪声标记,实例分布为17%为正,4%为负,78%为中性),I训练两个分类器,第一个是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
我注意到虽然Scikit的分类器具有更好的整体准确性和精确度,但与NLTK相比,它的召回率非常低,至少对我的数据而言。考虑到它们可能(几乎)是相同的分类器,这不是很奇怪吗?
答案 0 :(得分:3)
两个库中类权重的默认行为是否相同?稀有类(-1)的精度差异看起来可能是原因......
答案 1 :(得分:2)
朴素贝叶斯分类器通常意味着假定独立的二元特征的贝叶斯分类器。这是NLTK's Naive Bayes classifier实现的。相应的scikit分类器是BernoulliNB分类器。
对布尔值特征的限制实际上并不是必需的, 它只是最简单的实现。 可以为任何参数分布的(假设的)独立特征定义朴素贝叶斯分类器。
MultinomialNB用于具有整数值输入要素的数据,假设这些数据是多项分布的。
对于连续值特征,Sckit也有GaussianNB,假设这些特征是高斯分布的。