sklearn中cross_validate得分与estimator.score结果不一致问题
问题原因及解决办法
1. 数据集划分不匹配
你手动实现KFold时开启了shuffle=True并设置了random_state=40,但cross_validate默认使用的KFold是不打乱数据的,两种方式拆分出的训练/测试集完全不同,得分自然差异显著。
2. 手动验证逻辑错误
你在循环里用cross_validate输出的第一折模型svr[0]去测试所有折的测试集,这不符合交叉验证的核心逻辑——交叉验证需要每折单独训练一个模型,仅测试对应折的测试集,而非用同一个模型跑所有测试数据。
修正后验证代码
将手动KFold的设置与cross_validate对齐,同时按交叉验证逻辑每折单独训练模型:
from sklearn.svm import SVR from sklearn.model_selection import cross_validate, KFold import numpy as np # 生成数据集 X = np.sort(5 * np.random.rand(40, 1), axis=0) y = np.sin(X).ravel() y[::5] += 3 * (0.5 - np.random.rand(8)) # cross_validate 交叉验证 svr_rbf = SVR(kernel="rbf", C=100, gamma=0.1, epsilon=0.1) scores = cross_validate(svr_rbf, X, y, cv=5, return_estimator=True) # 手动实现与cross_validate一致的KFold(不打乱数据) kf = KFold(n_splits=5) manual_scores = [] 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] # 每折单独训练模型 fold_model = SVR(kernel="rbf", C=100, gamma=0.1, epsilon=0.1) fold_model.fit(X_train, y_train) # 计算当前折的测试得分 manual_scores.append(fold_model.score(X_test, y_test)) print("cross_validate 测试得分:", scores['test_score']) print("手动KFold 测试得分:", manual_scores)
运行后两组得分会完全一致。
为什么分类模型看起来差异小?
分类任务对数据顺序的敏感度通常低于回归任务,有时shuffle与否对准确率影响不大,所以你会觉得结果相近,但本质上如果划分方式不一致,分类任务同样会出现得分差异。
关于_passthrough_scorer
这个scorer的逻辑就是直接调用模型自带的score方法,没有额外处理,因此cross_validate的test_score本质就是每折训练好的模型在对应测试集上的score结果,和正确手动实现的逻辑完全一致。
内容的提问来源于stack exchange,提问作者ikarosss
相关产品推荐
相关产品推荐

