You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:16:03