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

机器算法验证 机器学习 分类 不平衡类 精确召回
2022-02-09 21:44:19

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

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

3个回答

我发现He 和 Garcia (2009)对学习不平衡的班级问题很有帮助。这里有一些绝对不全面的事情需要考虑:

基于数据的方法:

可以对多数类进行欠采样或对少数类进行过采样。(Breiman 指出,这在形式上等同于分配非均匀错误分类成本。)这可能会导致问题:欠采样会导致学习器错过多数类的某些方面;过采样会增加过拟合的风险。

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

SMOTE(合成少数过采样技术)SMOTEBoost(将 SMOTE 与提升相结合)通过在特征空间中创建最近邻来创建少数类的合成实例。SMOTE 在 R 中的 DMwR 包中实现(随附Luis Torgo 的书“Data Mining with R, learning with case studies”CRC Press 2016)。

模型拟合方法

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

对于基于树的方法,您可以使用Hellinger 距离作为节点杂质函数,正如Cieslak 等人所提倡的那样。“Hellinger 距离决策树是健壮的且对偏差不敏感”此处为 Weka 代码。)

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

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

模型评估方法

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

我的理解是,这是机器学习社区中一个活跃的研究领域,没有很好的答案,而是有大量且不断增长的潜在解决方案。如果您指定您正在考虑的特定算法,您可能会得到更好的答案。

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

如果您使用机器学习算法,这可能会更棘手。Max Kuhn 在“Applied Predictive Modeling”的第 16 章中做了一个公平的尝试来总结这个问题。但具有挑战性的主题来总结。如果你不想买这本书,本章的 AppliedPredictiveModeling 包中提供了 R 代码,根据你对 R 的熟悉程度和所使用的算法,这可能就足够了。

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

你可以看看 scikit-learn 的实现。注意 class_ weight 参数,它可以具有类权重字典或“自动”的值:

sklearn.svm.SVC 类(C=1.0,kernel='rbf',degree=3,gamma=0.0,coef0=0.0,shrinking=True,probability=False,tol=0.001,cache_size=200,class_weight=None,详细=假,max_iter=-1,随机状态=无)

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

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