这是对这个讨论的进一步探讨,在我使用GaussianNB分类器时得到了错误的结果,原因是我在进行实验的Linux虚拟机上安装的是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 MF 120 18M 19 1750.13:T\P F MF 119 19M 59 135
编辑2:
我手动处理了一些示例。0.13版本确实是正确的,而0.10版本确实不是,这正是我所怀疑和担心的。0.10版本中的错误似乎出现在类先验计算中。具体来说,_count
函数存在错误,在这个文件的这一行,类计数是错误的:与0.13分支进行比较,忽略两个分支在不同地方引入平滑因子的情况。
我需要进一步思考,为什么这些错误的特征计数在我数据上表现得如此好,我仍然不太确定为什么设置类先验不起作用。可能是它在惩罚源文档中已经存在的男性偏见?
编辑3:
我认为这正是它所做的。_count
函数,以及在fit
中计算特征先验的过程,并没有考虑这个参数,因此虽然在predict
中考虑了类先验,但在训练过程中构建模型时并未使用它们。不确定这是不是有意的 – 你希望在测试时忽略用于构建模型的先验吗?
回答:
总结我的结果,错误出现在BernoulliNB分类器的0.10版本中,它在计算特征先验时扭曲了类计数,并且显然使结果模型产生了优越的结果。我设法调整了这些做法的部分,最终从(正确)的MultinomialNB在0.13版本中获得了相当的性能。