听说你被数据不均衡问题困扰?不如过采样or欠采样

1,047 阅读2分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

前言

详细代码可见👉gitee.com/xin-yue-qin…,有问题欢迎随时指教~🔎

当你训练模型时,可能会遇到数据不均衡的状况,即数据集中存在某一类样本,其数量远多于或远少于其他类样本。like👇(0:1≈129:1)

数据不均衡,会使模型的precision、recall、f1值效果很差。

当我们遇到数据不均衡的时候,我们该如何做:

  • 对占比较大的类别进行欠采样,即减少数量多的样本,最后使两类样本均衡
  • 对占比较小的类别进行过采样,即增加数量少的样本,最后使两类样本均衡

过采样

过采样常用SMOTE实现。SMOTE,即合成少数类过采样技术,基本思想是对少数类样本进行分析后,根据少数类样本来合成新样本添加到数据集中。

如何使用?😕

python的imblearn包为SMOTE提供了方便的接口,需要时即可直接调用。只需要下面三句话:👇

#使用imlbearn库中上采样方法中的SMOTE接口
from imblearn.over_sampling import SMOTE

#定义SMOTE模型,random_state相当于随机数种子的作用
smo = SMOTE(random_state=42)
X_smo, y_smo = smo.fit_sample(X, y)   #X, y就是你想增加的数据(X为特征,y为对应的标签

SMOTE模型默认生成 111:1 的数据,如果想生成其他比例的数据,可以使用radio参数。这不仅可以处理二分类问题,同样适用于多分类问题

#可通过radio参数指定对应类别要生成的数据的数量
smo = SMOTE(ratio={1: 300 },random_state=42)
#生成【标签0】和【标签1】比例为3:1的数据样本
X_smo, y_smo = smo.fit_sample(X, y)
print(Counter(y_smo))
#输出:Counter({0: 900, 1: 300})

接前一篇机器学习实战后续,细讲如何使用SMOTE来改善数据不均衡的模型👇

先看看没有SMOTE前的惨况:

加入SMOTE

重新进行模型训练及测试,召回率、精确度和f1值得以改善:

欠采样

欠采样,也叫下采样,简单来说就是减少数量多的样本使其两类样本数量相当。

同样用起来很简单,问就是库里都有,我们只需要直接调用就好~

from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_sample(X, y)

看我实例

image-20211124205854825

效果:

所有代码可在gitee.com/xin-yue-qin…找到,欢迎指导~

参考资料

SMOTE算法代码实现--dzysunshine