15

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

这个分类器需要实时运行并不断分析随机扔给它的文档。

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

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

我计划使用与实时情况相同比例的不平衡数据集来训练我的分类器,但我担心这可能会使朴素贝叶斯偏向负类并失去我对正类的回忆。

任何建议表示赞赏。

4

3 回答 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)。

我希望这对至少了解您面临的问题有所帮助。

于 2014-07-02T10:36:24.247 回答
3

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

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

但是,这种情况很可能是分类器不足以满足您的要求 - 在误报处于合理水平的情况下,您可能会错过太多好的案例。

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

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

  1. 假设您已经有了构建朴素贝叶斯分类器的工作流程,您可能需要考虑Boosting。通常,这些方法会训练几个较弱的分类器,从而产生更强的分类器。提升朴素贝叶斯分类器已被证明可以很好地工作,例如,请参见此处。最好的结果将通过一个相当大且干净的火车组来实现。
  2. 另一个实用且简单的解决方案(虽然不那么“漂亮”)是在现有分类器之后添加另一层,即具有阈值的简单二项式朴素贝叶斯分类器 - 本质上是一个“关键字”过滤器,它将仅输出为阳性文档至少包含来自给定字典的 n 个单词(您也可以允许多次计算某些单词)。根据您的问题域,可能可以手动构建这样的字典。经过一些试验和错误,我看到这种方法显着提高了误报率,而对误报率的影响很小。
于 2014-07-07T16:27:11.090 回答
2

我认为 gustavodidomenico 提出了一个很好的观点。您可以将朴素贝叶斯视为学习概率分布,在这种情况下属于主题的单词。所以训练数据的平衡很重要。如果您使用决策树,例如随机森林模型,您将学习分配规则(是的,其中涉及概率分布,我为挥手的解释道歉,但有时直觉会有所帮助)。在许多情况下,树比朴素贝叶斯更健壮,可以说是出于这个原因。

于 2014-07-02T06:22:24.423 回答