我正在使用Spark ML来优化一个多类别的朴素贝叶斯分类器。
我有大约300个类别,并且我对文本文档进行分类。训练集的平衡性足够好,每个类别大约有300个训练样本。
一切看起来都不错,分类器在未见过的文档上表现出可接受的精度。但我注意到,在对新文档进行分类时,分类器经常会为其中一个类别分配一个很高的概率(预测概率几乎等于1),而其他类别的概率则非常低(接近零)。
这可能是什么原因呢?
我想补充一点,在SPARK ML中,有一个叫做“原始预测”的东西,当我查看它时,我可以看到负数,但它们的数值大小或多或少是可比较的,因此即使是高概率的类别也有可比的原始预测分数,但我发现很难解释这些分数。
回答:
让我们从对朴素贝叶斯分类器的一个非常非正式的描述开始。如果C是一组所有类别,d是一个文档,xi是特征,朴素贝叶斯返回的是:
由于P(d)对所有类别都是相同的,我们可以简化为
其中
由于我们假设特征是条件独立的(这就是为什么它是“朴素”的),我们可以进一步简化(使用拉普拉斯修正以避免零值)为:
这个表达式的难题在于,在任何非平凡的情况下,它在数值上等于零。为了避免这个问题,我们使用以下属性:
并用以下条件替换初始条件:
这些是你得到的原始概率值。由于每个元素都是负数((0, 1]范围内值的对数),整个表达式也具有负值。正如你自己发现的,这些值被进一步归一化,使得最大值等于1,并除以归一化值的总和。
重要的是要注意,虽然你得到的值并不是严格的P(c|d),但它们保留了所有重要的属性。顺序和比率是完全相同的(忽略可能的数值问题)。如果没有其他类别获得接近1的预测,这意味着根据证据,这是一个非常强的预测。所以这实际上是你希望看到的现象。