如何让cross_val_predict返回K折独立预测数组而非合并结果?
获取cross_val_predict的每折独立预测结果
嘿,我完全理解你的需求——你已经搞懂了cross_val_predict的10折交叉验证逻辑,但默认它返回的是把所有样本的预测结果按原数据顺序合并后的数组,而你想要的是像cross_val_score那样,拿到10个独立的预测数组,用来做后续的平均得分计算和对比,对吧?
其实cross_val_predict的设计初衷就是为了得到每个样本在作为测试集时的预测值,所以会自动合并结果。但要拿到每折的独立预测,我们可以手动复刻它的交叉验证流程,代码实现起来很简单:
手动实现每折预测收集
我们可以用KFold(或对应任务的分割器,比如分类任务用StratifiedKFold)来拆分数据,然后循环每折训练模型、预测测试集,把结果存入列表:
from sklearn.model_selection import KFold from sklearn.ensemble import RandomForestClassifier # 换成你使用的模型 import numpy as np # 假设你的特征和标签数据 X = np.random.rand(100, 6) # 100个样本,6个特征 y = np.random.randint(0, 3, size=100) # 三分类标签 # 初始化10折交叉验证分割器(shuffle可选,根据你的需求调整) kf = KFold(n_splits=10, shuffle=True, random_state=42) model = RandomForestClassifier(random_state=42) # 用来存储每折的预测结果(和置信度) fold_predictions = [] fold_probas = [] # 循环处理每折数据 for train_idx, test_idx in kf.split(X): # 拆分训练/测试集 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) y_proba = model.predict_proba(X_test) # 如果需要置信度则保留 # 把当前折的结果加入列表 fold_predictions.append(y_pred) fold_probas.append(y_proba) # 现在fold_predictions就是包含10个独立预测数组的列表 print(f"共收集到{len(fold_predictions)}折预测结果") print(f"第一折的预测数组形状:{fold_predictions[0].shape}") # 对应该折测试集的样本数
为什么这么做?
这个流程完全和cross_val_predict内部的逻辑一致,只是没有把结果合并回原数据的索引位置。这样你就能得到和cross_val_score结构类似的输出——一个包含10个元素的列表,每个元素对应一折的预测结果(或置信度),方便你进行后续的平均得分计算和两者的对比分析。
如果是回归任务,只需要把模型换成回归模型,去掉predict_proba相关代码即可(回归任务一般没有置信度输出,除非使用支持预测区间的特定模型)。
内容的提问来源于stack exchange,提问作者Sumped
相关产品推荐
相关产品推荐

