原文:https://neptune.ai/blog/how-to-deal-with-imbalanced-classification-and-regression-data
(原文有好多有意思的图)
数据不平衡是在处理真实数据经常会遇到的问题,然而大多数的机器学习算法都是假设数据类别是均匀分布的。同样的,对于回归问题也存在数据分布不平衡的问题。
目前主要有3种从不平衡数据中学习的方法,分别是:
- 数据方法
- 算法方法
- 混合(集成)方法
1. 不平衡的分类数据
在现实场景中,一些很少见的情景反而是更加重要的,比如残次品检测。
1.1 数据方法
主要致力于改变类别的数据分布,让分布变得平衡,包括:
- 过采样(Oversamling)
- 欠采样(Undersampling)
过采样是从少数类别里生成新的样本出来,最常用的数据增强方法是 Synthetic Minority Oversampling Technique(SMOTE )。
SMOTE原理如下:随机选择一个少数类别的样本a,并找到K个最近的少数类别的邻居样本,随机选择一个b,然后在特征空间中连接ab两个样本的线上随机选择一个点,合成一个新的样本。将合成的新样本加入训练集,会让数据分布更加平衡,提高模型泛化性。
SMOTE的优点是它可以改善随即采样的过拟合,不会丢失信息,并且方法简单。
缺点是在生成新样本的时候不会考虑距离较近的其他类别的样本,可能会导致类别的重叠,以及引入噪声。SMOTE也不能用于处理高维数据 。
图片来自:https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/
欠采样 是将多数类别的样本数量减少到与少数样本匹配。
通常的做法有:
- 随机采样:简单粗暴有奇效
- NearMiss:为选择样本增加一些规则,具体可以看这里。
欠采样的优点是可以很好的分类少数样本,用于训练的数据样本更少,也意味着运行时间更短。
缺点是去掉占多数的样本可能会导致大量样本丢失,欠采样得到的数据可能无法代表整个分布,可能会导致在实际数据上性能不佳。
SMOTE 和欠采样结合起来比单纯使用欠采样效果更好。
1.2 算法方法
最常用的方法是加权学习,使用 Focal loss,对少数类分配更高的权重,而多数类分配更低的权重,让模型更加关注数量较少的类。
另一个解决思路是 one-class classification(OCC), 顾名思义,只关注一组对象。OCC可以用于异常检测,让模型拟合大多数正例,然后判断新数据是否属于多数类,如果不是(或者概率很低),就说明是异常值。
1.3 混合方法
上面的方法都可以一起用,利用数据的方法来平衡数据分布,然后训练一个分类器集成。(图片来源 )
2. 不平衡的回归数据
分类和回归问题的区别在于,分类的标签是离散的,而回归的标签是连续的。一个现实生活中的例子是天气的预测。
2.1 数据方法
有两个由处理不平衡分类数据而来的方法:
- SMOTER
- SMOGN
SMOTER是SMOTE算法的回归版本。
它的原理是根据原始标签的密度来划分多数区域和少数区域,然后根据自己定义的过采样和欠采样百分比来进行采样。
在对少数区域进行过采样时,会使用插值的方法生成新的样本。生成新样本的方法是,在少数区域里选择一个样本,然后在它的K近邻里随机选择第二个,新生成的样本特征是这两个样本特征的加权平均。
SMOGN在SMOTER之后,在过采样时加入了高斯噪声。其原理是在过采样阶段,如果随机选择的样本和它的被选中的那个K近邻距离比较近,就使用SMOTER的方法生成新的样本,如果这两个样本距离较远,则使用高斯噪声。