如何理解scikit-learn中cross_val_predict的输出及工作原理?
理解sklearn中cross_val_predict的工作原理
你提到的cross_val_predict和cross_val_score共享相同的K折交叉验证逻辑,但两者的输出目标完全不同:
核心工作流程
当你设置cv=3时,训练集被平均分成3份(每份20000个样本),然后执行3轮训练-预测:
- 第1轮:用第1、2份样本训练模型,对第3份样本做预测,得到20000个预测结果
- 第2轮:用第1、3份样本训练模型,对第2份样本做预测,得到20000个预测结果
- 第3轮:用第2、3份样本训练模型,对第1份样本做预测,得到20000个预测结果
最后,这3轮的预测结果会按照原训练集的样本顺序拼接起来,最终得到一个长度和训练集完全一致(60000个)的数组——每个样本都对应一次它作为验证集时的预测值,也就是"out-of-fold"预测。
和cross_val_score的区别
cross_val_score返回的是每一轮验证集上的评分(比如准确率),所以输出长度等于折数(这里是3)cross_val_predict返回的是每个训练样本在自己被当作验证集时的预测结果,所以输出长度等于训练集样本数
为什么要这么做
这种方式能让你用完全未参与过当前样本训练的模型来预测每个训练样本,避免了用训练数据直接测试导致的评估偏差,常用来生成可靠的混淆矩阵、计算精确率/召回率等指标。
你的代码示例中,y_train_pred里的每个元素,都是对应位置的训练样本在某一轮交叉验证中作为验证集时,由另外两份数据训练出的模型给出的预测。
from sklearn.datasets import fetch_openml mnist = fetch_openml('mnist_784', version=1, as_frame=False) X, y = mnist["data"], mnist["target"] X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] y_train_5 = (y_train == 5) from sklearn.linear_model import SGDClassifier sgd_clf = SGDClassifier(max_iter=1000, tol=1e-3, random_state=42) from sklearn.model_selection import cross_val_predict y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
内容的提问来源于stack exchange,提问作者Africanus
相关产品推荐
相关产品推荐

