对于二分类问题,正负样本比例为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 1475Name: 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},也可以达到一样的效果。