目录
一、类别不均衡问题
事实上,许多数据集存在 类别不均衡问题 (Class-imbalance problem) 或者说 长尾问题 (Long-tail problem),即数据集中不同类别样本数比例差异过大的情况。然而,大部分机器学习算法在这类不均衡数据集上表现不佳。为此,可通过 设置类别权重、仔细选择指标、尝试不同算法、异常点检测、重采样数据集 等各种方法应对。以下则梳理了使用 imblance-learn 库 (简称 imblearn) 处理数据不均衡问题的若干方法。
二、使用 imblearn 重采样数据
其实,从不均衡数据自身出发解决问题,是最直观的想法。为此,可以 对类别占比小的样本过采样 或 对类别占比大的样本欠采样,实现数据均衡。通常,使用 imblance-learn 库实现数据集重采样。
官方文档:
https://imbalanced-learn.org/stable/
安装方式:
pip install imbalanced-learn
2.1 过采样 (Over-sampling)
过采样通常是在样本不均衡且数据集不够时,通过增加少数类的样本数以获得类别均衡的数据集。常见的样本过采样方法如下所示:
2.1.1 随机过采样 (Random Over-sampling)
朴素的随机过采样是最简单而直接的方式,其 对少数类样本随机拷贝以扩充数据集。换言之,通过对少数类样本进行随机抽样,然后将得到的样本作为新样本加入原数据集中。
注意,对相同样本重复采样将 人为地减少数据集的方差,且 可能导致严重的过拟合。
代码示范:
# API:https://imbalanced-learn.org/stable/references/generated/imblearn.over_sampling.RandomOverSampler.html
from imblearn.over_sampling import RandomOverSampler
# 实例化 RandomOversampling 类对象
ros = RandomOverSampler(random_state=0)
# 过采样得到数据集及其标签
x_train_ros, y_train_ros = ros.fit_resample(x_train, y_train)
效果示范:
可见,采样前后几乎看不出差别,因为拷贝得到的新样本点与原样本点在二维平面上重叠了。
2.1.2 合成少数类过采样技术 (Synthetic Minority Over-sampling Technique, SMOTE)
SMOTE 是一种在原数据集样本间进行插值以生成新样本的技术。设输入空间中,任一样本点为 x i x_i xi,另一样本点为 x j x_j xj,则二者可通过下式合成新样本点 x i j x_{ij} xij:
x i j = x i + α ( x j − x i ) , α ∈ [ 0 , 1 ] x_{ij} = x_i + \alpha(x_j - x_i), \; \alpha \in [0, 1] xij=xi+α(xj−xi),α∈[0,1]
合成示意图如下所示:
可见