本文内容基本来自一下网址,简单记录一下数据不均衡的各种处理方法,以及各方法的好坏:
Diving Deep with Imbalanced Data
方法一
首先就是较为简单的随机下采样,也就是训练的时候,从多数类抽取与少数类差不多的数量,使得训练的时候数据均衡。
优点:很明显增加了训练的速度,减小了gpu的压力。
缺点:
1.会导致损失一部分的信息,不利于建立基于规则的模型(rule-based classifiers),比如随机森林。(本人没有使用过随机森林,所以不是很理解)
2.单纯的随机采样,可能会获得一个有偏差的样本,最后训练的模型的泛化性能可能较差。
与随机下采样方法对应的就是随机上采样,这个方法简单的执行就是复制N次少数类,但这不一定是好方法,可以使用一些随机增强的方式增加少数类。
优点:这总方法不会损失信息。
缺点:单纯的复制少数类,这样可能会导致模型的过拟合。
以下场景你可以考虑使用以上方法:
1.数据比较多的时候,可以使用随机下采样,提升训练速度是很开心的事情。
2.数据较少的时候,可以使用随机上采样,这样不会导致你要复制过多的少数类,而产生各种问题。
3.考虑一下其他的随机方法,比如分层抽样。
4.考虑一下其他比例,不一定要把数据的比例调整为1:1
方法二
然后基于提高少数类的目的,我们可以考虑生成更多少数类样本,有点类似随机增强。比较经典的算法就是SMOTE。目前类似的方法有很多了,大家可以多搜搜这样方面的文献,或许你可考虑一下更加高级的对抗生成网络。
优点:
1.比起单纯的复制少数类,该方法可以增加模型的泛用性,减小过拟合。
2.不会丢失信息
3.简单,方便,可解释。
缺点:
1.生成样本的时候,SMOTE不会考虑生成样本周围属于其他类别的样本,生成的样本和其他类别的样本重叠,而引入噪声。
2.不适用与高纬度数据。(我觉得也不适合复杂数据,比如生成医学图像,效果很差。)
方法三
应该是应用其他最为舒适,需要增加任何样本的代价敏感学习(Cost-Sensitive Learning),简单来说就是在损失函数上给少数类加入更多权重,比如wCE_loss,DICE_loss,Focal_loss……挺多的,随机组合起来就更多了。
常用的方法就是以上,算的上较为万能。不过不管什么方法还是结合自己数据集的实际情况。依据具体情况,你也可知制定出特有的处理数据不均衡的方法。