Scikit-learn:BernoulliNB,v0.10 vs v0.13:非常不同的结果

时间:2013-05-04 16:39:34

标签: machine-learning scikit-learn bayesian document-classification bernoulli-probability

这是this thread的后续内容,我使用GaussianNB分类器得到了错误的结果,结果是因为我在linux VM上使用了scikit-learn v0.10实验。我最终使用了伯努利和多项式NB分类器,但是当我(最终)在我的macbook上安装了scipy时,我抓到的scikit-learn版本是0.13,这是本文撰写时的最新版本。我现在遇到了一个新问题:

  • 在v0.10上,我对BernoulliNB的准确率超过了90% 我的一个功能集上的分类器,这是唯一值得注意的 我到目前为止已经有了改进。
  • 在v0.13上,使用完全相同的代码
  • 进入约67%

有谁知道版本之间发生了什么变化?我看了一下回购历史,但没有看到任何可以解释这种准确性变化的东西。由于我使用BernoulliNB v0.10获得了非常好的结果,我显然想要使用它们,但是我不愿意这样做而不需要对版本之间的冲突结果有更多的了解。

我已尝试设置(较新的)class_prior属性,但这并没有改变0.13的结果。

编辑:如果没有提出一个有效的例子(我会这样做的话),0.13的结果是偏重的,这不是我对贝叶斯分类器所期望的那样,并且让我相信虽然我还没有追踪它,但它可能是先前计算的类的回归。例如:

0.10:
T\P F   M
F   120 18
M   19  175

0.13:
T\P F   M
F   119 19
M   59  135

编辑2:

我手工完成了几个例子。 0.13版本肯定是正确的,0.10版本肯定不是,这是我怀疑和担心的。 0.10中的误差似乎是在先前计算的类中。 _count函数有问题,特别是在this line of the file上,类计数完全错误:与the 0.13 branch比较,忽略两个分支在不同位置拉入平滑因子。

我还要考虑更多,至于为什么拙劣的功能计数导致我的数据有如此好的表现,而我仍然有点不确定为什么设置类先验不起作用。也许这是对源文件中已经存在的男性偏见的惩罚?

编辑3:

我相信这正是它正在做的事情。 _count函数以及fit中的特征先验的计算不会使此参数生效,因此在predict中考虑class_priors时,不会使用它们在培训期间建立模型。不确定这是否是故意的 - 您是否想要忽略用于在测试时建立模型的先验?

1 个答案:

答案 0 :(得分:0)

为了总结我的结果,这个bug出现在伯努利NB分类器的0.10版本中,它在计算特征先验时偏向了类计数,并且显然偏向所得到的模型以产生优异的结果。我设法调整了它正在做的事情,并最终获得了0.13版(Correct)MultinomialNB的相同性能。