StratifiedKFold与过采样结合的代码顺序是否正确?
代码顺序的问题分析与修正
你的当前代码顺序完全错误,正确的逻辑是先执行StratifiedKFold拆分,再对每个交叉验证fold的训练集单独做过采样,绝对不能先对全量数据集过采样再拆分。
为什么当前顺序不对?
如果先对整个数据集做过采样,会让测试集中混入过采样生成的少数类重复样本——相当于模型在训练阶段已经“见过”测试集的部分数据,这会导致模型评估结果严重高估,完全失去了交叉验证的意义。同时,StratifiedKFold的作用是保持每个fold的类别分布与原数据集一致,先过采样会直接破坏这种分布,违背了交叉验证“训练集与测试集独立”的核心原则。
修正后的代码示例
from sklearn.model_selection import StratifiedKFold from imblearn.over_sampling import RandomOverSampler # 初始化分层交叉验证,建议开启shuffle并固定随机态保证结果可复现 skf = StratifiedKFold(n_splits=10, random_state=42, shuffle=True) # 遍历每个fold for train_index, test_index in skf.split(x, y): # 第一步:拆分当前fold的训练集和测试集 x_train, x_test = x.iloc[train_index], x.iloc[test_index] y_train, y_test = y.iloc[train_index], y.iloc[test_index] # 第二步:仅对训练集执行过采样,测试集保持原始状态 ros = RandomOverSampler(sampling_strategy="not majority", random_state=42) x_train_resampled, y_train_resampled = ros.fit_resample(x_train, y_train) # 后续流程:用重采样后的训练集训练模型,用原始测试集评估 # model.fit(x_train_resampled, y_train_resampled) # y_pred = model.predict(x_test) # 计算评估指标(如F1-score、AUC等,更适合不平衡数据集)
关键注意事项
- 测试集绝对不能参与任何形式的采样或数据预处理,必须完全模拟真实场景中模型未见过的新数据
- 固定
random_state可以让你的实验结果可复现,方便后续调参和验证 - 如果需要做其他数据预处理(如标准化、归一化),也要遵循“仅在训练集拟合,转换训练集和测试集”的原则,避免数据泄露
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

