You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:56:06