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



这是这个线程的后续,在那里我得到了错误的结果与GaussianNB分类器,这原来是因为我有scikit-learn v0.10在linux虚拟机上我正在做实验。我最终使用了Bernoulli和Multinomial 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:
TP F   M
F   120 18
M   19  175
0.13:
TP F   M
F   119 19
M   59  135
编辑2:

我手工完成了几个例子。0.13版本肯定是正确的,而0.10版本肯定是错误的,这是我既怀疑又担心的。0.10中的错误似乎出现在类先验计算中。_count函数有bug,特别是在文件的这一行,类计数完全错误:与0.13分支相比,忽略了两个分支在不同的地方拉入平滑因子。

我必须再考虑一下,为什么拙劣的特征计数会导致我的数据有如此好的性能,我仍然有点不确定为什么设置类先验不起作用。也许这是对源文件中已经存在的男性偏见的惩罚?

编辑3:

我相信这正是它正在做的。_count函数不考虑这个参数,因此fit内的特征先验的计算也不考虑这个参数,所以虽然predict内考虑了class_prior,但在训练时不使用它们来建立模型。不确定这是否是有意为之——您想要忽略用于在测试时构建模型的先验吗?

总结一下我的结果,这个错误出现在BernoulliNB分类器的0.10版本中,在计算特征先验时,它会扭曲类计数,显然会使结果模型产生更好的结果。我设法调整了这正在做的事情,并最终从0.13版本的(正确的)MultinomialNB获得了相同的性能。

相关内容

  • 没有找到相关文章