样本不均衡:正样本和负样本的数目相差很大。
在一个极度不平衡的样本中,由于机器学习会每个数据进行学习,那么多数数据样本带有的信息量比少数样本信息量大,会对分类器学习过程中造成困扰。假设正样本为少数类,负样本为多数类,一般而言,当正负样本比例超过1:3,分类器就已经会倾向于负样本的判断(表现在负样本Recall过高,而正样本 Recall 低,而整体的 Accuracy依然会有很好的表现)。在这种情况下,我们可以说这个分类器是失败的,因为它没法实现我们对少数类(正样本)的定位。
举例说明:“一个数据集一共有100个样本,分为A、B两种类型,A类别有95个,B类别有5个。”这就是典型的样本不均衡问题,对于机器学习分类算法来说,如果把全部的样本都归为A类,准确率( Accuracy)也可以达到95%,而这个准确率对于我们判别少数类来说是没有意义的,没有任何价值,这个分类器的决策很明显并非是我们想要的判定标准。
那么针对这种样本不均衡问题,应该如何解决呢?
一、上采样(过采样)和下采样(欠采样)
欠采样(undersampling)法是去除训练集内一些多数样本,使得两类数据量级接近,然后再正常进行学习。(数据量足够时使用此方法)
缺点:若随机丢弃样本,可能丢失多数类的重要信息。
改进的欠采样的代表算法是EasyEnsemble:利用集成学习机制,它将多数样本划分成若 N个集合,然后将划分过后的集合与少数样本组合,这样就形成了N个训练集合,而且每个训练结合都进行了欠采样,但从全局来看却没有信息丢失。
过采样(oversampling)/上采样是对训练集内的少数样本进行扩充,既增加少数样本使得两类数据数目接近,然后再进行学习。(数据量不足时使用此方法)
简单粗暴的方法是复制少数样本,缺点是虽然引入了额外的训练数据,但没有给少数类样本增加任何新的信息,非常容易造成过拟合。
过采样的代表算法是SMOTE(原始论文)和ADASYN(原始论文)
1、通过抽样方法在少数类样本中加入白噪声(比如高斯噪声)变成新样本一定程度上可以缓解这个问题。如年龄,原年龄=新年龄+random(0,1)
2、SMOTE算法:通过对少数样本进行插值来获取新样本,比如对于每个少数类样本a,从a最邻近的样本中选取样本b,然后在对ab 中随机选择一点作为新样本。
3、阈值移动。这类方法的中心思想不是对样本集和做再平衡设置,而是对算法的决策过程进行改进。 举个简单的例子,通常我们对预测结果进行分类时,当预测y(y 代表正类可能性) 值>0.5时,判定预测结果为正,反之为负。此时规定决策规则为:
4、ADASYN(自适应综合过采样算法):基本思想是根据学习难度的不同,对不同的少数类别的样本使用加权分布,比较容易学习的少数类样本,对于难以学习的少数类的样本,产生更多的综合数据。 因此,ADASYN方法通过两种方式改善了对数据分布的学习:(1)减少类不平衡引入的偏差,(2)将分类决策边界自适应地转移到困难的样本。
总结:采样算法容易实现,运行速度快,且效果也不错。欠采样和过采样这两种方法相比而言,都没有绝对的优势,这两种方法的应用取决于它适用的用例和数据集本身,过采样方法应用更广泛。
在欠采样、过采样中的小经验:
(1) 考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;
(2) 考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;
(3)使用过采样方法来解决不平衡问题时应适当地应用交叉验证。
这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
K-fold交叉验证就是把原始数据随机分成K个部分,在这K个部分中选择一个作为测试数据,剩余的K-1个作为训练数据。交叉验证的过程实际上是将实验重复做K次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均。
(4)考虑尝试随机采样与非随机采样两种采样方法;
(5)考虑对各类别尝试不同的采样比例,不一定是1:1,有时候1:1反而不好,因为与现实情况相差甚远;
(6)考虑同时使用过采样与欠采样,对二者进行结合。
二、通过正负样本的惩罚权重解决样本不均衡
通过正负样本的惩罚权重解决样本不均衡的问题的思想是在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量类别权重高,大样本量类别权重低),然后进行计算和建模。
使用这种方法时需要对样本本身做额外处理,只需在算法模型的参数中进行相应设置即可。很多模型和算法中都有基于类别参数的调整设置,以scikit-learn中的SVM为例,通过在class_weight : {dict, 'balanced'}中针对不同类别针对不同的权重,来手动指定不同类别的权重。如果使用其默认的方法balanced,那么SVM会将权重设置为与不同类别样本数量呈反比的权重来做自动均衡处理,计算公式为:n_samples / (n_classes * np.bincount(y))。
如果算法本身支持,这种思路是更加简单且高效的方法。
三、通过组合/集成方法解决样本不均衡
组合/集成方法指的是在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。
例如,在数据集中的正、负例的样本分别为100和10000条,比例为1:100。此时可以将负例样本(类别中的大量样本集)随机分为100份(当然也可以分更多),每份100条数据;然后每次形成训练集时使用所有的正样本(100条)和随机抽取的负样本(100条)形成新的数据集。如此反复可以得到100个训练集和对应的训练模型。
这种解决问题的思路类似于随机森林。在随机森林中,虽然每个小决策树的分类能力很弱,但是通过大量的“小树”组合形成的“森林”具有良好的模型预测能力。
如果计算资源充足,并且对于模型的时效性要求不高的话,这种方法比较合适。
四、尝试不同的分类算法
因为不同的算法适用于不同的任务与数据,应该使用不同的算法进行比较。决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。目前流行的决策树算法有:C4.5、C5.0、CART和Random Forest等。
五、从一个新的角度理解问题(一分类/聚类操作)
1、对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(one class learning) 或异常检测问题,这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,比较有代表性的是 one-class-SVM。
通常一分类问题出现在需要对训练样本进行一定比例的筛选,或者已知的训练样本都是正样本,而负样本却很少的情况。这种情况下,往往需要训练一个对于训练样本紧凑的分类边界,就可以通过负样本实验。一个简单的实际例子是:一个工厂对于产品的合格性进行检查时,往往所知道是合格产品的参数,而不合格的产品的参数要么空间比较大,要么知道的很少。这种情况下就可以通过已知的合格产品参数来训练一个一类分类器,得到一个紧凑的分类边界,超出这个边界就认为是不合格产品。再比如:人脸识别中我们不可能给所有的图片让机器去分类,事实上我们只能给出很多人脸的图像,让机器去学习识别。之后再来图像时,符合这些图像特征的就属于人脸,反之则不是。对比二分类,显著的区别就是,二分类不但能的出来这个图片不是人脸,他还能告诉你这个图片是猪脸。
对于一分类的问题可以参考知乎:什么是一类支持向量机?
2、对丰富类进行聚类操作,然后进行有监督学习。
首先,我们可以对具有大量样本的丰富类进行聚类操作。假设我们使用的方法是 K-Means聚类算法 。此时,我们可以选择K值为稀有类中的数据样本的个数,并将聚类后的中心点以及相应的聚类中心当做富类样本的代表样例,类标与富类类标一致。经过聚类操作,我们对富类训练样本进行了筛选,接下来我们就可以将相等样本数的K个正负样本进行有监督训练。
六、样本不均衡分类器的评价指标(假设正类为少数类,负类为多数类)
在一开始的例子中可以看出,准确度这个评价指标在类别不均衡的分类任务中并不适用,甚至进行误导。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。
对于样本不均衡的数据来说,需要用“召回率(Recall)”、“精确率(Precision)”和“综合评价指标(F-Mmeasure)”来评估模型。
当少数类的召回率、精确率和综合评价指标较高时,说明没有漏检,查的比较全且精确度比较高。
对于反例>>正例时,下采样预测模型会存在以下问题:Recall值虽然达到标准,但容易出现过检的情况,即将正品预测为次品,FP值过大,精确率低。而对于过采样来说,虽然Recall值略低于下采样,但能够有效降低过检出现的次数,既保证了召回率又保证了精确率。因此,建议使用过采样来训练模型。
关于召回率(Recall)、精确率(Precision)和综合评价指标(F-Mmeasure)可以参考:
本文参考资料:分类中常见的类别不平衡解决办法