朴素贝叶斯:不平衡的测试数据集

时间:2014-06-23 13:25:27

标签: python machine-learning classification scikit-learn text-classification

我正在使用scikit-learn Multinomial Naive Bayes分类器进行二进制文本分类(分类器告诉我文档是否属于X类)。我使用平衡数据集训练我的模型和平衡测试集来测试它,结果很有希望。

这个分类器需要实时运行并不断分析随机抛出的文件。

然而,当我在生产中运行我的分类器时,误报的数量非常高,因此我的精度非常低。原因很简单:在实时场景中(大约90%的时间),分类器会遇到更多负面样本,这与我用于测试和训练的理想平衡数据集不对应。

有没有办法可以在训练期间模拟这个实时案例,或者是否有任何我可以使用的技巧(包括对文档进行预处理以查看它们是否适合分类)?

我计划使用不平衡的数据集来训练我的分类器,其比例与我在实时案例中的比例相同,但我担心这可能会使朴素贝叶斯偏向负面阶级而失去对正面课程的回忆。

任何建议表示赞赏。

3 个答案:

答案 0 :(得分:10)

您遇到了一个高度不平衡的类分布的分类问题。我不同意那些用Naive Bayes方法说明问题的人,我将提供一个解释,希望能够说明问题所在。

想象一下你的假阳性率是0.01,你的真阳性率是0.9。这意味着您的假阴性率为0.1,您的真实阴性率为0.99。

想象一个理想化的测试场景,每个类有100个测试用例。你会得到(预期)1个假阳性和90个真阳性。大!正面课程的精确度为90 /(90 + 1)!

现在假设负面例子多于正面1000倍。测试中有100个正面例子,但现在有100万个负面例子。您现在获得相同的90个真阳性,但是(0.01 * 1000000)= 10000个误报。灾害!您的精度现在几乎为零(90 /(90 + 10000))。

这里的要点是分类器的性能没有改变;假阳性和真阳性率保持不变,但平衡发生了变化,因此您的精确数字下降了。

如何处理它更难。如果您的分数是可分的但阈值是错误的,您应该根据后验概率查看阈值的ROC曲线,并查看是否有某个地方可以获得您想要的性能。如果你的分数不可分,那么试试一堆不同的分类器,看看你是否可以得到它们(逻辑回归几乎是Naive Bayes的替代品;你可能想要试验一些非线性分类器,然而,就像神经网络或非线性SVM一样,因为你经常会得到描绘非常小的类空间的非线性边界。)

要从平衡测试集模拟此效果,您可以简单地将实例计数乘以列联表中的适当乘数(例如,如果您的负类是正数的10倍,则在测试中添加每个负实例10计入列联表而不是1)。

我希望至少能帮助你理解你所面临的问题。

答案 1 :(得分:3)

正如@Ben Allison所说,你面临的问题基本上是你的分类器的准确性不够好 - 或者更具体地说:它的误报率对于它所包含的类别分布来说太高了。

“教科书”解决方案确实是使用平衡训练集训练分类器,获得“好”分类器,然后在分类器的性能曲线上找到一个点(例如ROC曲线),这在您的精度要求之间达到最佳平衡;我认为在你的情况下,它会偏向于较低的假阳性率和较高的假阴性率。

然而,情况很可能是分类器对你的要求不够好 - 在误报处于合理水平的时候,你可能会遗漏太多好的案例。

当然,一种解决方案是使用更多数据,或尝试其他类型的分类器;例如线性/逻辑回归或SVM,通常在文本分类中具有良好的性能。

话虽如此,情况可能是因为某些原因(例如对列车时间的限制,频繁添加新类或预先存在的模型),您更喜欢使用朴素贝叶斯。在这种情况下,我可以就可以做些什么提供一些实用的建议。

  1. 假设您已经拥有构建朴素贝叶斯分类器的工作流程,您可能需要考虑Boosting。通常,这些方法将以一种更强的分类器产生的方式训练几个较弱的分类器。提升朴素贝叶斯分类器已被证明可以很好地工作,例如见here。使用相当大的干净列车可以获得最佳效果。
  2. 另一个实用且简单的解决方案(虽然不那么“漂亮”)将是在现有分类器之后添加另一个层,具有阈值的简单二项式朴素贝叶斯分类器 - 实质上是“关键字”过滤器,它将输出为肯定只有包含给定字典中至少n个单词的文档(您还可以允许对某些单词进行多次计数)。根据您的问题域,可以手动构建这样的字典。 经过一些反复试验,我发现这种方法可以显着提高误报率,同时只会轻微地伤害假阴性。

答案 2 :(得分:2)

我认为gustavodidomenico提出了一个很好的观点。您可以将Naive Bayes视为学习概率分布,在这种情况下,属于主题的单词。因此,培训数据的平衡至关重要。如果您使用决策树,比如随机森林模型,您将学习进行分配的规则(是的,涉及概率分布,我为挥手解释道歉,但有时直觉有帮助)。在许多情况下,树木比Naive Bayes更强大,可以说是出于这个原因。