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

如何将现有代码修改为使用K=5或10的K折交叉验证

K折交叉验证修改方案(K=5示例)

针对你的分类任务,下面是修改为5折交叉验证的完整代码,同时保留原有的模型配置逻辑:

import numpy as np
from sklearn.model_selection import StratifiedKFold  # 分类任务用分层KFold,保证类别分布一致

# 合并原始特征和目标变量为完整数据集
full_data = X.copy()
full_data['target'] = y

# 初始化5折交叉验证,固定随机种子保证可复现
kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=100)

# 存储每折的评估结果
metrics_list = []

# 循环每一轮交叉验证
for fold, (train_idx, val_idx) in enumerate(kf.split(full_data.drop('target', axis=1), full_data['target'])):
    print(f"===== 第 {fold+1} 折训练 =====")
    
    # 拆分当前折的训练集和验证集
    train_data = full_data.iloc[train_idx].copy()
    val_data = full_data.iloc[val_idx].copy()
    
    # 数据配置:注意排除target列,避免把目标变量当成特征
    data_config = DataConfig(
        target=['target'],
        continuous_cols=[col for col in train_data.columns if col != 'target'],
        categorical_cols=[],
        normalize_continuous_features=True
    )
    
    trainer_config = TrainerConfig(
        auto_lr_find=True,
        batch_size=64,
        max_epochs=10,
    )
    
    optimizer_config = {
        'optimizer':'Adam', 
        'optimizer_params':{'weight_decay': 0, 'amsgrad': False}, 
        'lr_scheduler':None, 
        'lr_scheduler_params':{}, 
        'lr_scheduler_monitor_metric':'valid_loss'
    }
    
    model_config = NodeConfig(
        task="classification",
        num_layers=2,
        num_trees=512,
        learning_rate=1,
        embed_categorical=True,
    )
    
    # 每折重新初始化模型,避免跨折参数污染
    tabular_model = TabularModel(
        data_config=data_config,
        model_config=model_config,
        optimizer_config=optimizer_config,
        trainer_config=trainer_config,
    )
    
    # 用当前折的训练集训练,验证集评估
    tabular_model.fit(train=train_data, test=val_data)
    
    # 处理预测结果
    pred = tabular_model.predict(val_data)
    pred['prediction'] = pred['prediction'].astype(int)
    pred.loc[pred['prediction'] >= 1, 'prediction'] = 1
    
    # 记录当前折的指标
    fold_metrics = print_metrics(val_data['target'], pred["prediction"].astype('int'), tag=f"Fold {fold+1}")
    metrics_list.append(fold_metrics)

# 计算所有折的平均指标
print("\n===== 交叉验证平均结果 =====")
# 假设print_metrics返回字典格式的指标,根据实际返回结构调整
avg_metrics = {key: np.mean([m[key] for m in metrics_list]) for key in metrics_list[0].keys()}
for metric, value in avg_metrics.items():
    print(f"{metric}: {value:.4f}")

关键修改说明

  • 替换拆分逻辑:用StratifiedKFold替代单次拆分,分类任务中分层KFold能保证每折的类别比例与原始数据集一致,避免随机拆分带来的结果偏差。
  • 独立训练每折模型:每一轮折都重新初始化模型,确保模型参数不受上一轮训练影响,保证交叉验证的独立性。
  • 修正数据配置:continuous_cols排除target列,避免将目标变量误作为特征输入。
  • 汇总评估结果:收集每折的指标并计算平均值,得到更可靠的模型性能评估结论。

如果需要改成10折,只需将n_splits=5修改为n_splits=10即可。

内容的提问来源于stack exchange,提问作者zizi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:54:15