这是该线程的后续内容,在那里我使用 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
,但它们不用于在训练期间构建模型。不确定这是否是故意的——你想在测试时忽略用于构建模型的先验吗?