【问题标题】:Scikit-learn: BernoulliNB, v0.10 vs v0.13: very different resultsScikit-learn:BernoulliNB,v0.10 与 v0.13:非常不同的结果
【发布时间】:2013-04-28 21:36:42
【问题描述】:

这是this thread 的后续行动,在那里我使用 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 函数存在错误,特别是在 this line of the file 上,类计数完全错误:与 the 0.13 branch 比较,忽略两个分支在不同位置拉入平滑因子。

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

编辑 3:

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

【问题讨论】:

  • 能否请您提供一个简约的复制脚本 + 展示回归的数据?
  • @ogrisel:我当然可以尝试,但需要一些工作来获取代码和测试数据,以便我可以在当前框架之外重现回归。到目前为止,这将比我承认的调试问题所付出的更多的努力,所以我会看看我能把什么放在一起,然后根据时间框架更新帖子或重新发布,如果没有人知道版本之间的预期行为变化

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 2017-02-02
    • 2019-01-26
    • 1970-01-01
    • 2021-04-25
    • 2018-09-02
    • 2020-09-06
    • 2013-09-04
    • 2013-02-02
    相关资源
    最近更新 更多