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

Sklearn交叉验证:不同指标调用cross_val_score是否用相同划分?

关于Sklearn cross_val_score的折划分一致性问题

好问题!这是很多人在做交叉验证时容易忽略的细节,我来给你理清楚:

核心结论

默认情况下,不一定会生成相同的10折划分,具体分两种情况:

  • 如果你的cross_val_score调用没有手动指定cv参数,或者使用的是默认的KFold/StratifiedKFold且开启了shuffle=True但没固定random_state:每次调用的划分会随机生成,大概率不同。
  • 如果是默认的shuffle=False(分类任务默认是StratifiedKFold(shuffle=False),回归是KFold(shuffle=False)):划分是固定的,但这种按原始数据顺序拆分的方式容易导致数据分布不均(比如样本按类别/标签排序时,单折的类别比例失衡),一般不推荐。

如果需要保证不同指标的交叉验证使用完全相同的训练/测试划分(这对于公平对比指标得分非常重要),你需要先手动创建一个固定的折划分对象,再传给cross_val_score。

代码示例

不推荐的方式(划分可能不一致)

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
model = RandomForestClassifier()

# 两次调用可能使用不同的划分(若默认cv开启shuffle且无固定随机种子)
accuracy_scores = cross_val_score(model, X, y, cv=10, scoring='accuracy')
precision_scores = cross_val_score(model, X, y, cv=10, scoring='precision_macro')

推荐的方式(固定划分)

from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
model = RandomForestClassifier()

# 创建固定的10折划分:shuffle=True保证数据打乱,random_state固定随机种子
cv_splitter = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)

# 两次调用都传入同一个cv_splitter,确保划分完全一致
accuracy_scores = cross_val_score(model, X, y, cv=cv_splitter, scoring='accuracy')
precision_scores = cross_val_score(model, X, y, cv=cv_splitter, scoring='precision_macro')

为什么要这么做?

当你对比不同指标(比如accuracy和precision)的得分时,相同的划分能让对比更公平:同一折的测试集在两个指标计算中完全一致,得分差异完全来自指标本身的特性,而不是因为测试集不同导致的波动。

内容的提问来源于stack exchange,提问作者Akhmad Zaki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:10:03