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
相关产品推荐
相关产品推荐

