让我们正式定义类不平衡问题,然后直观地推导解决方案!
最近,我一直在使用Julia构建一个名为Imbalance.jl的包来解决类不平衡问题。在构建这个包的过程中,我花了很多功夫阅读论文和查看实现,我觉得分享我对类不平衡问题的一般了解以及一些常用的解决算法可能会有所帮助。这包括朴素的随机过采样、ROSE、SMOTE、SMOTE-Nominal和SMOTE-Nominal Continuous。在本文中,我们将重点讨论前两种算法。
在开始介绍算法之前,让我们首先正式了解类不平衡。
类不平衡问题
大多数(如果不是全部)机器学习算法都可以看作是经验风险最小化的形式,其目标是找到参数θ,使得某个损失函数L最小化:

例如,线性回归使用的是平方损失,逻辑回归使用的是交叉熵损失,支持向量机使用的是合页损失,自适应 Boosting 使用的是指数损失。
基本假设是,如果 f_θ 在数据集上最小化了这个经验风险,而数据集又可以看作是从总体随机抽样得到的,那么它应该足够接近我们寻求的目标函数 f,即我们寻求最小化相同数量但是在整个数据集和总体上的经验风险的模型。
在具有 K 个类别的多类别设置中,我们可以将经验风险写成:

当某些类别的样本比其他类别少得多时,就会出现类不平衡的情况。在这种情况下,相关的项对总和的贡献很小,这使得任何学习算法更容易找到仅仅最小化了重要总和的经验风险的近似解。这导致了一个假设 f_θ,它可能与真实目标函数 f 在少数类别方面非常不同,而这些少数类别可能是所讨论的应用中最重要的。
总之,以下是类不平衡问题存在的条件:
1 —— 训练集中的点在各个类别之间分布不“公平”,某些类别的点明显少于其他类别。
2 —— 模型在训练后对属于这种少数类别的点的表现不好。
这个问题的严重程度取决于这些少数类别对于应用的重要性。通常情况下,它们比多数类别更重要(例如,分类欺诈交易)。
解决类不平衡问题
从问题的描述中可以明显看出,一种解决方法是加权较小的总和(即属于少数类别的总和),以便学习算法更容易避免利用它们的不重要性的近似解。通常很容易修改机器学习算法以实现这个目的,特别是当它们明确是经验风险最小化的形式,而不仅仅是某个损失函数的等价形式时。
另一种试图解决问题的方法是对数据进行重新采样。在最简单的形式下,它可以看作是分配权重的成本敏感方法的等价形式。考虑以下算法
给定:一个具有 K 个类别的不平衡数据集和每个类别的一个整数要求:一个数据集,其中每个类别的数据根据该整数复制操作:将类别 k 中的每个点重复 c 次,其中 c 是相关联的整数
通过将其代入总和,很明显这等效于成本敏感方法;回想一下,最小化一个函数等价于最小化它的一个标量正倍数。
随机过采样
前面提到的算法存在一个小问题;如果类别A有900个示例,而类别B有600个示例,那么我们无法选择整数倍来对类别B进行过采样以使数据集平衡。我们可以通过随机选择要复制的点来扩展算法,以应对不是整数的复制比例。例如,如果我们想要对类别B进行300个示例的过采样,以使系统达到平衡(相当于1.5的比例),我们可以这样做…
1- 从类别B中随机选择300个点2- 复制这些点
这个算法被称为朴素随机过采样,它的正式操作如下:
1- 计算每个类别需要生成的点的数量(根据给定的比例计算)2- 假设对于类别X,该数量为Nx,然后从属于该类别的点中随机选择Nx个点,然后将它们添加到新的数据集中
显然,这与前面提到的算法以及类别加权平衡在平均意义上是等价的。如果类别X的比例为2.0,则平均每个点将被随机选择一次。
这是我生成的一个具有三个类别(0,1,2)的随机不平衡数据集,它显示了类别的直方图以及过采样前后的散点图。

请注意,底部的两个图形没有视觉上的区别,因为所有生成的点都是现有点的复制品。
最后请注意,如果我们在少数类别中随机选择要复制的示例,而在多数类别中随机选择要删除的点,则算法变成了朴素随机欠采样。这显然有丢失有用数据的劣势,但有时从“不太有用”的多数类别中消除数据可以解决不平衡问题,并对“更有用”的少数类别的性能产生更好的影响。在本文和下一篇文章中,我们将重点关注过采样方法。
随机过采样示例
如果我们通过收集更多的数据来自然地为每个类别添加点,那么相对于朴素随机过采样,我们将获得更好的结果是有道理的。例如,假设…
- 我们想要检测交易是否为欺诈
- 我们已经收集了1K个欺诈交易和999K个有效交易的数据集
很明显,通过收集另外998K个欺诈交易来解决不平衡问题远远优于将现有的1K个欺诈交易重复997K次。特别是在后一种情况下,我们面临着对特定数据过拟合的高风险。
显然,通常不可能为少数类别收集更多的数据;然而,这就揭示了我们可以通过重复示例来做得比朴素过采样更好的事情。我们知道,我们收集的任何额外数据都遵循属于少数类别的基础数据的概率分布,因此我们可以通过近似这个概率分布并从中进行采样来模拟收集真实示例。这就是随机过采样示例(ROSE)算法的原理。
那么,ROSE尝试估计每个类别X的概率分布P(x|y=k),然后从中抽取所需的Nx个样本。众所周知,估计这样的密度的一种方法是通过核密度估计来实现的,你可以从更粗糙的版本(如直方图分析)开始推导或直观理解。以下描述了KDE:
给定:数据点x 想要:对P(x)的估计操作:选择一个核函数K(x),然后估计P(x)为

通常,我们希望能够控制核函数的尺度,因为它会影响P(x),所以在更一般的情况下,我们有

本质上,它的作用是在每个点上放置核函数,然后对它们进行求和和归一化,使其总和为1。

核函数本身的选择是一个超参数;也许,它已经被证明不是很重要,只要它满足基本性质,如平滑和对称性。一个简单的高斯函数,其中σ是尺度,是一个常见的选择,也是ROSE用于其KDE的选择。

ROSE通过执行以下操作从这个分布中采样Nx个点:
- 随机选择一个点
- 在该点上放置高斯函数
- 从高斯函数中采样
这就像随机过采样一样,只是在随机选择一个点之后,它在该点上放置一个高斯函数,并从高斯函数中采样以生成新的点,而不是重复选择的点。
在这种情况下,ROSE使用一个称为Silverman的经验法则设置带宽h(或更一般地,在高维情况下是平滑矩阵,它是正态分布中的协方差矩阵参数),以使均方误差最小化。特别地,

其中D_σ是每个特征的标准差的对角矩阵,d是特征的数量,N是点的数量。
在Imbalance.jl软件包中,这个值乘以另一个常数s,以允许对超参数进行可选控制。对于s=1,它保持与论文中的结果相同,对于s=0,ROSE等效于随机过采样。使用该软件包生成的下面的动画演示了增加s对生成的点的影响。

请注意,原始点不会移动,并且随着我们增加s的值,由于每个随机选择的原始点生成的合成点与之相距越来越远。
希望这个故事能让您了解到机器学习中的类别不平衡问题以及如何解决它。让我们在下一个故事中考虑SMOTE论文中提出的算法。
参考:[1] G Menardi, N. Torelli,“使用不平衡数据训练和评估分类规则”,数据挖掘与知识发现,28(1),pp.92–122,2014年。