k-fold本身不评估稳定性,真正反映稳定性的指标是各折分数的标准差;标准差越小,模型表现越一致。平均准确率会掩盖某折严重异常(如[0.92, 0.91, 0.93, 0.55, 0.90]均值0.84但一折仅0.55),须用cross_val_score获取全部原始分并计算std,>0.03需排查原因。

直接说结论:K-Fold 本身不评估“稳定性”,它只是把数据切分后重复训练评估,真正反映稳定性的,是各折 score 的标准差(或极差)——标准差越小,模型在不同子集上的表现越一致,才说明稳定性好。
为什么不能只看平均准确率?
平均准确率高,可能掩盖某几折严重过拟合或欠拟合。比如 5 折结果是 [0.92, 0.91, 0.93, 0.55, 0.90],均值 0.84 看似还行,但第 4 折掉到 0.55,明显存在数据划分敏感或异常样本干扰。这时候光报 cross_val_score(...).mean() 就会误判。
实操建议:
- 永远同时获取所有折的原始分数:
cv_results = cross_val_score(model, X, y, cv=5),而不是只调用.mean() - 用
np.std(cv_results)看离散程度;若 > 0.03(分类任务),就得查原因 - 配合
cross_val_predict检查各折预测结果分布,比单纯看 score 更早发现 label leakage 或 stratification 失效
cross_val_score 默认用什么评分?怎么改?
默认用模型自身的 score() 方法(如 LogisticRegression.score() 返回 accuracy)。但这不总是你想要的——比如类别不平衡时 accuracy 毫无意义。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
实操建议:
- 显式传入
scoring参数,避免隐式依赖:scoring='f1'、scoring='roc_auc'、scoring='neg_mean_squared_error'(注意带neg_前缀的回归指标是负值) - 多指标评估必须用
cross_val_predict+ 手动计算,cross_val_score不支持一次返回多个 score - 自定义 scorer 要用
make_scorer包装,尤其当函数需要greater_is_better=False(如误差类指标)
为什么 K=5 不一定比 K=10 更稳定?
K 越大,每折训练集越接近全量数据,bias 越小,但方差往往变大——因为各折间训练集高度重叠,模型相似度高,偶然某个噪声样本被反复使用,会导致所有折 score 同步异常波动。
实操建议:
- 小数据集(
n_samples )优先用 <code>StratifiedKFold(n_splits=3),减少划分随机性影响 - 中等数据(1k–10k)用
StratifiedKFold(n_splits=5)是经验平衡点 - 不用
KFold(无分层)做分类任务,否则某折可能缺少数类样本,score直接报UndefinedMetricWarning - 想测稳定性?固定
random_state后,多次运行不同cv划分(如 5 次 5-fold),看 score 标准差的分布,比单次 K 增大更有说服力
真正容易被忽略的点:稳定性不是模型固有属性,它和数据划分方式强相关。同一模型在 StratifiedKFold 下 std=0.01,在普通 KFold 下可能飙到 0.08——别急着调参,先检查 cv 对象是不是真适合你的标签分布。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










