python - scikits学习和nltk : Naive Bayes classifier performance highly different

标签 python machine-learning nltk scikits scikit-learn

我正在比较两个朴素贝叶斯分类器:一个 from NLTK还有一个from 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

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

最佳答案

朴素贝叶斯分类器通常是指对假设独立的二元特征进行贝叶斯分类。这就是NLTK's Naive Bayes classifier实现。对应的scikit分类器为BernoulliNB分类器。

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

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

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

关于python - scikits学习和nltk : Naive Bayes classifier performance highly different,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10407266/

相关文章:

python - 从 OAuth2 注销 - Google App Engine/Python

scala - SparkML 设置交叉验证器的并行度

python-3.x - 使用预训练的gensim Word2vec嵌入以及keras中的数据集

python - NLTK:为什么 nltk 不能识别 stanford-ner 的 CLASSPATH 变量?

python - 当默认 pip 为 pip2 时,升级 pip3 的正确格式是什么?

python - 用数字列表拆分字符串

python,十六进制值转换为字符串/整数

algorithm - SystemML 决策树 - "NUMBER OF SAMPLES AT NODE 1.0 CANNOT BE REDUCED TO MATCH 10"

python - 如何在 wordnet 层次结构中使用 python nltk 查找两个同义词集之间的距离?

python - NLTK FreqDist,绘制归一化计数?