1

这是该线程的后续内容,在那里我使用 GaussianNB 分类器得到了错误的结果,结果证明这是因为我在我正在做实验的 linux VM 上安装了 scikit-learn v0.10。我最终改用了 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:
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函数存在错误,特别是在文件的这一行,类计数完全错误:与0.13 分支相比,忽略了两个分支在不同位置引入了平滑因子。

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

编辑3:

我相信这正是它正在做的事情。该_count函数,以及因此在 内的特征先验的计算fit,不会使该参数生效,因此虽然在 内考虑了 class_priors predict,但它们不用于在训练期间构建模型。不确定这是否是故意的——你想在测试时忽略用于构建模型的先验吗?

4

1 回答 1

0

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

于 2013-05-08T19:58:07.260 回答