作为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 x,找到其K近邻的样本(当然这里的KNN是同类别的KNN);
- Step2: 随机挑选一个K近邻样本 y y y;
- Step3:生成新样本为 x n e w = x + λ ∗ ( y − x ) x_{new} = x + \lambda*(y-x) xnew=x+λ∗(y−x), λ \lambda λ 是 [ 0 , 1 ] [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 x的方式有所不同。
4.SMOTENC
因为SMOTE算法和ADASY算法在上采样的时候用到了距离,因此当 x 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-1 和 Borderline-2 SMOTE 会使用 in danger的样本。
区别在于Borderline-1 SMOTE选取的参与插值的KNN样本
y
y
y会跟
x
x
x属于同一类别;Borderline-2 SMOTE可能使用任何类别的KNN样本。
6.SVMSMOTE
使用SVM分类器找到支持向量,在生成的时候会考虑它们. SVM的C参数决定了选择支持向量的多少。
多分类问题
- 对于RandomOverSampler,不存在任何问题,因为其本来就是复制,不存在插值。
- 对于ADASYN和SMOTE,需要KNN信息,这里使用one-vs-rest,即1对余的方