内容目录
一、工作中数据不均衡问题二、数据不平衡解决方案1、数据不平衡解决方案一2、数据不平衡解决方案二3、数据不平衡解决方案三4、数据不平衡解决方案四5、数据不平衡解决方案五6、数据不平衡解决方案六7、数据不平衡解决方案七8、数据不平衡解决方案八三、如何选择采样方式原文见公众号:python宝
一、工作中数据不均衡问题
在实际工作中,数据往往分布得非常不均匀,也就是会出现“长尾现象”,即:绝大多数的数据在一个范围/属于一个类别,而在另外一个范围或者另外一个类别中,只有很少的一部分数据。那么这个时候直接使用机器学习可能效果会不太好,所以这个时候需要我们进行一系列的转换操作。
实际怎么去解决数据不平衡呢?
上采样、下采样、SMOTE算法。
实际解决的效果如何?
有一点点改进,但不是很大。
事实上确实如此,很多时候即使用了上述算法对采样的数据进行改进,但是结果反而可能更差。在业界中,对数据不均衡问题的处理确实是一件比较头疼的问题。最好的处理方法还是:尽可能去获得更多的那些类别比较少的数据。
二、数据不平衡解决方案
1、数据不平衡解决方案一
设置损失函数的权重,使得少数类别数据判断错误的损失大于多数类别数据判断错误的损失,即当我们的少数类别数据预测错误的时候,会产生一个比较大的损失值,从而导致模型参数往让少数类别数据预测准确的方向偏。可以通过scikit-learn中的class_weight参数来设置权重。
2、数据不平衡解决方案二
下采样/欠采样(under sampling):从多数类中随机抽取样本从而减少多数类别样本数据,使数据达到平衡的方式。
例:比如本来样本正负例的比例是100:1,一般使用下采样将数据比例控制到4:1就是极限了。如果强行将正负例的比例控制到1:1,会损失很多样本的特性,使得模型效果还不如100:1的训练结果。
集成下采样/欠采样:采用普通的下采样方式会导致信息丢失,所以一般采用集成学习和下采样结合的方式来解决这个问题;主要有两种方式:
1、EasyEnsemble
采用不放回的数据抽取方式抽取多数类别样本数据,然后将抽取出来的数据和少数类别数据组合训练一个模型;多次进行这样的操作,从而构建多个模型,然后使用多个模型共同决策/预测。
2、BalanceCascade
利用Boosting这种增量思想来训练模型;先通过下采样产生训练集,然后使用Adaboost算法训练一个分类器;然后使用该分类器多对所有的大众样本数据进行预测,并将预测正确的样本从大众样本数据中删除;重复迭代上述两个操作,直到大众样本数据量等于小众样本数据量。
3、数据不平衡解决方案三
Edited Nearest Neighbor(ENN):对于多数类别样本数据而言,如果这个样本的大部分k近邻样本都和自身类别不一样,那我们就将其删除,然后使用删除后的数据训练模型。
4、数据不平衡解决方案四
Repeated Edited Nearest Neighbor(RENN):对于多数类别样本数据而言,如果这个样本的大部分k近邻样本都和自身类别不一样,那我们就将其删除;
重复性的进行上述的删除操作,直到数据集无法再被删除后,使用此时的数据集据训练模型。
5、数据不平衡解决方案五
Tomek Link Removal:如果两个不同类别的样本,它们的最近邻都是对方,也就是A的最近邻是B,B的最近邻也是A,那么A、B就是Tomek Link。将所有Tomek Link中多数类别的样本删除。然后使用删除后的样本来训练模型。
6、数据不平衡解决方案六
过采样/上采样(Over Sampling):和欠采样采用同样的原理,通过抽样来增加少数样本的数目,从而达到数据平衡的目的。一种简单的方式就是通过有放回抽样,不断的从少数类别样本数据中抽取样本,然后使用抽取样本+原始数据组成训练数据集来训练模型;不过该方式比较容易导致过拟合一般抽样样本不要超过50%。
过采样/上采样(Over Sampling):因为在上采样过程中,是进行是随机有放回的抽样,所以最终模型中,数据其实是相当于存在一定的重复数据,为了防止这个重复数据导致的问题,我们可以加入一定的随机性,也就是说:在抽取数据后,对数据的各个维度可以进行随机的小范围变动,eg: (1,2,3) --> (1.01, 1.99, 3);通过该方式可以相对比较容易的降低上采样导致的过拟合问题。
7、数据不平衡解决方案七
采用数据合成的方式生成更多的样本,该方式在小数据集场景下具有比较成功的案例。常见算法是SMOTE算法,该算法利用小众样本在特征空间的相似性来生成新样本。
例:给少数样本编号,1~100;将1、2样本连起来,取他们的中点(期望),作为一个新的样本。以此类推,最后可以新生成50个样本。用这种算法一次可以提高50%的样本量。
8、数据不平衡解决方案八
对于正负样本极不平衡的情况下,其实可以换一种思路/角度来看待这个问题:可以将其看成一分类(One Class Learning)或者异常检测(Novelty Detection)问题,在这类算法应用中主要就是对于其中一个类别进行建模,然后对所有不属于这个类别特征的数据就认为是异常数据,经典算法包括:One Class SVM、IsolationForest等。
三、如何选择采样方式
解决数据不平衡问题的方法有很多,上面只是一些最常用的方法,而最常用的方法也有这么多种,如何根据实际问题选择合适的方法呢?
1、在正负样本都非常之少的情况下,应该采用数据合成的方式;
2、在负样本足够多,正样本非常之少且比例及其悬殊的情况下,应该考虑一分类方法;(一分类:对于 正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差 别,而是为其中一类进行建模,经典的工作包括One-class SVM等。说明:对于正负样本极不均 匀的问题,使用异常检测,或者一分类问题,也是一个思路。)
3、在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。
4、采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许上采样往往要比加权好一些。
5、另外,虽然上采样和下采样都可以使数据集变得平衡,并且在数据足够多的情况下等价,但两者也是有区别的。实际应用中,我的经验是如果计算资源足够且小众类样本足够多的情况下使用上采样,否则使用下采样,因为上采样会增加训练集的大小进而增加训练时间,同时小的训练集非常容易产生过拟合。
6、对于下采样,如果计算资源相对较多且有良好的并行环境,应该选择Ensemble方法。
一些经验法则:
1)考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;
2)考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;
3)考虑尝试随机采样与非随机采样两种采样方法;
4)考虑对各类别尝试不同的采样比例,比一定是1:1,有时候1:1反而不好,因为与现实 情况相差甚远;
5)考虑同时使用过采样与欠采样。
About Me:小婷儿
● 本文作者:小婷儿,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用
● 作者博客地址:https://blog.csdn.net/u010986753
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● 微信:tinghai87605025 联系我加微信群
● QQ:87605025
● QQ交流群py_data :483766429
● 公众号:python宝 或 DB宝
● 提供OCP、OCM和高可用最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
如果你觉得到文章对您有帮助,欢迎赞赏哦!有您的支持,小婷儿一定会越来越好!