数据不平衡

在二分类中,数据不平衡是经常遇到的问题,其中又分为数据量大小问题和不平衡程度问题,两者组合的处理难度由小到大顺序为:**大数据+分布均衡<大数据不均衡<小数据+数据均衡<小数据+数据不均衡**。
对于拿到的数据,可先统计数据量,再观察分布问题。经验表明,如果每类样本中有5000以上的样本,数据量是够的。如何处理数据不平衡问题呢?

**处理数据不平衡问题的基本思路是使正负样本在训练过程中有相同的话语权,**方法如下:
一、采样(使不平衡的数据集变成平衡的数据集)
采样分为上采样与下采样。
**上采样是把小种类复制多份,**但由于一个样本在高维空间中反复出现,运气好的话会分对很多点,运气不好的话就会分错很多点。为解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明非常有效。
**下采样是把大种类中剔除一些样本,**或者说从大种类中只选取部分样本。下采样是导致信息丢失,如何减少数据丢失呢?第一种方法是EasyEnsemble,利用模型融合的方法(Ensemble),多次放回采样产生独立的训练集,进而训练不同的分类器,通过组合多个分类器的结果得到最终结果。第二种方法是BalanceCascade,利用增量训练的方法(Boosting),先通过一次下采样训练一个分类器,对于分类正确的大种样本不放回,然后在这个更小的大种样本下采样训练第二个分类器,最终组合所有分类器的结果得到最终的结果。第三种方法是利用KNN试图挑选那些最具代表性的大众样本,叫做NearMiss,这类方法计算量比较大。
二、数据合成(利用已有样本生成更多样本)
**常用的是smote方法,它利用小种样本在特征空间的相似性来生成新的样本。**对于小种样本xi∈Smin,从它属于小众类的K近邻中随机选取一个样本点xi,生成一个新的小众样本xnew:xnew=xi+(x−xi)×δ,其中δ∈[0,1]是随机数。
代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
imblearn中提供了RandomOverSample、SMOTE、ADASYN三种方式,调用方式和主要参数基本一致,下采样接口也是一样。
在这里插入图片描述
但smote为每个小种样本生成数量相同的新样本,增加了类之间重叠的可能性,同时增加了没有用的样本。Borderline-SMOTE与ADASYN可以更好的解决这个问题。
**Borderline-SMOTE的解决思路是找到应该生成新样本的小种样本,**即为每个小众样本计算K近邻,只为那些K近邻中有一半以上大众样本的小众样本生成新样本。即只为大种样本周边的小种样本生成新样本,这类样本多为边界样本。确定了哪些样本生成新样本后再利用smote方法生成新样本。
**ADASYN的解决思路是根据样本分布情况为不同的小种样本生成新的不同数据的新样本。**首先根据最终的平衡程度设定总共生成的新样本的数量G ,然后为每个小众样本xi计算分布比例Γi:Γi=Δi/KZ,其中Γi是xiK近邻中大众样本的数量,Z用来归一化使得∑Γi=1,最后为小众样本xi生成新样本的个数为gi=Γi×G,确定个数后再利用SMOTE生成新样本。
三、加权(设置不用的权重值)
现实中如何设置权重值是难点所在,应用中一般让各个分类值之间的加权损失值近似相等。
四、一分类
对于正负样本极不平衡的问题,可以换一个完全不同的方式看待问题,看做‘一分类‘或者‘异常值检测’,其重点不在于捕捉类间的差别,而是为其中一类建模,经典工作包括One-class SVM等。

参考文章:
https://www.cnblogs.com/zhaokui/p/5101301.html
https://blog.csdn.net/nlpuser/article/details/81265614

猜你喜欢

转载自blog.csdn.net/onroadliuyaqiong/article/details/88831928