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

