在高度不平衡的环境中进行成本敏感型学习的建议


15

我有一个包含几百万行和约100列的数据集。我想检测数据集中大约1%的示例,它们属于一个普通类。我有一个最低限度的精度约束,但是由于成本非常不对称,所以我对任何特定的召回都不太热衷(只要我没有剩下10个正匹配项!)

在这种情况下,您会推荐哪些方法?(欢迎链接到论文,赞赏实现的链接)

Answers:


15

我发现,He and Garcia(2009)对班级不平衡问题的学习很有帮助。以下是一些绝对不全面的考虑事项:

基于数据的方法:

一个人可以低估多数派,也可以高估少数派。(Breiman指出,这在形式上等同于分配非统一的错误分类成本。)这可能会引起问题:抽样不足会导致学习者错过多数班的某些方面。过度采样会增加过度拟合的风险。

有“知情的欠采样”方法可以减少这些问题。EasyEnsemble就是其中之一,它可以独立地从多数类中采样几个子集,并通过将每个子集与所有少数类数据进行组合来进行多个分类。

SMOTE(合成少数族裔过采样技术)SMOTEBoost(将SMOTE与Boosting结合使用)通过在要素空间中建立最接近的邻居来创建少数类的合成实例。SMOTE在DMwR包中以R形式实现(Luis Torgo的书“使用R进行数据挖掘,通过案例研究进行学习”,CRC Press 2016)。

模型拟合方法

在损失函数中应用特定于类别的权重(少数情况下较大的权重)。

对于基于树的方法,可以像Cieslak等人所倡导的那样,将Hellinger距离用作节点杂质函数。“ Hellinger距离决策树是健壮且不倾斜的”此处为Weka代码。)

使用一个类别分类器,学习(取决于模型)一个类别的概率密度或边界,并将另一类别视为离群值。

当然,不要将准确性用作模型构建的指标。科恩的河童是一个合理的选择。

模型评估方法

如果您的模型返回了预测的概率或其他分数,请选择一个决策权衡点,以对错误进行适当的权衡(使用独立于训练和测试的数据集)。在R中,程序包OptimalCutpoints实现了许多算法,包括对成本敏感的算法,用于确定截止时间。


感谢您的详细答复。我试图采样不足,但失败了。这些模型显示出出色的样本内性能,但是测试集中仍然存在失衡(以及我最终将使用的真实数据),因此模型的OOS精度令人震惊。我也试着类特定的权重,但我的应用程序涉及一个容易量化的更高的假阳性比假阴性成本。至于一种分类器,我尝试拟合线性svm(非线性的svm太慢了),即使在样本中也具有0精度...
em70 2014年

1
我为你感到。如果您的绝大多数案例都是负面的,那么高精度就很难。我将使用特定于类的权重(例如与类中的案例比例成反比)进行学习,并保存特定于错误类型的权重来确定决策阈值。希望您将交叉验证与Cohen的kappa而不是准确性用于模型选择。我会在所有临界值处将校正数据中各类的概率密度以及边际精度和富集(精度/阳性病例的比例)可视化,以真正了解可用的权衡。
MattBagg

好答案,谢谢。我已经使用了与提到的EasyEnsemble类似的技术已有一段时间了,但是对此却有所怀疑(尽管在模拟数据上有明显的表现)。现在我知道这是有道理的。
ayorgo

5

我的理解是,这是机器学习社区中一个活跃的研究领域,没有很好的答案,但是潜在的解决方案越来越多。如果指定要考虑的特定算法,则可能会得到更好的答案。

如果您使用的是参数模型(逻辑回归),那么问题就不大了,您可以根据损失函数(从假阴性到假阳性的成本)改变阈值

如果您使用的是机器学习算法,这可能会比较棘手。Max Kuhn在“应用预测模型”的第16章中做了总结。但是要总结的挑战性话题。如果您不想买这本书,则可以在本章的AppliedPredictiveModeling软件包中找到R代码,根据您对R和所使用的算法的熟悉程度,R代码可能就足够了。

通常,讨论围绕欠采样/过采样+/-成本敏感算法进行。也可以使用类似jous-boost的变体。
此类讨论的一个示例:Chen等“使用随机森林学习不平衡数据” http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf


改变阈值的问题在于,就像改变回归模型的截距一样。实际上,我可能想更改权重向量以考虑成本。但是如果这样做,考虑到已经严重的不平衡,我最终的精度为0!如果有希望,我还没有确定任何算法,也没有资源来实施前沿研究思路。我将看一看您建议的书。
em70

本章是马马虎虎。扎实的工作,但很难总结。关于各种方法的大量不受支持的声明。从机器学习的角度来看,我确实认为随机森林中的分层欠采样是一个好的开始。代码在本书的包装中。
查尔斯

0

您可以看一下scikit-learn的实现。注意class_ weight参数,该参数可以具有类权重或'auto'的字典的值:

sklearn.svm.SVC类(C = 1.0,kernel ='rbf',degree = 3,gamma = 0.0,coef0 = 0.0,收缩= True,概率= False,tol = 0.001,cache_size = 200,class_weight = None,详细= False,max_iter = -1,random_state =无)

您可以使用class_weight参数的值播放,该参数可以是类权重字典或'auto'。在“自动”模式下,学习算法将根据每个类别中的样本数量自动为每个类别分配权重。

scikit-learn还有其他几种分类算法,其中一些接受类权重。


您能否更多地谈谈如何使用班级权重来实现OP的目标?我认为这在您的帖子中是隐含的,但这还不是答案。
gung-恢复莫妮卡

是的,如果有人查看文档,class_weight参数的值可以为“ auto”,也可以具有包含类权重的字典值。在“自动”的情况下,学习算法本身会根据每个类别中样本的数量找到每个类别的权重。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.