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

17
我正在使用scikit-learn多项式朴素贝叶斯分类器进行二元文本分类(分类器告诉我文档是否属于类别X)。我使用一个平衡的数据集来训练我的模型,并使用一个平衡的测试集进行测试,结果非常有前途。
这个分类器需要实时运行并不断随机分析文档。
然而,当我在生产环境中运行我的分类器时,误报率非常高,因此我最终得到的精度非常低。原因很简单:在实时场景中,分类器遇到的负样本要多得多(大约90%的时间),这与我用于测试和训练的理想平衡数据集不符。
在训练过程中是否有一种方法可以模拟这种实时情况,或者是否有任何技巧可以使用(包括对文档进行预处理以查看它们是否适合分类器)?
我打算使用一个不平衡的数据集来训练我的分类器,其比例与实时情况相同,但我担心这可能会使朴素贝叶斯偏向于负类并失去我在正类上的召回率。
感谢您的任何建议。

1
我认为你已经知道了问题和解决方案。你需要提供一个真实场景的抽样数据库。不过,你尝试过交叉验证技术吗? - gustavodidomenico
1
我认为所有的分类算法在一个不平衡的数据集中,即使使用平衡的训练抽样,也不会表现出色。不平衡的数据集是数据挖掘中常见的问题。我建议您寻找改善数据集的方法。然而,我相信使用基于决策树的算法,如Cart或J48,您将获得更好的结果。您试过吗? - gustavodidomenico
因为您可以评估决策树是否适用于您的实际情况。它比NB更易读(是的,有些人说他们可以阅读和解释NB模型),并且更容易理解平衡采样数据集的惩罚。 - gustavodidomenico
你试过tf-idf吗?对我来说,它似乎不太适用于这个问题。 - Mehraban
2
我也会在http://stats.stackexchange.com/上询问。 - Dominik Antal
显示剩余6条评论
3个回答

11
您遇到了高度不平衡分类的问题之一。我不同意那些认为朴素贝叶斯方法存在问题的说法,我将提供一份说明,希望能够说明问题所在。
想象一下,您的假阳性率为0.01,真阳性率为0.9。这意味着您的假阴性率为0.1,真阴性率为0.99。
想象一个理想化的测试场景,每个类别有100个测试用例。你会得到(预计)1个假阳性和90个真阳性。很棒!在你的正类上,精确度是90 /(90 + 1)!
现在想象负面例子比正面例子多1000倍。同样的100个正面例子,在测试中,但现在有1000000个负面例子。您现在仍然得到相同的90个真阳性,但(0.01 * 1000000)= 10000个假阳性。灾难!由于此原因,您的准确度现在几乎为零(90 /(90 + 10000))。
这里的重点是分类器的表现没有改变;假阳性和真阳性率保持不变,但平衡发生了变化,结果您的准确率指数下降了。
要对此采取措施更加困难。如果您的分数是可分离的,但阈值不正确,您应该查看基于后验概率的阈值的ROC曲线,并寻找您想要的表现。如果您的分数不能被分开,则尝试使用一堆不同的分类器,并查看是否可以得到其中一个分类器,其中它们是可分离的(逻辑回归几乎可以替代贝叶斯方法;但您可能需要尝试一些非线性分类器,如神经网络或非线性SVM,因为您经常会得到小类空间的非线性边界)。
要从平衡测试集中模拟此效果,您只需在列联表中将实例计数乘以适当的乘数即可(例如,如果负类是正类的10倍大小,则在测试中每个负实例都将使列联表中的计数增加10而不是1)。

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


3
正如@Ben Allison所说,你面临的问题基本上是分类器的准确性不够好 - 或者更具体地说:它的假阳性率对于它遇到的类分布来说太高了。
“教科书”解决方案确实是使用平衡的训练集来训练分类器,获得一个“好”的分类器,然后找到分类器性能曲线(例如ROC曲线)上最好平衡您的准确度要求的点;我假设在你的情况下,它会偏向较低的假阳性率和较高的假阴性率。
然而,情况可能是分类器对你的要求不够好 - 在假阳性水平合理的点上,你可能会错过太多好的案例。
其中一种解决方案当然是使用更多数据或尝试另一种类型的分类器;例如线性/逻辑回归或SVM,在文本分类中通常具有良好的性能。
话虽如此,情况可能是你出于某种原因更喜欢使用朴素贝叶斯(例如训练时间的限制、频繁添加新类别或预先存在的模型)。在这种情况下,我可以给出一些实际建议。
  1. 假设您已经有了构建朴素贝叶斯分类器的工作流程,您可能需要考虑Boosting。一般来说,这些方法会以某种方式训练多个较弱的分类器,从而产生一个更强的分类器。已经证明使用 Boosting 朴素贝叶斯分类器效果良好,例如在这里可以看到。最佳结果将在具有相当规模和干净的训练集的情况下实现。
  2. 另一个实用且简单的解决方案(尽管不太“漂亮”)是在现有分类器之后添加另一层,即具有阈值的简单二项式朴素贝叶斯分类器 - 实质上是一个“关键字”过滤器,仅输出包含给定词典中至少n个单词的文档作为正面结果(您还可以允许某些单词被计算多次)。根据您的问题领域,可能可以手动构建这样的词典。 经过一些试验,我发现这种方法显着改善了误报率,而对误拒率的影响则相对较小。

2

我认为gustavodidomenico提出了一个很好的观点。你可以将朴素贝叶斯看作是学习一个概率分布,即单词属于主题的概率分布。因此,训练数据的平衡很重要。如果使用决策树,例如随机森林模型,您将学习用于进行分配的规则(是的,这里涉及概率分布,我为手势解释道歉,但有时直觉有帮助)。在许多情况下,由于这个原因,决策树比朴素贝叶斯更加强大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接