本篇文章记录在分类问题中如何有效地类别不平衡问题,主要当作自己的读书笔记,所以写得可能有些乱。。。
由于包imbalanced-learn(github地址)已经非常有效地实现了各种常见的处理类别不平衡问题的有效解决方法。因此,本文把侧重点放在了方法原理的介绍上,当然这些方法绝大部分都是在imbalanced-learn包中有实现的。
什么是类别不平衡问题?
类别不平衡(class-imbalance)就是指分类任务中不同类别的训练样例数目差别很大的情况。在现实的分类学习任务中,我们经常会遇到类别不平衡,以下是一些例子:
每年,约 2% 的信用卡账户是伪造的。(多数的欺诈检测领域是极其不平衡的)
针对某一病征的医学筛查通常涵盖了许多没有此病征的人,以检查出少数患者(例:美国的 HIV 感染率约为 0.4%)
每年,硬盘驱动器故障的发生率约为 1%
在线广告的转化率在 10^-3 到 10^-6 的范围区间内
工厂的产品缺陷率一般在 0.1% 左右
如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰。例如有998个反例,但是正例只有2个,那么学习方法只需要返回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度;然而这样的学习器往往没有价值,因为它不能预测出任何正例。
因此有必要了解类别不平衡性处理的基本方法。接下来,我们重点介绍常见的方法。
对训练集里的少数类进行“过采样”(oversampling),即增加一些少数类样本使得正、反例数目接近,然后再进行学习。即是过采样。
随机过抽样是增加少数类样本数量,可以事先设置多数类与少数类最终的数量比例,在保留多数类样本不变的情况下,根据比例随机复制少数类样本,在使用的过程中为了保证所有的少数类样本信息都会被包含,可以先完全复制一份全量的少数类样本,再随机复制少数样本使得满足数量比例,具体步骤如下:
S m i n S_{min} Smin中的总样本数增加了 |E|个新样本,且 S m i n − n e w S_{min-new} Smin−new的类分布均衡度进行了相应的调整,如此操作可以改变类分布平衡度从而达到所需水平。
缺点:
对于随机过采样,由于需要对少数类样本进行复制来扩大数据集,造成模型训练复杂度加大。另一方面也容易造成模型的过拟合问题,因为随机过采样是简单的对初始样本进行复制采样,这就使得学习器学得的规则过于具体化,不利于学习器的泛化性能,造成过拟合问题。
为了解决随机过采样中造成模型过拟合问题,又能保证实现数据集均衡的目的,出现了过采样法代表性的算法SMOTE和Borderline-SMOTE算法
SMOTE全称是Synthetic Minority Oversampling即合成少数类过采样技术。
SMOTE的主要思想是利用特征空间中少数类样本之间的相似性来建立人工数据,特别是,对于子集 S m i n ⊂ S S_{min}⊂ S Smin⊂S,对于每一个样本 x i ⊂ S m i n x_i\subset S_{min} xi⊂Smin使用 K K K-近邻法,其中 K K K-近邻被定义为考虑 S m i n S_{min} Smin中的 K K K个元素本身与 x i x_i xi的欧氏距离在 n n n维特征空间 X X X中表现为最小幅度值的样本。由于不是简单地复制少数类样本,因此可以在一定程度上避免分类器的过度拟合,实践证明此方法可以提高分类器的性能。算法流程如下:
下图即为算法的示意图:
缺点:
1)由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠的问题。
2)在SMOTE算法中,出现了过度泛化的问题,主要归结于产生合成样本的方法。特别是,SMOTE算法对于每个原少数类样本产生相同数量的合成数据样本,而没有考虑其邻近样本的分布特点,这就使得类间发生重复的可能性增大。
解释缺点2)的原因:结合前面所述的SMOTE算法的原理,SMOTE算法产生新的人工少数类样本过程中,只是简单的在同类近邻之间插值,并没有考虑少数类样本周围多数类样本的分布情况。如下图所示,绿色正号1、2分布在多数类样本周围,它们离多数类样本最近,这就导致它们有可能被划分成多数类样本。因此,SMOTE算法的样本生成机制存在一定的盲目性。
扩展阅读:
Chawla N V, Bowyer K W, Hall L O, et al. SMOTE: synthetic minority over-sampling technique[J]. Journal of artificial intelligence research, 2002, 16: 321-357.
这篇论文提出了SMOTE算法。
原始的SMOTE算法对所有的少数类样本都是一视同仁的,但实际建模过程中发现那些处于边界位置的样本更容易被错分,因此利用边界位置的样本信息产生新样本可以给模型带来更大的提升。Borderline-SMOTE便是将原始SMOTE算法和边界信息算法结合的算法。算法流程如下:
上面式子表明,只有最近邻样本集中多数类多于少数类的那些 x i x_{i} xi 才会被选中形成“危险集”(DANGER)。因此,DANGER集中的样本代表少数类样本的边界(最容易被错分的样本)。然后对DANGER集中使用SMOTE算法在边界附近产生人工合成少数类样本。
下图即为算法的示意图:
我们可以看出,如果 ∣ S i − K N N ∩ S m a j j ∣ = k \left| S_{i-KNN}\cap S_{majj} \right| = k ∣Si−KNN∩Smajj∣=k 。 即: x i x_{i} xi 的所有 k k k个最近邻样本都属于多类。如图所示的样本点C,我们就认为样本点C是噪声且它不能生成合成样本。
扩展阅读:
Han H, Wang W Y, Mao B H. Borderline-SMOTE: a new over-sampling method in imbalanced data sets learning[C]//International Conference on Intelligent Computing. Springer, Berlin, Heidelberg, 2005: 878-887.
这篇文章提出了Borderline-SMOTE算法。
直接对训练集中多数类样本进行“欠采样”(undersampling),即去除一些多数类中的样本使得正例、反例数目接近,然后再进行学习。即是欠采样。
随机欠采样顾名思义即从多数类 S m a j S_{maj} Smaj 中随机选择一些样样本组成样本集 E E E 。然后将样本集 E E E 从 S m a j S_{maj} Smaj 中移除。新的数据集 S n e w − m a j = S m a j − E S_{new-maj}=S_{maj}-E Snew−maj=Smaj−E 。
缺点:
随机欠采样方法通过改变多数类样本比例以达到修改样本分布的目的,从而使样本分布较为均衡,但是这也存在一些问题。对于随机欠采样,由于采样的样本集合要少于原来的样本集合,因此会造成一些信息缺失,即将多数类样本删除有可能会导致分类器丢失有关多数类的重要信息。
Informed欠抽样算法可以解决传统随机欠采样造成的数据信息丢失问题,且表现出较好的不均衡数据分类性能。其中有一些集成(ensemble)的想法,主要有两种方法,分别是EasyEnsemble算法和BalanceCascade算法。
它把数据划分为两部分,分别是多数类样本和少数类样本。算法流程如下:
1)从多数类中有放回的随机采样 n n n次,每次选取与少数类数目相近的样本个数,那么可以得到 n n n个样本集合记作 { S 1 m a j , S 2 m a j , . . . , S n m a j } \left\{ S_{1maj},S_{2maj},...,S_{nmaj} \right\} {S1maj,S2maj,...,Snmaj} 。
2)然后,将每一个多数类样本的子集与少数类样本合并并训练出一个模型,可以得到 n n n个模型。
3)最终将这些模型组合形成一个集成学习系统,最终的模型结果是这 n n n个模型的投票值。
可以看到,EasyEnsemble的想法是多次随机欠抽样,尽可能全面地涵盖所有信息,算法特点是利用boosting减小偏差(Adaboost)、bagging减小方差(集成分类器)。实际应用的时候可以尝试选用不同的分类器来提高分类的效果。
下图即为算法的示意图:
BalanceCascade算法基于Adaboost,将Adaboost作为基分类器,其核心思路是:
1)在每一轮训练时都使用多数类与少数类数量相等的训练集,训练出一个Adaboost基分类器。
2)然后使用该分类器对全体多数类进行预测,通过控制分类阈值来控制假正例率(False Positive Rate),将所有判断正确的类删除。
3)最后,进入下一轮迭代中,继续降低多数类数量。
算法流程如下:
扩展阅读:
Liu X Y, Wu J, Zhou Z H. Exploratory undersampling for class-imbalance learning[J]. IEEE Transactions on Systems, Man, and Cybernetics, Part B (Cybernetics), 2009, 39(2): 539-550.
这篇论文提出了两种欠采样的方法:EasyEnsemble和BalanceCascade。
目前为止我们使用的重采样方法几乎都是只针对某一类样本:对多数类样本欠采样,对少数类样本过采样。也有人提出将欠采样和过采样综合的方法,解决样本类别分布不平衡和过拟合问题,本部分介绍其中的SMOTE+Tomek Links和SMOTE+ENN。
定义:Tomek links被定义为相反类最近邻样本之间的一对连接。
符号约定:给定一个样本对 ( x i , x j ) \left(x_i,x_j\right) (xi,xj),其中 x i ∈ S m a j x_i \in S_{maj} xi∈Smaj, x j ∈ S m i n x_j \in S_{min} xj∈Smin,记 d ( x i , x j ) d\left(x_i,x_j\right) d(xi,xj)是样本 x i x_i xi和 x j x_j xj之间的距离
公式表示:如果不存在任何样本 x k x_k xk,使得 d ( x i , x k ) ≤ d ( x i , x j ) d\left( x_i,x_k \right) \le d\left( x_i,x_j \right) d(xi,xk)≤d(xi,xj),那么样本对 ( x i , x j ) (x_i,x_j) (xi,xj)被称为Tomek Links
使用这种方法,如果两个样本来自Tomek Links,那么他们中的一个样本要么是噪声要么它们都在两类的边界上。所以Tomek Links一般有两种用途:在欠采样中:将Tomek Links中属于是多数类的样本剔除;在数据清洗中,将Tomek Links中的两个样本都剔除。
SMOTE+Tomek Links方法的算法流程非常简单:
普通的SMOTE方法生成的少数类样本是通过线性插值得到的,在平衡类别分布的同时也扩张了少数类的样本空间,产生的问题是可能原本属于多数类样本的空间被少数类“入侵”,容易造成模型的过拟合。
Tomek Links对寻找的是那种噪声点或者边界点,可以很好地解决“入侵”的问题,下图红色加号为SMOTE产生的少数类样本,可以看到,红色样本“入侵”到原本属于多数类样本的空间,这种噪声数据问题可以通过Tomek Links很好地解决。
由于第一步SMOTE方法已经很好地平衡了类别分布,因此在使用Tomek Links对的时候考虑剔除所有的Tomek Links对。
SMOTE+ENN方法和SMOTE+Tomek Links方法的想法和过程都是很类似的:
LightGBM解决类不平衡的思路类似于代价敏感学习。
在LGBM的文档中,可以看到有两个参数来处理类别不平衡,分别是is_unbalance和scale_pos_weight 。
在上图中的介绍中,这2个参数只能选其一,不能同时选。这说明了什么呢?这2个参数肯定是起到了相同的作用。这2个参数的关系是什么呢?在issue中找到了答案:
if is_unbalance = true, weight of each positive sample / weight of each negative sample = (num_negative_sample / num_positive_sample) * scale_pos_weight_
如果我们设置is_unbalance为True的话,那么scale_pos_weight就是默认值1,那么:每一个正样本的权重/每一个负样本的权重就等于负样本的样本数/正样本的样本数。
如果我们设置scale_pos_weight的话,那么应该设置成number of negative samples / number of positive samples,因为在上图中已经写明了:scale_pos_weight代表的是正类的权重。这样也就和is_unbalance参数的意思对应上了。(注:很多人对于设置scale_pos_weight是懵逼的,我自己已经明确给出了答案,包括xgb也是一样的。)
那么这2个参数是如何来解决类别不平衡的呢?
很明显,可以看到,通过设置这两个参数,可以得到正样本和负样本的权重,样本的权重是什么意思呢?我们知道,在LGBM进行分裂的过程中,我们求出了样本的一阶导数和二阶导数,在此基础上,就会乘以样本的权重。
这里有一个issue涉及到了is_unbalance背后用的算法,方便读者进行更深入的了解。
LGBM对多分类的不平衡问题也进行了完美地处理。它设计了参数class weight。在文档中介绍如下:
PS: 我在翻看相关issue的时候,有一个题目是利用贝叶斯调参处理不平衡类问题的参数设置,很受启发,相关issue。
XGB相比于LGBM,只有一个涉及到不平衡类的参数scale_pos_weight。在官方文档上是这么介绍的:
可以看到,定义与LGBM是相同的,即:如果我们设置scale_pos_weight的话,那么应该设置成number of negative samples / number of positive samples。
官网的意思大致可理解如下:
(注意:LGBM的scale_pos_weight与XGB的scale_pos_weight的意义是一样的,也就是说,如果我们在LGB中使用了scale_pos_weight,那么得不到的概率也不再是真正的预测概率了)!
在第3点中,如果我们想真正预测概率,当然还有其它一些参数可以调整,比如:
那么问题来了,源码到底是怎么利用 scale_pos_weight 来平衡样本的呢,在Issues 给出了如下:
if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight
可以看出,增大了少数样本的权重。这一点与LGBM是一样的。
【1】imbalanced-learn
【2】Imblearn package study(不平衡数据处理之过采样、下采样、综合采样)
【3】分类中解决类别不平衡问题
【4】机器学习算法系列(17):非平衡数据处理
【5】xgboost 参数 scale_pos_weight 详解