数据不平衡问题解决方法——欠采样

对于二分类问题,正负样本比例为1:2、1:3、2:3都是可以接受的,但如果正负样本数量相差较大,比如1:10、1:13比例,则需要考虑进行重采样。数据量较大的情况下,使用欠采样方法较为合适。

本文使用的数据集正负样本比例约为1:15,使用欠采样方法将比例调整为1:3,即保留正样本,并从负样本中进行抽样。

1.导入以下模块

import pandas as pd
from collections import Counter
from imblearn.under_sampling import RandomUnderSampler

 2.读取数据,查看数据是否平衡

data=pd.read_excel("data.xlsx")
print(data["target"].value_counts())# 查看数据是否平衡

输出结果 

0    21957
1     1475

Name: target, dtype: int64

3.进行欠采样(这里是先拆分X,y后再进行欠采样)

# X提取变量特征;Y提取目标变量
X = data.drop('target', axis=1) #target为目标变量
y = data['target']
print("Before undersampling: ", Counter(y)) #计算重采样前的正负样本数

undersample = RandomUnderSampler(sampling_strategy=1/3) 
X, y = undersample.fit_resample(X, y)
print("After undersampling: ", Counter(y)) #计算重采样后的正负样本数

 输出结果

Before undersampling:  Counter({0: 21957, 1: 1475})
After undersampling:  Counter({0: 4425, 1: 1475})

最终正负样本比例为1:3 


这里着重说一下RandomUnderSampler的sampling_strategy方法,其它方法具体见RandomUnderSampler

它的值可以为float、str、dict类型

当为 float 类型时,即为上述演示情况,1/3表示少数类样本/多数类样本

当为 str 类型时,有固定可选择的值:

  • "majority":仅对多数类重新采样;

  • "not minority":对除少数类以外的所有类进行重新采样;

  • "not majority":对除多数类以外的所有类进行重新采样;

  • "all":对所有类重新采样;

  • "auto":默认值,等效于not minority。

当为 dict 类型时,键对应于目标类,值对应于每个目标所需的样本数,如上述实例也可以改为sampling_strategy={0:4425},也可以达到一样的效果。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jackie_kk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值