python imblearn toolbox 解决数据不平衡问题(二)——over-sampling上采样

作为imblearn介绍的第二节,介绍imblearn中上采样的方法和基本原理。

基本用法框架

from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)

针对不同的上采样算法,修改RandomOverSampler和参数即可。

方法和原理介绍

1. Naive random over-sampling : random sampling with replacement.

随机对欠表达样本进行采样,该算法允许对heterogeneous data(异构数据)进行采样(例如含有一些字符串)。
通过对原少数样本的重复取样进行上采样。

from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)

2.The Synthetic Minority OverSampling Technique(SMOTE)

通过interpolation(插值) 生成新的样本,不对easy samples and hard samples进行区分。

from imblearn.over_sampling import SMOTE
X_resampled,y_resampled = SMOTE().fit_resample(X, y)

主要思路为:

  • Step1: 对于少数类样本中的某个样本 x x ,找到其K近邻的样本(当然这里的KNN是同类别的KNN);
  • Step2: 随机挑选一个K近邻样本 y y ;
  • Step3:生成新样本为 x n e w = x + λ ( y x ) x_{new} = x + \lambda*(y-x) , λ \lambda [ 0 , 1 ] [0,1] 上随机数。

3.The Adaptive Synthetic (ADASYN)

通过插值生成新的样本,生成靠近在KNN中被分类错误的原样本。

from imblearn.over_sampling import ADASYN
X_resampled, y_resampled = ADASYN().fit_resample(X, y)

主要思路与SMOTE相同,只是选取 x x 的方式有所不同。

4.SMOTENC

因为SMOTE算法和ADASY算法在上采样的时候用到了距离,因此当 x x 为异构数据,即含有离散变量(例如0代表男,1代表女),此时无法直接对离散变量使用欧氏距离。因此有了变体SMOTENC,其在处理离散数据时,采用K近邻样本中出现频率最高的离散数据作为新的样本的值。但是要提前告知离散数据出现的维度位置。

from imblearn.over_sampling import BorderlineSMOTE
#当处理mixed data时,以上除了RandomOverSampler都不行(因为用到了距离),但是一下算法可以——SMORENC
from imblearn.over_sampling import SMOTENC 
#例如我们的数据的第一个(0)和最后一个数据(3)为categorical features(离散数据)
smote_nc = SMOTENC(categorical_features=[0,2], random_state=0)
X_resampled, y_resampled = smote_nc.fit_resample(X,y)

5.bordeline SMOTE

首先对样本(负例样本)x划分为noise(所有KNN样本类别都与x类别不同);in danger(至少有一半KNN样本类别与x类别相同);safe(所有KNN样本类别都与x类别相同)三类样本。
bordeline SMOTE: Borderline-1Borderline-2 SMOTE 会使用 in danger的样本。
区别在于Borderline-1 SMOTE选取的参与插值的KNN样本 y y 会跟 x x 属于同一类别;Borderline-2 SMOTE可能使用任何类别的KNN样本。

6.SVMSMOTE

使用SVM分类器找到支持向量,在生成的时候会考虑它们. SVM的C参数决定了选择支持向量的多少。

多分类问题

  • 对于RandomOverSampler,不存在任何问题,因为其本来就是复制,不存在插值。
  • 对于ADASYN和SMOTE,需要KNN信息,这里使用one-vs-rest,即1对余的方

猜你喜欢

转载自blog.csdn.net/mathlxj/article/details/89604564