使用RepeatedKFold重复k折交叉验证时如何获取各样本预测结果
解决方案
问题原因
cross_val_predict 仅支持每个样本在交叉验证流程中仅作为测试集出现一次的拆分策略。RepeatedKFold 会执行多次K折拆分,每个样本会在n_repeats次拆分中被多次划入测试集,因此cross_val_predict无法直接输出结果。
实现方法
通过手动遍历交叉验证的拆分结果即可灵活获取所有预测值,同时支持自定义存储字段:
代码示例
import pandas as pd from sklearn.model_selection import RepeatedKFold from sklearn.linear_model import LogisticRegression # 沿用你的原有配置 cv1 = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) model = LogisticRegression() # 初始化结果存储容器 pred_results = [] # 遍历所有拆分 for fold_idx, (train_idx, test_idx) in enumerate(cv1.split(X)): # 拆分数据集:如果X/y是pandas格式,将索引方式改为.iloc[train_idx]即可 X_train, X_test = X[train_idx], X[test_idx] y_train, y_test = y[train_idx], y[test_idx] # 模型训练预测 model.fit(X_train, y_train) y_pred = model.predict(X_test) # 存储每个测试样本的结果 for sample_idx, true_val, pred_val in zip(test_idx, y_test, y_pred): pred_results.append({ "样本id": sample_idx, # 如有单独的样本id列,可替换为对应的id取值 "真实标签": true_val, "预测标签": pred_val, "重复轮次": fold_idx // 10 + 1, # 按n_splits=10计算轮次,可按需调整 "当前折数": fold_idx % 10 + 1 }) # 导出所有预测结果 all_result_df = pd.DataFrame(pred_results) all_result_df.to_csv("全量交叉验证预测结果.csv", index=False, encoding="utf-8-sig")
可选:生成每个样本的唯一预测结果
如果需要每个样本对应一个最终预测标签,可通过投票聚合多次预测结果:
# 按样本id分组,取预测次数最多的标签作为最终结果 final_pred_df = all_result_df.groupby("样本id")["预测标签"].agg(lambda x: x.value_counts().index[0]).reset_index() final_pred_df.to_csv("样本最终预测结果.csv", index=False, encoding="utf-8-sig")
内容的提问来源于stack exchange,提问作者RToPython
相关产品推荐
相关产品推荐

