一、基本介绍
- 类别不平衡问题:
- 采集的数据(建模样本)比例失衡;
二、如何解决
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()