06 模型选择与 Cross Validation:为什么不能只做一次 Train/Test Split?
模型训练完成以后,我们通常会面临一个问题:
Model A Model B Model C到底哪个模型更好?
或者:
max_depth = 3 max_depth = 5 max_depth = 10哪个超参数更好?
这就是:
Model Selection 模型选择而 Cross Validation 是模型选择中最重要的方法之一。
一、最简单的 Train/Test Split
最基本的方法是:
Dataset ↓ Train Set Test Set例如:
80% Train 20% TestTrain Set 用于训练模型。
Test Set 用于最终评估模型。
这种方法简单,但是存在一个问题:
评估结果可能非常依赖这一次随机划分。
二、一次划分可能具有偶然性
假设数据集并不大。
第一次划分:
Train Set 比较容易 Test Set 比较容易模型得到:
Accuracy = 92%第二次划分:
Test Set 恰好包含很多困难样本模型可能只有:
Accuracy = 84%那么:
92% 84%哪一个才更接近模型的真实泛化能力?
这就是单次划分的问题。
三、Cross Validation 的基本思想
Cross Validation 中文通常称为:
交叉验证核心思想是:
不要只验证一次,而是让不同样本轮流进入验证集。
最常见的方法就是:
k-fold Cross Validation四、k-fold Cross Validation
假设:
k = 5把数据分成:
Fold 1 Fold 2 Fold 3 Fold 4 Fold 5第一次:
Train: Fold 2 Fold 3 Fold 4 Fold 5 Validation: Fold 1第二次:
Train: Fold 1 Fold 3 Fold 4 Fold 5 Validation: Fold 2一直重复到:
每一个 Fold 都作为一次 Validation Set五、5-fold Cross Validation
可以表示为:
Round 1: [V][T][T][T][T] Round 2: [T][V][T][T][T] Round 3: [T][T][V][T][T] Round 4: [T][T][T][V][T] Round 5: [T][T][T][T][V]其中:
T = Training V = Validation最后得到五个分数:
0.88 0.91 0.87 0.90 0.89最终可以计算平均值:
Mean=1k∑i=1kScoreiMean=\frac{1}{k}\sum_{i=1}^{k}Score_iMean=k1i=1∑kScorei
例如:
Mean=0.88+0.91+0.87+0.90+0.895=0.89Mean=\frac{0.88+0.91+0.87+0.90+0.89}{5}=0.89Mean=50.88+0.91+0.87+0.90+0.89=0.89
于是:
CV Score = 0.89六、为什么 Cross Validation 更可靠?
因为每一个样本都有机会:
作为 Training Data 同时也作为 Validation Data因此模型评估不会过度依赖:
某一次幸运或不幸运的数据划分Cross Validation 能更稳定地估计模型的:
generalization performance 泛化性能七、Cross Validation 不是 Test Set 的替代品
这是非常重要的一点。
标准流程应该是:
原始 Dataset ↓ Train / Test Split ↓ Train 部分内部 做 Cross Validation ↓ 选择模型和超参数 ↓ 使用整个 Train Set 重新训练 ↓ 最后只在 Test Set 上评估一次也就是说:
Cross Validation 用于模型选择 Test Set 用于最终考试八、为什么不能反复使用 Test Set?
假设你不断尝试:
Model A Model B Model C Model D每次都查看 Test Accuracy。
然后选择 Test Accuracy 最高的模型。
虽然模型没有直接在 Test Set 上训练,但是:
你的模型选择决策已经使用了 Test Set 的信息。
这样实际上就产生了:
Test Set Leakage最终的 Test Score 会变得过于乐观。
九、Validation Set 和 Test Set 的区别
可以把整个数据划分理解为:
Training Set → 学参数 Validation Set → 选模型、选超参数 Test Set → 最终评价而 k-fold Cross Validation 本质上就是:
在 Training Data 内部更加高效地构造多个 Validation Set。
十、Cross Validation 如何用于模型选择?
假设有两个模型:
Model A Model B5-fold 结果:
Model A: 0.88 0.89 0.90 0.87 0.91 Model B: 0.90 0.92 0.86 0.91 0.89除了平均值,还应该观察波动。
例如:
Mean Standard Deviation因为一个模型可能:
平均分高 但不同 Fold 波动非常大这说明模型稳定性可能较差。
十一、Cross Validation 可以用于选择什么?
常见用途包括:
模型类型选择 超参数选择 特征选择 预处理策略比较 阈值策略比较例如:
Decision Tree: max_depth = 3 5 7 10对每一个参数执行 5-fold CV。
比较平均 F1。
选择表现最好的参数。
十二、分类问题最好考虑 Stratified k-fold
假设:
Positive = 10% Negative = 90%普通随机划分可能导致某一个 Fold 中:
Positive 特别少因此分类任务中常使用:
Stratified k-fold它尽量保证:
每个 Fold 中的类别比例 接近整体数据集对于类别不平衡问题尤其重要。
十三、Cross Validation 也可能产生 Data Leakage
Cross Validation 并不是自动安全的。
例如你在划分 Fold 之前先使用整个数据集计算:
Normalization mean Feature scaling Feature selection PCA Missing value statistics那么 Validation Fold 的信息已经进入预处理过程。
这仍然属于:
Data Leakage正确流程应该是:
每一个 Fold 内: Train Fold → Fit preprocessing → Transform Train → Transform Validation 而不是: 整个 Dataset → Fit preprocessing → 再 Cross Validation十四、时间序列不能随便使用普通 k-fold
对于时间序列:
2021 2022 2023 2024 2025如果使用普通随机 k-fold,可能出现:
用 2025 年的数据训练 预测 2022 年这在真实部署场景中不合理。
时间序列应该保持:
过去 → 未来因此需要使用:
Time-based Split Rolling Validation Walk-forward Validation十五、Cross Validation 的核心价值
Cross Validation 的真正意义不是:
让模型分数更高而是:
更可靠地估计模型对未知数据的泛化性能,并降低一次随机划分带来的偶然性。
十六、总结
一个规范的模型选择流程可以概括为:
Dataset ↓ Train / Test Split ↓ Train Data ↓ k-fold Cross Validation ↓ 比较模型与超参数 ↓ 选择最佳方案 ↓ 在全部 Train Data 上重新训练 ↓ Test Set 最终评估下一篇将进一步讨论一个实际问题:
k 到底应该选多少?