cross_val_score可快速横向比较模型,通过k折交叉验证返回各模型得分均值与标准差,适合初筛;需注意分类用accuracy、回归显式指定scoring,统一预处理,避免直接用gridsearchcv比模型。

怎么用 cross_val_score 快速横向比模型
直接拿几个模型丢进 cross_val_score,比平均分和方差最省事。它不训练最终模型,只做 K 折交叉验证打分,适合初筛。
注意点:
-
cross_val_score默认用scoring="accuracy",分类任务没问题,但回归得显式写成scoring="neg_mean_squared_error"或"r2",否则返回负值容易误读 - 不同模型对数据缩放敏感度不同(比如
SVM、KNeighborsClassifier对StandardScaler依赖强,而RandomForestClassifier基本不用),不统一预处理会导致比较失真 - 默认
cv=5,小数据集建议提至cv=10,但别盲目上LeaveOneOut——计算开销陡增,且方差未必更小
示例:比较逻辑回归和随机森林在二分类上的 CV 准确率
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
lr = LogisticRegression(max_iter=1000)
rf = RandomForestClassifier(n_estimators=100)
lr_scores = cross_val_score(lr, X, y, cv=5)
rf_scores = cross_val_score(rf, X, y, cv=5)
print(f"LR: {lr_scores.mean():.3f} ± {lr_scores.std():.3f}")
print(f"RF: {rf_scores.mean():.3f} ± {rf_scores.std():.3f}")
为什么 GridSearchCV 不该用来直接比模型
GridSearchCV 是调参工具,不是模型比较工具。拿它分别跑两个模型再比最佳得分,结果不可靠——因为每个模型的超参空间、搜索粒度、早停策略都不同,得分差异可能来自调参强度而非模型本身能力。
真实场景中更稳妥的做法是:
- 先用
cross_val_score粗筛出 2–3 个潜力模型 - 再对这些模型各自做
GridSearchCV(或RandomizedSearchCV),固定相同的cv策略和scoring - 最后用
search.cv_results_提取「各模型最优参数下的 CV 得分」,并检查标准差是否稳定
特别提醒:GridSearchCV 的 refit=True 会额外在全量训练集上再训一次,这个模型不能用于跨模型比较——它只是部署用的最终版本。
如何避免 train_test_split + 单次评估带来的假优势
只分一次训练/测试集,然后在测试集上比准确率,极易得出错误结论。某次随机划分恰好让某个模型“撞上”测试样本分布,分数虚高。
正确做法是嵌套验证:
- 外层用
cross_val_score或StratifiedKFold划分数据 - 内层对每折训练集做完整的超参搜索(即用
GridSearchCV) - 用外层每折的测试集评估内层选出的最优模型,汇总得分
Scikit-learn 提供了 cross_val_score 与 GridSearchCV 组合的惯用法,但要注意传入的是已封装好预处理+模型的 Pipeline,否则特征缩放等步骤会在每折重复拟合,造成数据泄露。
评估指标选错会让模型排名完全颠倒
准确率(accuracy)在类别不平衡时毫无意义。比如 95% 样本是负类,一个永远预测负类的模型准确率也有 95%,但它毫无实用价值。
- 二分类优先看
f1(尤其f1_weighted或f1_macro)、average_precision或roc_auc - 多分类用
precision_macro、recall_macro,别只盯accuracy - 回归任务慎用
mean_absolute_error和mean_squared_error直接对比——前者对异常值鲁棒,后者惩罚大误差,业务目标决定选哪个
关键细节:所有 scoring 字符串必须和 sklearn.metrics.SCORERS.keys() 中一致,拼错(如写成 "f1_score")会导致静默回退到默认 accuracy,很难排查。
模型比较真正的难点不在代码,而在控制变量:同样的数据划分、同样的预处理、同样的评估协议、同样的随机种子。漏掉其中任意一环,对比结果就只是巧合。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











