数据重采样(Resampling) 是在处理机器学习问题时的一种技术,特别是在处理样本不平衡时。样本不平衡问题通常指的是类别不均衡,即不同类别的样本数量相差悬殊。在这种情况下,机器学习模型可能会偏向于预测多数类而忽略少数类。数据重采样的目的是通过调整训练数据来平衡类别,使得模型在处理不平衡数据时能够有更好的表现。
重采样方法
主要有两种常见的重采样方法:
欠采样(Under-sampling):从多数类中随机移除一部分样本,减少多数类样本数量,达到平衡。
过采样(Over-sampling):通过重复少数类样本或生成新的少数类样本,增加少数类样本数量。
欠采样(Under-sampling)
from imblearn.under_sampling import RandomUnderSampler
from collections import Counter# 示例数据
X = [[i] for i in range(10)] # 特征
y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] # 标签, 样本不平衡# 初始化欠采样方法
under_sampler = RandomUnderSampler(sampling_strategy='majority')# 进行欠采样
X_res, y_res = under_sampler.fit_resample(X, y)# 查看重采样后的分布
print(f"Resampled dataset shape: {Counter(y_res)}")
过采样(Over-sampling):
from imblearn.over_sampling import RandomOverSampler
from collections import Counter# 示例数据
X = [[i] for i in range(10)] # 特征
y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] # 标签, 样本不平衡# 初始化过采样方法
over_sampler = RandomOverSampler(sampling_strategy='minority')# 进行过采样
X_res, y_res = over_sampler.fit_resample(X, y)# 查看重采样后的分布
print(f"Resampled dataset shape: {Counter(y_res)}")
重采样的注意事项
欠采样 虽然可以解决类别不平衡问题,但可能会丢失多数类的重要信息,导致模型性能下降。
过采样 可能会导致过拟合问题,因为少数类样本被重复使用,特别是当样本本身数量较少时。
更复杂的重采样方法包括 SMOTE(合成少数类过采样技术),其通过插值生成新的少数类样本。
from imblearn.over_sampling import SMOTE
from collections import Counter# 初始化SMOTE
smote = SMOTE(sampling_strategy='minority')# 进行过采样
X_res, y_res = smote.fit_resample(X, y)# 查看重采样后的分布
print(f"Resampled dataset shape: {Counter(y_res)}")
但是这样会影响数据的分布,也许y的分布就是异质性,这就涉及到联邦学习中的数据异质性分布了