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

使用cross_val_score时如何每次打乱数据?解决交叉验证结果重复问题

如何让cross_val_score每次运行都打乱数据,避免结果重复?

这问题我做实验时也碰到过!核心原因是:scikit-learn里cross_val_score默认用的交叉验证拆分器(分类任务默认是StratifiedKFold,回归任务默认是KFold),默认不开启打乱功能,所以每次拆分的训练/测试折完全一致,模型评估结果自然一模一样。

要实现每次运行都打乱数据生成不同的折,你只需要手动指定一个带shuffle=True参数的拆分器,传给cross_val_score的cv参数就行,具体分两种场景:

分类任务(比如你的RidgeClassifier场景)

推荐用StratifiedKFold,它会保持每个折里的类别比例和原始训练集一致,避免类别分布失衡影响评估结果:

from sklearn import linear_model
from sklearn.model_selection import cross_val_score, StratifiedKFold

clf = linear_model.RidgeClassifier()
n_folds = 10

# 创建带打乱功能的分层交叉验证拆分器
# 若需要复现某次拆分结果,就设置random_state(比如42);不需要的话可以去掉该参数
cv_splitter = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=42)

# 将拆分器传入cross_val_score的cv参数
scores = cross_val_score(clf, X_train, y_train, cv=cv_splitter)
  • 不设置random_state时,每次运行代码都会随机打乱数据生成不同的折,得到的scores也会不一样;
  • 设置random_state时,虽然会打乱数据,但每次的拆分结果是固定的,方便你复现实验结果。

回归任务

如果是回归问题,直接用KFold并开启打乱即可:

from sklearn.model_selection import KFold

cv_splitter = KFold(n_splits=n_folds, shuffle=True, random_state=42)
scores = cross_val_score(clf, X_train, y_train, cv=cv_splitter)

这样修改后,你每次运行cross_val_score都会得到不同的交叉验证结果啦!

内容的提问来源于stack exchange,提问作者yalpsid eman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:48:43