SPARK ML,朴素贝叶斯分类器:一类的高概率预测

Posted

技术标签:

【中文标题】SPARK ML,朴素贝叶斯分类器:一类的高概率预测【英文标题】:SPARK ML, Naive Bayes classifier: high probability prediction for one class 【发布时间】:2016-03-22 19:24:37 【问题描述】:

我正在使用 Spark ML 优化朴素贝叶斯多类分类器。

我有大约 300 个类别,我正在对文本文档进行分类。 训练集足够平衡,每个类别大约有 300 个训练样例。

一切看起来都不错,分类器在未见过的文档上以可接受的精度工作。但是我注意到,在对新文档进行分类时,分类器通常会为其中一个类别分配高概率(预测概率几乎等于 1),而其他类别的概率非常低(接近于零) .

这可能是什么原因?

我想补充一点,在 SPARK ML 中有一种叫做“原始预测”的东西,当我查看它时,我可以看到负数,但它们或多或少具有可比性,因此即使是概率高的类别也有可比较的原始预测分数,但我在解释这个分数时发现了困难。

【问题讨论】:

从逻辑上讲,有两种类型的未见文档,一种是可能推断未见过的特征,在预测前的向量变换过程中会被移除,另一种是已经属于训练的特征放。那么你看不见的文件放在哪里呢? 它们适合第二种情况 eliasah。 您是否尝试分析整个训练集和每个班级之间的单词分布? 我的意思是我正在使用相同的特征提取方法,即 HashingTF win 5000 作为特征编号。 不,我没有分析整个训练集上的单词分布。 【参考方案1】:

让我们从朴素贝叶斯分类器的一个非常非正式的描述开始。如果 C 是所有类的集合,d 是文档,xi 是特征,则朴素贝叶斯返回:

由于 P(d) 对于所有类都是相同的,我们可以将其简化为

在哪里

由于我们假设特征是条件独立的(这就是它幼稚的原因),我们可以进一步简化(通过拉普拉斯校正避免零):

这个表达式的问题是,在任何不平凡的情况下,它在数值上都等于 0。为避免我们使用以下属性:

并将初始条件替换为:

这些是您作为原始概率获得的值。由于每个元素都是负数((0, 1] 中的值的对数),因此整个表达式也具有负值。正如您自己发现的这些值 are further normalized 所以最大值等于 1 并除以总和归一化值

请务必注意,虽然您获得的值并非严格意义上的 P(c|d),但它们保留了所有重要属性。顺序和比率完全相同(忽略可能的数字问题)相同。如果没有其他类别的预测接近 1,则意味着,鉴于证据,这是一个非常强的预测。所以它实际上是你想看到的。

【讨论】:

感谢@zero323 的详细回答。我从我的数据中注意到的是,当我们有大量类时(例如,在我的情况下,我有 ~300 个),日志的总和将导致大的负值(例如 -2081、-2092 等)和在这种情况下,我确实知道我们如何判断得分为 -2081 的班级比得分为 -2092 的班级更有可能,这两个得分对我来说已经足够接近了。在这种情况下,您提到的规范化公式似乎旨在支持一个班级并惩罚其余班级。正如您向我建议的那样,我可以实现自己的规范化功能。 这些值之间也存在巨大差异。 exp(-2081) 大约为 1e-904,而 exp(-2090) 接近 1e-908。 没错,我试图用一个例子来挑战你的答案,但我做不到。再次感谢

以上是关于SPARK ML,朴素贝叶斯分类器:一类的高概率预测的主要内容,如果未能解决你的问题,请参考以下文章

大数据:Spark mlib Naive bayes朴素贝叶斯分类之多元朴素贝叶斯源码分析

朴素贝叶斯分类器

手撕朴素贝叶斯分类器源码(Naive Bayesian)

Spark ML 朴素贝叶斯类值到概率索引映射

从朴素贝叶斯分类器到贝叶斯网络(下)

机器学习——朴素贝叶斯分类器