交叉验证 (Cross-Validation)
概述
交叉验证(Cross-Validation, CV)是机器学习中评估模型泛化能力(Generalization)的核心技术。其基本思想是将数据集划分为多个互斥子集(Fold),轮流使用其中一部分作为验证集(Validation Set),剩余部分作为训练集(Training Set),通过多轮训练和评估取平均来获得更稳定、更可靠的模型性能估计。
Cross-validation is a resampling procedure used to evaluate machine learning models on a limited data sample. The procedure has a single parameter called k that refers to the number of groups that a given data sample is to be split into. As such, the procedure is often called k-fold cross-validation.
为什么需要交叉验证
简单留出法 (Hold-Out) 的问题
最简单的模型评估方法是将数据集按固定比例(如 80/20)划分为训练集和测试集,训练一次,评估一次。这种方法存在严重缺陷:
- 高方差:不同的划分方式可能导致完全不同的评估结果
- 数据浪费:大量数据被固定为测试集不参与训练,在小数据集上尤为致命
- 信息泄露风险:如果测试集被用于调参,模型评估将不再客观
交叉验证的解决方案
通过多次划分和平均,交叉验证能够:
- 降低评估结果的方差,提供更稳定的性能估计
- 充分利用所有数据,每个样本都有机会被验证
- 提供模型性能的置信区间(均值 +- 标准差)
主要交叉验证方法
1. K-Fold Cross-Validation (K 折交叉验证)
将数据集等分为 K 个 Fold,进行 K 次训练和评估,每次选 1 个 Fold 作为验证集,剩余 K-1 个 Fold 作为训练集。
关键特征:
- K 通常取 5 或 10
- 每个样本恰好被验证一次
- K 次训练,共训练 K 个模型
2. Stratified K-Fold (分层 K 折交叉验证)
在 K-Fold 的基础上,保证每个 Fold 中各类别的比例与原始数据集一致。这是分类任务的标准做法。
为什么需要分层:
- 普通 K-Fold 可能导致某个 Fold 中完全没有某个类别的样本
- 在不平衡数据集中,分层保证每个 Fold 都有代表性
- 减少评估方差,提供更稳定的估计
3. LOOCV (Leave-One-Out Cross-Validation)
K-Fold 的极端情况:K = N(样本总数),每次只留一个样本作为验证集,其余 N-1 个样本训练。
特性:
- 几乎无偏(Bias),因为每次训练几乎使用了全部数据
- 但方差极高,因为每次验证只有一个样本
- 计算成本极高:需要训练 N 次模型
- 仅适用于极小的数据集(N < 100)
4. Repeated K-Fold (重复 K 折)
对 K-Fold 进行多次重复,每次随机重新划分数据,取所有重复的平均值。这种方法进一步降低方差,但增加了计算成本。
交叉验证方法对比
| 维度 | K-Fold | Stratified K-Fold | LOOCV | Repeated K-Fold | Hold-Out |
|---|---|---|---|---|---|
| 训练次数 | K | K | N | K * R | 1 |
| 偏差 | 低 | 低 | 极低 | 低 | 高 |
| 方差 | 中等 | 低 | 极高 | 极低 | 极高 |
| 分类任务适用性 | 一般 | 最佳 | 一般 | 好 | 差 |
| 大数据集 (N>100K) | 好 | 好 | 不可行 | 可接受 | 可接受 |
| 小数据集 (N<1000) | 好 | 好 | 可接受 | 最佳 | 差 |
| 不平衡数据 | 差 | 最佳 | 差 | 好 | 差 |
| 计算成本 | 中等 | 中等 | 极高 | 高 | 低 |
如何选择 K
| K 值 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| K=2 | 计算最快 | 偏差大,方差大 | 不推荐 |
| K=5 | 计算与精度的平衡 | — | 通用推荐 |
| K=10 | 更稳定的估计 | 计算量翻倍 | 小数据集、竞赛 |
| K=N (LOOCV) | 几乎无偏 | 方差极大,计算极慢 | N<100 的小数据集 |
2026 年最佳实践
- 通用场景:Stratified K-Fold with K=5 或 K=10
- 大数据集 (>100K):K=5 足够,甚至可用 Hold-Out
- 时间序列:使用 TimeSeriesSplit(按时间顺序,不随机打乱)
- 组结构数据:使用 GroupKFold(同一组的数据不会同时出现在训练和验证集)
- 超参数调优:嵌套交叉验证(Nested CV),外循环评估性能,内循环选择超参数
交叉验证在模型选择中的角色
模型选择流程
- 对每个候选模型(或超参数组合),使用交叉验证计算平均验证误差
- 选择交叉验证误差最小的模型
- 在完整训练集上重新训练该模型
- 在独立的测试集上评估最终模型
常见陷阱
- 不要用交叉验证的验证误差直接作为最终性能报告:这会导致乐观偏差
- 数据预处理必须在每个 Fold 内独立进行:如标准化、缺失值填补等,不能使用全局统计量
- 不要根据交叉验证结果反复调参:这本质上泄漏了测试集信息
相关笔记
- 过拟合 (Overfitting) — 交叉验证是检测过拟合的核心工具
- 偏差方差权衡 (Bias-Variance Tradeoff) — 交叉验证帮助理解偏差-方差权衡
- 正则化 (Regularization) — 交叉验证用于选择正则化超参数
- 损失函数 (Loss Function) — 交叉验证中使用的评估指标
- 学习曲线 (Learning Curves) — 学习曲线与交叉验证互补使用
来源
- Stone, M. (1974). Cross-Validatory Choice and Assessment of Statistical Predictions. Journal of the Royal Statistical Society. https://doi.org/10.1111/j.2517-6161.1974.tb00994.x
- Kohavi, R. (1995). A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection. IJCAI. https://ai.stanford.edu/~ronnyk/accEst.pdf
- scikit-learn Cross-Validation: https://scikit-learn.org/stable/modules/cross_validation.html
- Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning, Chapter 7. https://hastie.su.domains/ElemStatLearn/