如何处理数据不平衡问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理数据不平衡问题相关的知识,希望对你有一定的参考价值。
参考技术A 基于上一篇文章,面试被虐成渣,所以来整理和记录下第一个问题,关于数据不平衡的问题。以下内容参考:
https://www.cnblogs.com/charlotte77/p/10455900.html https://www.leiphone.com/news/201706/dTRE5ow9qBVLkZSY.html
数据不平衡也可称作数据倾斜。在实际应用中,数据集的样本特别是分类问题上,不同标签的样本比例很可能是不均衡的。因此,如果直接使用算法训练进行分类,训练效果可能会很差。
解决实际应用中数据不平衡问题可以从三个方面入手,分别是对数据进行处理、选择合适的评估方法和使用合适的算法。
1)过采样:
主动获取更多的比例少的样本数据。由于样本比例不均衡,在条件允许的情况下可以尝试获取占比少的类型的样本数据。(PS:这就是为什么我几乎没有遇到过数据不平衡的问题。每次测试使用的数据集都尽可能的完美均衡) 也可以通过使用 重复 、 自举 或 合成 少数类过采样等方法(SMOTE)来生成新的稀有样品。
直接简单复制重复的话,如果特征少,会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本 (数据增强)。
2)欠采样:
数据量足够时,可以通过保留比例小的样本数据和减少比例大的样本数据来平衡数据集。缺点是会丢失多数类中的一些重要信息。
3)改变权重:
对不同样本数量的类别赋予不同的权重(通常会设置为与样本量成反比)
4)使用K-fold交叉验证
值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
K-fold交叉验证就是把原始数据随机分成K个部分,在这K个部分中选择一个作为测试数据,剩余的K-1个作为训练数据。交叉验证的过程实际上是将实验重复做K次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均。
此外,还应注意训练集和测试集的样本的概率分布问题。若实际数据不平衡,将采样平衡后的数据集作为训练集训练后,模型应用在测试集上效果仍会不好。因此,实际应用中尽可能 保持训练和测试的样本的概率分布是一致的。
1)谨慎选择AUC作为评价指标:对于数据极端不平衡时,可以观察观察不同算法在同一份数据下的训练结果的precision和recall,这样做有两个好处,一是可以了解不同算法对于数据的敏感程度,二是可以明确采取哪种评价指标更合适。针对机器学习中的数据不平衡问题,建议更多PR(Precision-Recall曲线),而非ROC曲线,具体原因画图即可得知,如果采用ROC曲线来作为评价指标,很容易因为AUC值高而忽略实际对少量样本的效果其实并不理想的情况。
2)不要只看Accuracy:Accuracy可以说是最模糊的一个指标了,因为这个指标高可能压根就不能代表业务的效果好,在实际生产中更关注precision/recall/mAP等具体的指标,具体侧重那个指标,得结合实际情况看。
1)选择对数据倾斜相对不敏感的算法。如树模型等。
2)集成学习。即多模型Bagging。首先从多数类中独立随机抽取出若干子集,将每个子集与少数类数据联合起来训练生成多个基分类器,再加权组成新的分类器,如加法模型、Adaboost、随机森林等。
3)转化成异常检测或者一分类问题。(具体内容后续有时间再跟进学习)
补充:什么是数据增强(Data Augmentation)?
参考链接:https://www.jianshu.com/p/3e9f4812abbc
数据增强让有限的数据产生更多的数据,增加训练样本的数量以及多样性(噪声数据), 提升模型鲁棒性, 一般用于训练集。神经网络需要大量的参数,许许多多的神经网路的参数都是数以百万计,而使得这些参数可以正确工作则需要大量的数据进行训练,但在很多实际的项目中,我们难以找到充足的数据来完成任务。随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。
数据增强方法:
例如,我们可以对图像进行不同方式的裁剪,让物体以不同的实例出现在图像的不同位置,这同样能够降低模型对目标位置的敏感性。此外,调整亮度、对比度、饱和度和色调 等因素来降低模型对色彩的敏感度。再有,随机裁剪、随机反转、随机对比度增强、颜色变化等等。一般来讲随机反转和一个小比例的random resize,再接随机裁剪比较常用。NLP中将字和词连接起来就形成了一个新样本,也属于数据增强。
数据增强的分类:
数据增强可以分为两类,一类是离线增强,一类是在线增强。
· 离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子乘以原数据集的数目,这种方法常常用于数据集很小的时候。
· 在线增强 : 这种增强的方法用于,获得批量(batch)数据之后,然后对这个批量(batch)的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。
如何处理不均衡数据
定义
以二分类问题为例,假设我们的数据集是S,数据集中的多数类为S_maj,少数类为S_min,通常情况下把多数类样本的比例为100:1,1000:1,甚至是10000:1,这种情况下为不平衡数据,不平衡数据的学习即需要在如此分布不均匀的数据集中学习到有用的信息。
问题:不均衡的数据理解预测起来很简单,永远都是预测多的数据的那一方,这样准没错,特别是数据多很多的情况的那一方,比如多的占了90%,少的占10%.只要每一次都预测多的那一批数据,预测的准确性就可以达到90%了。
为什么类不平衡是不好的
1.从模型的训练过程来看
从训练模型的角度来说,如果某类的样本数量很少,那么这个类别所提供的“信息”就太少。
使用经验风险(模型在训练集上的平均损失)最小化作为模型的学习准则。设损失函数为0-1 loss(这是一种典型的均等代价的损失函数),那么优化目标就等价于错误率最小化(也就是accuracy最大化)。考虑极端情况:1000个训练样本中,正类样本999个,负类样本1个。训练过程中在某次迭代结束后,模型把所有的样本都分为正类,虽然分错了这个负类,但是所带来的损失实在微不足道,accuracy已经是99.9%,于是满足停机条件或者达到最大迭代次数之后自然没必要再优化下去,训练结束,于是模型没有学习到如何去判别出少数类。
2.从模型的预测过程来看
考虑二项Logistic回归模型。输入一个样本X ,模型输出的是其属于正类的概率y^ 。当 y^ > 0.5 时,模型判定该样本属于正类,否则就是属于反类。
为什么是0.5呢?可以认为模型是出于最大后验概率决策的角度考虑的,选择了0.5意味着当模型估计的样本属于正类的后验概率要大于样本属于负类的后验概率时就将样本判为正类。但实际上,这个后验概率的估计值是否准确呢?
从几率(odds)的角度考虑:几率表达的是样本属于正类的可能性与属于负类的可能性的比值。模型对于样本的预测几率为 y^/(1-y^) 。
模型在做出决策时,当然希望能够遵循真实样本总体的正负类样本分布:设 N等于正类样本数除以全部样本数,那么样本的真实几率为N/(1-N) 。当观测几率大于真实几率时,也就是y^ >0 时,那么就判定这个样本属于正类。
虽然我们无法获悉真实样本总体,但之于训练集,存在这样一个假设:训练集是真实样本总体的无偏采样。正是因为这个假设,所以认为训练集的观测几率 n^/(1-n^) 就代表了真实几率n/(1-n) 。
解决方法
方法1:想办法获取更多的数据
首先我们要想一想我们是否可以获取更多的数据,有的时候我们在获取数据的前期,通常数据会呈现一个变化的趋势,这时候表现为某一种数据量偏多,等到数据的后半段的时期,数据的变化的趋势可能就会不一样了。
如果没有获取后半期的数据,从整体来看,预测就可能不会那么的精准.所以想办法获得更多的数据有可能会改善这个情况~
方法2:换一种评判方式
通常情况下,我们会使用准确率(Accuracy)和误差(Cost)两种方式来判断机器学习的成果.但是在不均衡的数据面前,高的准确率和低的误差就显得没有那么有用和重要了.
所以我们就可以换个方式去计算,很多时候我们会使用Confusion Matrix去计算Precision&Recall,然后在通过Precision&Recall去计算F1 Score(or F-score).通过这样的数据,我们可以很大程度上去区分不均衡数据,并且可以给出更好的分数.
方法3:重组数据
这中方法相对来说最为简单粗暴,对不均衡的数据进行重新组合,使之均衡。第一种方式是复制少数数据里的样本,使其可以达到和多数数据样本差不多的数量,也就是过采样。第二种方式就是对多数样本的数据进行开刀,砍掉一些多数样本的数据,还是使两者的数量差不多 ,即欠采样方法。
但是,简单粗暴的去处或者增加数据容易改变原有分布,降低模型泛化能力,需要考虑到数据的分布。
随机过采样: 从少数类样本中随机重复有放回的抽取样本以得到更多样本。
缺点: 对少数类样本多次复制,扩大了数据规模,增加了模型复杂度,容易过拟合。
解决办法: SMOTE算法
简单来说,就是对少数类每一个样本x,从他在少数类样本的K近邻中随机选一个样本y,然后在x和y的连线上随机选取一点作为新的合成的样本。这种方法避免了复制少数类样本,增加了样本的多样性,可以降低过拟合的风险。
但是这种方法会增大类间重叠度,并且会产生一些不能提供有效信息的样本。为此出现了Borderline-SMOTE(只给那些处在分类边界上的少数类样本合成新样本),ADASYN(给不同的少数类样本合成不同个数的新样本)随机欠采样:从多数类样本中随机的有放回(或无放回)选取较少的样本。
缺点:丢弃一部分样本,可能会损失部分有用信息,造成模型只学到整体模式的一部分。
解决办法:Easy Ensemble算法
每次从多数类随机抽取一个子集,和少数类训练一个分类器;重复若干次,得到多个分类器,最终的结果是多个分类器的融合。
Balance Cascade算法
级联结构,在每一级中从多数类中随机抽取子集,和少数类训练该级的分类器,然后从多数类样本中剔除掉当前分类器能正取识别的样本,继续下一级的操作,重复若干次,最后的结果也是各级分类器的融合。实际上,经常用到的数据扩充方法也是一种过采样,对样本进行一些噪声扰动或变换(裁剪,翻转,加光照等等)
方法4:使用其他的机器学习方法
在使用一些机器学习的方法中,比如神经网络,在面对不均衡数据的时候都是束手无策的,但是像决策树这样的方法就不会受到不均衡数据的影响
方法5:修改算法
在所有方法中,最具有创造力的方法莫过于这个修改算法了,如果你使用的是Sigmoid函数,他会有一个预测的门槛,如果低于门槛,预测的结果为梨,如果超过了门槛,预测的结果为苹果。
不过因为现在梨的数量过多,这个时候我们就需要调解下门槛的位置,使得门槛更加的偏向于苹果这一边,只有数据非常准确的情况下,模型才会预测为苹果,从而使机器学习学习到更好的效果.
此外,还可以改变模型训练时的目标函数;也可以将问题转化为单类学习。
以上是关于如何处理数据不平衡问题的主要内容,如果未能解决你的问题,请参考以下文章