一、样本不均衡
下述方法仅适用于训练数据,不能更改测试数据的分布情况
1.随机过采样
将数量少的类别复制一直到所有类别数量一致
import pandas as pd
from imblearn.over_sampling import RandomOverSampler
path = "C:/Users/haxia/Desktop/text_and_label.csv"
dataframe = pd.read_csv(path,header=0,index_col=0,sep=',')
label = dataframe["Emotion"] #抽离出目标变量
df = dataframe.drop("Emotion",axis=1) #删掉目标变量获得特征
ros = RandomOverSampler(random_state=23) #种子保证每次采样的结果一致
df,y = ros.fit_resample(df,label) #过采样
del label #后续不需要了,可以删掉
df["label"] = y
print(df.shape)
2.随机欠采样
将数量多的类别随机删除部分直到所有类别数量一致
import pandas as pd
from imblearn.over_sampling import RandomUnderSampler
path = "C:/Users/haxia/Desktop/text_and_label.csv"
dataframe = pd.read_csv(path,header=0,index_col=0,sep=',')
label = dataframe["Emotion"] #抽离出目标变量
df = dataframe.drop("Emotion",axis=1) #删掉目标变量获得特征
rus = RandomUnderSampler(random_state=23) #种子保证每次采样的结果一致
df,y = rus.fit_resample(df,label) #过采样
del label #后续不需要了,可以删掉
df["label"] = y
print(df.shape)
3.将过采样和欠采样结合
二分类:在管道的最后,少数类和多数类之间的比率将为0.5。
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
over = RandomOverSampler(sampling_strategy=0.1) #0.1采样策略的RandomOverSampler将少类提高到“ 0.1 *多数类”
under = RandomUnderSampler(sampling_strategy=0.5) #0.5采样策略的RandomUnderSampler将多数类的数量减少为“ 2 *少数类”
from imblearn.pipeline import Pipeline
steps = [('o', over), ('u', under)]
pipeline = Pipeline(steps=steps)
X_smote, label = pipeline.fit_resample(X_train, label) #少数类和多数类之间的比率将为0.5
多分类:
from imblearn.over_sampling import RandomOverSampler
# 定义每个类别的采样策略
sampling_strategy = {
'class1': 100, # class1的数量将被增加到100个
'class2': 200, # class2的数量将被增加到200个
'class3': 150 # class3的数量将被增加到150个
}
# 创建RandomOverSampler对象,并使用字典类型的sampling_strategy参数
over_sampler = RandomOverSampler(sampling_strategy=sampling_strategy)
# 使用over_sampler对训练数据进行过采样
X_resampled, y_resampled = over_sampler.fit_resample(X_train, y_train)