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

Ero*_*rol 13 python classification machine-learning scikit-learn text-classification

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

该分类器需要实时运行并不断分析随机抛出的文档.

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

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

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

任何建议表示赞赏.

Ben*_*son 10

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

想象一下,你的假阳性率是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).

我希望至少能够理解你所面临的问题.