如何将现有代码修改为使用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
相关产品推荐
相关产品推荐

