一、什么是过采样与欠采样
在机器学习中,数据样本数量的多少往往会影响算法的效果。而在实际应用中,有时候我们会遇到数据不平衡的情况,即某些类别的数据量非常少,而其它类别的数据量非常多。这时候我们就需要用到过采样与欠采样的技术。
过采样指的是在某些样本数量较少的类别上进行“复制粘贴”的过程,即通过复制少数类的数据来增加其数量,使其和多数类相似,达到平衡的目的。而欠采样则是相反的操作,即通过从多数类中删除一些样本的方式来减少其数量,从而使得少数类和多数类的样本量相近。
二、过采样的方法
1. 随机过采样
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler()
X_resampled, y_resampled = ros.fit_resample(X, y)
随机过采样就是简单粗暴地从少数类中随机抽取一些样本进行复制粘贴。虽然简单,但是效果不一定好。因为会导致模型的过拟合问题。如果抽取方式不合理,会导致模型对这些“伪造”的数据过于敏感,从而导致模型的效果变差。
2. SMOTE
from imblearn.over_sampling import SMOTE
smote = SMOTE()
X_resampled, y_resampled = smote.fit_resample(X, y)
SMOTE的全称是Synthetic Minority Over-sampling Technique,它对随机过采样进行改进,通过对每一个少数类样本进行分析,然后在少数类样本附近生成新样本。具体来说,SMOTE算法如下:
1)对于每个少数类样本x,随机找出k个最近邻的少数类样本,并随机选择一个样本y。
2)在x和y之间的连线上,根据比例“a”(0<=a<=1)随机选取一个点z作为新的样本。
3)重复步骤1和步骤2,直到新的少数类样本数量达到预期。
3. ADASYN
from imblearn.over_sampling import ADASYN
adasyn = ADASYN()
X_resampled, y_resampled = adasyn.fit_resample(X, y)
ADASYN的全称是Adaptive Synthetic Sampling。它对SMOTE算法进行改进,考虑到不同的少数类样本之间可能存在不同的密度分布。ADASYN算法如下:
1)对于每个少数类样本x,计算其k个最近邻少数类样本,然后计算每个最近邻样本与x之间的距离。
2)根据距离计算每个最近邻样本对应的权重。权重越大的最近邻样本越有可能用来生成新的样本。
3)对于每个少数类样本,计算需要生成的新样本数量。假设需要生成n个新样本,那么对于每个最近邻样本,给定其对应的权重,计算每个最近邻样本对应生成的新样本数量m。
4)通过比较每个少数类样本的密度分布,可以得到不同的少数类样本所对应的权重,然后对m值进行重新加权,从而获得每种类型的少数类新样本数。
三、欠采样的方法
1. 随机欠采样
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler()
X_resampled, y_resampled = rus.fit_resample(X, y)
随机欠采样就是随机从多数类中删除一些样本。同样,这种方法效果也不一定好,因为有可能会导致信息的丢失,从而影响模型的效果。
2. Tomek links
from imblearn.under_sampling import TomekLinks
tl = TomekLinks()
X_resampled, y_resampled = tl.fit_resample(X, y)
Tomek links算法的思想是:去掉相邻不同类别之间的样本,这些样本在特征空间的距离非常近,它们的存在可能导致模型在“边界”处产生错误的预测结果。
3. Cluster centroids
from imblearn.under_sampling import ClusterCentroids
cc = ClusterCentroids()
X_resampled, y_resampled = cc.fit_resample(X, y)
Cluster centroids算法的思想是,通过聚类的技术将多数类的样本划分为多个簇,然后在每个簇内部随机选择一个样本作为新的多数类样本。这种方法可以保留多数类样本的纯度,同时减少多数类样本的数量。