ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

06 模型选择与 Cross Validation:为什么不能只做一次 Train/Test Split?

2026/8/12 22:45:37 拓冰建站 浏览量
06 模型选择与 Cross Validation:为什么不能只做一次 Train/Test Split?

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% Test

Train 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=1kScorei

例如:

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 B

5-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 到底应该选多少?