1. 模型训练的最终目标不是”考好”,而是”能打”
1.1 训练 vs 实战
训练模型的流程:
历史带标签数据 → 训练模型 → 评价指标达标 → 部署 → 对新数据(无标签)做预测
例如垃圾邮件识别:用大量已标注的历史邮件训练 → 准确率达标 → 部署 → 每来一封新邮件就判断是否垃圾邮件。
1.2 为什么不能拿训练数据上的表现来评价模型?
因为模型可能不是”学会规律”,而是”背下了答案”。
如果把所有数据都用于训练,模型只需记住每条数据”feature 对应什么 label”,在训练数据上表现完美。但一遇到没见过的新数据,就原形毕露。
所以需要把数据划出一部分不让模型看到,用这部分来评估模型的泛化能力(generalization)。
2. 三兄弟:训练集、验证集、测试集
| 集合 | 作用 | 使用频率 |
|---|---|---|
| 训练集(Train) | 训练模型,调整参数(w, b) | 最高 — 每轮迭代都用 |
| 验证集(Validation) | 训练过程中评估性能,据此调整超参数 | 中等 — 每隔若干轮用一次 |
| 测试集(Test) | 最终只使用一次,给出模型真实表现的客观评价 | 仅一次 |
2.1 训练集
模型直接从中学习的数据。模型会反复迭代这些数据,梯度下降每走一步都在用它。
2.2 验证集
不参与训练,但用来在训练过程中”监考”:
- 每训练若干轮,在验证集上跑一次评估
- 根据验证集的表现来决定:调整学习率、增加多项式特征、选择模型版本等
- 根据验证集表现选择最终模型(选验证集上表现最好的那个)
2.3 测试集
在模型选择完成后用于最终评估,不根据测试结果反复调参。
测试集的唯一作用:给你一个诚实的答案 —— “这个模型在从未见过的数据上,到底表现怎样?”
3. 为什么验证集和测试集要分开?
这是最容易困惑的地方:既然都是”模型没见过的数据”,为什么不能合二为一?
核心原因:验证集间接影响了模型。
你在验证集上调了学习率 → 模型变了
你在验证集上选了最佳轮次 → 模型变了
你在验证集上挑了特征组合 → 模型变了
你在验证集上对比多个模型 → 最终选哪个也是验证集说了算
这个过程中,你的模型已经在”适应”验证集了。验证集上的评估结果不再客观——模型可能在验证集上过拟合。
测试集的存在就是为了给出一个完全不受污染的最终评判。你不能根据测试集结果做任何调整,看一眼就得认。
一个类比:
- 训练集 = 平时的作业题(反复练习)
- 验证集 = 模拟考(不记入最终成绩,但根据它调整复习策略)
- 测试集 = 高考(只考一次,决定最终分数)
4. 保证三个集合分布一致
这非常重要,却容易被忽略。
如果训练集是中文邮件,验证集和测试集是英文邮件——模型在验证集上表现差,你根本不知道是模型不行还是数据分布不匹配。
独立同分布样本:可随机划分
# 先将所有数据随机打乱,再按比例切分
indices = torch.randperm(len(data)) # 随机排列索引
data = data[indices]
train_data = data[:train_size]
val_data = data[train_size:train_size + val_size]
test_data = data[train_size + val_size:]
随机划分适用于近似独立同分布的数据,并不能保证三个集合在所有方面完全同分布。类别失衡时可分层抽样;同一患者、用户或设备的相关样本应按组划分;预测未来的时间序列应按时间划分,避免未来数据进入训练集。标准化、插补和特征选择都应只在训练集拟合,再应用于验证、测试集。
5. 划分比例
没有严格规定,取决于数据量:
| 时代 | 数据量 | 典型划分 |
|---|---|---|
| 传统机器学习 | 几百 ~ 几万 | 训练 70 |
| 大数据 / 深度学习 | 百万 ~ 万亿 | 验证集和测试集各取足够客观评估的量即可(如各 10000 条),其余全给训练集 |
核心原则:验证集和测试集不用很大,够用就行;训练数据多多益善。
6. 一个常见的术语陷阱
实际工作中,你可能会听到同行这样说:
“我们划分了训练集和测试集,基于测试集的表现来调参。”
他说的**“测试集”其实就是验证集**。
他的实际做法是:
- 在训练集上训练
- 在所谓”测试集”上评估
- 根据评估结果调超参数、选模型
- 最终得到一个”在测试集上表现最好”的模型
但这样做完,他得到了一个”最好的模型”,却没有得到对模型真实泛化能力的客观评分——因为那个所谓的”测试集”已经被用来影响模型选择了。
记住:真正意义上的测试集,你只能看一次。用过之后就不能再动模型了。
7. 总结
数据 → Shuffle(随机打乱)
→ 训练集(反复使用,训练参数)
→ 验证集(间或使用,调整超参、选择模型)
→ 测试集(仅用一次,给出最终评价)
关键原则:
1. 按部署目标划分:独立样本可随机,相关样本按组,时序按时间
2. 验证集间接影响模型 → 不能当作客观评价
3. 测试集只测一次 → 给出真实泛化能力
4. 实际交流中别人说的"测试集"很可能就是验证集