前言
过采样和欠采样都是重采样的重要手段。SMOTE技术发明者在其论文《Synthetic Minority Over-sampling Technique》中说到,过采样和欠采样同时使用可以更好的调整数据的平衡,同时不破环数据原本的数量结构。也就是说,假如我们直接使用SMOTE进行过采样,那么得到的多数样本和少数样本的数据数量将会相等。而当使用两种重采样技术结合时,我们可以保持多数样本集的多数结构,以及少数样本集的少数占比,更接近真实情况。
下面以SMOTE和RandomUnderSampler技术为例展示对不平衡数据的处理效果。
python实现
首先生成数据集并进行可视化
# 1 生成数据集
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=1)
counter = Counter(y) # 统计类别数量
print("类别:", counter)
# 可视化显示
plt.scatter(X[y==0,0], X[y==0,1], color='r')
plt.scatter(X[y==1,0], X[y==1,1], color='b')
plt.show()
之后单独利用SMOTE技术对少数数据样本进行过采样处理,以解决数据不平衡问题。
# 2 利用SMOTE技术处理样本不平衡
from imblearn.over_sampling import SMOTE
# 创建对象
smote = SMOTE()
# 综合生成数据
X_new, y_new = smote.fit_resample(X, y)
counter_2 = Counter(y_new)
print("counter_2 : ", counter_2)
# 可视化显示
plt.scatter(X_new[y_new==0,0], X_new[y_new==0,1], color='r')
plt.scatter(X_new[y_new==1,0], X_new[y_new==1,1], color='b')
plt.show()
此时得到的两类数据数量相等。接下来采用SMOTE处理少数样本(过采样),用RandomUnderSampler处理多数样本(欠采样),并做可视化。
# 3 对少数类进行SMOTE,对多数类进行random undersampling
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline
# 创建重采样模型,并设置重采样比例
over = SMOTE(sampling_strategy=0.1) # 10%
under = RandomUnderSampler(sampling_strategy=0.5) # 50%
# 使用pipeline
steps = [('o', over), ('u', under)]
pipeline = Pipeline(steps=steps)
X_new_2, y_new_2 = pipeline.fit_resample(X, y)
count_3 = Counter(y_new_2)
print("类别:", count_3)
# 可视化显示
plt.scatter(X_new_2[y_new_2==0,0], X_new_2[y_new_2==0,1], color='r')
plt.scatter(X_new_2[y_new_2==1,0], X_new_2[y_new_2==1,1], color='b')
plt.show()
这里使用pipeline方法来将两种重采样技术进行封装结合