过采样与欠采样

随机过采样、SMOTE、随机欠采样

Posted by 新宇 on February 20, 2020

一、基本介绍

  • 类别不平衡问题:
    • 采集的数据(建模样本)比例失衡;

二、如何解决

1. 过采样方法

  • 增加一些少数类样本使得正、反例数目接近,然后再进行学习。

1.1 随机过采样方法

  • 定义:
    • 在少数类中随机选择一些样本,然后通过复制所选择的样本生成样本集E,将它们添加到S_min中来扩大原始数据集从而得到新的少数类集合S_new−min。新的数据集S_new−min = S_min + E 。
  • 缺点:
    • 对于随机过采样,由于需要对少数类样本进行复制来扩大数据集,造成模型训练复杂度加大。
    • 另一方面也容易造成模型的过拟合问题,因为随机过采样是简单的对初始样本进行复制采样,这就使得学习器学得的规则过于具体化,不利于学习器的泛化性能,造成过拟合问题。
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
from collections import Counter
# 这里需要先安装Imblearn

# pip3 install imbalanced-learn

from imblearn.over_sampling import RandomOverSampler,SMOTE
from imblearn.under_sampling import RandomUnderSampler

# 使用make_classification生成不均衡的样本数据

X,y = make_classification(
    n_samples=5000,n_features=2,
    n_informative=2,n_redundant=0,
    n_repeated=0,n_classes=3, 
    n_clusters_per_class=1,weights=[0.01,0.05,0.94],
    random_state=22)
# 查看各个标签的样本个数

Counter(y)
# 绘图

plt.scatter(X[:, 0], X[:, 1], c=y) 
plt.show()

# 解决类别不平衡的方法介绍

# 1. 过采样方法

ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)

Counter(y_resampled)
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled) 
plt.show()


1.2 过采样代表性算法-SMOTE

  • SMOTE全称是SyntheticMinorityOversampling即合成少数类过采样技术。
  • SMOTE算法是对随机过采样方法的一个改进算法,由于随机过采样方法是直接对少数类进行重采用,会使训练集中有很多重复的样本,容易造 成产生的模型过拟合问题。
  • SMOTE算法的基本思想:
    • 对每个少数类样本 xi ,从它的最近邻中随机选择一个样本 x^i (x^i 是少数类中的一个样本),然后在xi和x^i之间的连线上随机选择一点 作为新合成的少数类样本。

# 1.1 过采样代表性算法-SMOTE

smo = SMOTE(random_state=0)
X_resampled, y_resampled = smo.fit_resample(X, y)

Counter(y_resampled)
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled) 
plt.show()

2. 欠采样方法

  • 去除一些多数类中的样本使得正例、反例数目接近,然后再进行学习。
  • 缺点:
    • 对于随机欠采样,由于采样的样本集合要少于原来的样本集合,因此会造成一些信息缺失,即将多数类样本删除有可能会导致分类器丢失有 关多数类的重要信息。
# 2. 欠采样方法

rus = RandomUnderSampler(random_state=22)
X_resampled, y_resampled = rus.fit_resample(X, y)
Counter(y_resampled)
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled) 
plt.show()