Press "Enter" to skip to content

类别不平衡和过采样:正式介绍

让我们来探讨类别不平衡问题以及随机过采样等重新采样方法如何试图解决这个问题。

最近,我一直在使用Julia构建一个用于解决类别不平衡问题的程序包,名为Imbalance.jl。在构建该程序包时,我花了很多功夫阅读论文和查看实现,所以我想分享一下我对类别不平衡问题的一般了解,以及一些用于解决该问题的最流行算法。这包括Naive Random Oversampling、Random Oversampling Examples (ROSE)、random walk oversampling (RWO)、Synthetic Minority Oversampling Technique (SMOTE)、SMOTE-Nominal和SMOTE-Nominal Continuous等多种过采样方法,以及许多欠采样方法。在本文中,我们将正式定义类别不平衡问题,并讨论随机过采样作为一个有效解决方案。在后续的文章中,我们将考虑其他技术来合理地找到更多解决方案。

Photo by Artem Kniaz on Unsplash

类别不平衡问题

大多数(如果不是全部)机器学习算法都可以看作是一种经验风险最小化的形式,其中目标是找到参数θ,使某个损失函数L最小化:

类别不平衡和过采样:正式介绍 四海 第2张

例如,线性回归将L设为平方损失,逻辑回归将L设为交叉熵损失,支持向量机将L设为合页损失,自适应 boosting 将L设为指数损失。

基本假设是,如果f_θ的参数使其能够在数据集上最小化这个经验风险,而数据集可以被视为从总体中随机抽取的样本,则它应该足够接近我们寻找的目标函数f,而我们希望该模型在整个数据集和总体上最小化相同数量。

在K类的多类别设置中,我们可以将经验风险写为

类别不平衡和过采样:正式介绍 四海 第3张

当某些类别的示例比其他类别少得多时,就会出现类别不平衡。在这种情况下,与这些类别相对应的项对总和的贡献很小,使得任何学习算法都有可能找到一个近似解,该解主要只是在重要总和上最小化了经验风险。这产生了一个假设f_θ,它可能与真正的目标函数f相比,在关键类别方面存在很大差异,而这些类别可能对于所讨论的应用程序非常重要。

综上所述,以下情况下我们存在类别不平衡问题:

1 – 训练集中的数据点在各个类别之间的分布“不公平”,某些类别的数据点远远少于其他类别。

2 – 模型在训练后对属于这些少数类别的数据点的性能不佳。也就是说,学习算法对于这些少数类别并没有适当地最小化损失,如上所述。

该问题的严重程度取决于这些少数类别对于应用程序有多重要。通常情况下,它们比多数类别更重要(例如,识别欺诈交易或罕见疾病)。

解决类别不平衡问题

从问题的描述中可以明显看出,一个解决方法是对较小的总和(即属于少数类别的总和)进行加权,使得学习算法更容易避免利用它们的微不足道。在特定于某个损失函数的情况下,修改机器学习算法以达到这个目的通常是相当容易的。

另一种试图解决问题而不需要对学习算法进行任何修改的方法是对数据进行重新采样。在其最简单的形式下,它可以被视为等同于分配权重的成本敏感方法。考虑以下算法:

给定:一个不平衡的数据集,带有K个类别和每个类别的整数目标:创建一个数据集,每个类别的数据根据整数进行复制操作:对于类别k中的每个数据点,重复c次,其中c是该类别相关联的整数

通过将其代入求和公式可以明显看出,这等价于成本敏感方法;记住,将一个函数最小化等价于将其乘以一个正的标量倍数。

随机过采样

上述算法存在一个小问题;如果类别A有900个示例,类别B有600个示例,那么我们无法使用整数倍来过采样类别B以达到完全平衡的数据集。我们可以通过随机选择要复制的数据点来扩展算法以处理不是整数的复制比率。例如,如果我们想要对B类别进行300个示例的过采样,使系统达到平衡(相当于一个比率为1.5),我们可以这样做…

1-随机选择B类别中的300个数据点2-复制这些数据点

这个算法称为简单随机过采样,它的正式作用是:

1-计算每个类别所需生成的数据个数(从某些给定的比率计算)2-假设对于k类别,该数字是N_k,然后从属于该类别的数据点中随机选择N_k个点(带替换),然后将它们添加到形成新的数据集中

明显可以看出,这就是平均等价于上述算法和类别加权的方法。如果类别k的比率为2.0,那么平均每个点将被随机选择一次。

下面是我为三个类别(0、1、2)生成的随机不平衡数据集,显示了类别的柱状图以及过采样前后的散点图。

Figure by the Author

请注意,在底部的两个图中没有视觉差异,因为所有生成的点都是现有点的副本。

为什么过采样?

到目前为止,您可能尚未确信重新采样比类别加权更突出解决类别不平衡问题;毕竟,我们已经展示了简单随机过采样平均上等价于类别加权,但训练时间更长(由于增加的数据量)。这个论点的唯一缺陷在于,通常不可能使用类别加权;特别是,如果机器学习模型没有明确优化损失。

如果我们通过在数据集中收集更多数据而不是重复已有的数据点,对每个类别进行添加,那么我们肯定会获得比简单随机过采样(或类别加权)更好的结果。例如,假设…

  • 我们想要检测交易是否为欺诈
  • 我们已经收集了1K个欺诈交易和999K个有效交易的数据集

很明显,通过收集另外998K个欺诈交易来解决不平衡问题比重复现有1K个交易997K次要好得多。特别是,在后一种情况下,我们面临过度拟合特定数据的高风险。

很明显,通常来说无法为少数类别收集更多数据,但可以模拟这样做的效果。也许,如果我们为少数类别合成生成足够代表真实新示例的数据,那么理想情况下,这比重复示例或类别加权要好得多。这是最常见的过采样形式,它与收集真实数据的关联可能是它为什么能够超越随机过采样和类别加权的最合理解释,因此是解决类别不平衡问题的一种可行方法。

欠采样

最后请注意,如果我们选择从多数类别中随机删除数据点,而不是随机选择少数类别中的数据点进行复制,那么该算法就变成了简单随机欠采样。显然,这有丢失有用数据的缺点,但有时候从“不太有用”的多数类别中消除数据可以解决不平衡问题,并对“更加有用”的少数类别的性能产生显著提高。还有其他欠采样方法,更仔细地选择要排除的数据点,以保持数据的结构或允许更好的决策边界。

更多故事中,我们解释了最初在Imbalance.jl中实现的所有算法以及它们如何解决类别不平衡问题。

Leave a Reply

Your email address will not be published. Required fields are marked *