01_测试集 训练集 验证集的区别
训练集、验证集、测试集的区别详解
1. 一个生动的比喻:期末考试
想象你是一名学生,正在准备一场数学期末考试:
- 训练集(Training Set)=课本和练习题。你反复看、反复做,甚至背下了答案。这是你学习知识、掌握规律的唯一来源。
- 验证集(Validation Set)=考前模拟卷(押题卷)。每学完一个单元,你做一套模拟卷,看看哪里没学好,然后调整学习策略(比如多攻应用题,少练计算题)。注意:你只看模拟卷的分数,但绝不把模拟卷的答案背下来当课本学。
- 测试集(Test Set)=正式高考卷。在此之前你从未见过这些题。高考成绩才是评判你真实水平的唯一标准。绝对禁止在考前偷看高考题,否则成绩毫无意义。
2. 核心区别(从机器学习的角度)
| 维度 | 训练集 | 验证集 | 测试集 |
|---|---|---|---|
| 核心目的 | **让模型“记住”**数据中的规律(拟合参数)。 | **帮模型“选”**最好的超参数(如学习率、网络层数),并防止过拟合。 | 给模型“打分”,评估其最终的真实泛化能力。 |
| 模型是否“看见” | 能看见。模型会反复多次学习这些数据。 | 能看见(间接)。模型不看标签,但人类会根据验证集的结果调整模型结构。 | 不能看见。模型在整个训练过程中绝对无法接触测试集,直到最后。 |
| 参与参数更新吗 | 参与。这是唯一用来更新权重和偏置的数据。 | 不参与。它只用于评估,不反向传播修改模型参数。 | 不参与。它只在最终做一次性评估。 |
| 过拟合风险 | 极高。模型可能把训练集背下来。 | 中等。如果基于验证集调参太多,模型会“偷偷”拟合验证集。 | 无风险(只要不用它调参)。它是唯一的“公证员”。 |
3. 为什么要分三份?只分训练和测试不行吗?
不行。原因在于**“验证集”解决了调参时的“泄露”**问题。
- 如果你只有训练集和测试集,你每次调完参数都去测试集上试一下,试了100次后选了个最好的。
- 表面上看测试集准确率很高,但实际上你已经把测试集的特征“泄露”给了模型,模型已经在“作弊”了。
- 验证集的作用就是充当“中间隔离带”,让你随便调参,最后只拿从未参与调参的测试集来定胜负。
4. 验证集与测试集在工程上的微妙区别(常见误区)
在实际工作中,很多人会把验证集和测试集混用,这里澄清两点:
- 验证集(Dev/Val Set):你(人类)要经常看。你需要根据它在TensorBoard上的损失曲线,决定是加大学习率还是增加层数。
- 测试集(Test Set):你(人类)尽量不看。只在论文投稿、比赛提交结果或项目交付前跑一次。如果跑出来分数不理想,你回头去改模型,改完后再跑的那个测试集就不再是“测试集”了,它已经变成了你新的“验证集”。
5. 数据量怎么分?(实操建议)
在数据量充足的情况下,经典比例是6:2:2或7:1.5:1.5(训练:验证:测试)。
但实际工作中更有参考价值的是:
- 数据量极大(百万级以上):可以把验证集和测试集设得较小,比如98:1:1。因为几万条数据足够验证模型变化了。
- 数据量极小(几千条):不建议划分验证集!因为数据太宝贵了。此时应使用K折交叉验证(K-Fold CV),即轮流把其中1份当作验证集,其余训练,最后取平均成绩。
6. 特别提示:当心“验证集”和“测试集”命名的坑
在很多开源项目(如Kaggle竞赛)中,你下载到的文件经常命名为:
train.csv(训练集)—— 带标签,给你学。valid.csv或dev.csv(验证集)—— 带标签,给你调参。test.csv(测试集)——不带标签,只供你预测后提交给平台打分。
注意:在Kaggle上,他们口中说的“Public Leaderboard”分数,其实是用测试集的一部分算的,这在实际定义中更接近于**“公开验证集”;而“Private Leaderboard”才是真正的“最终测试集”**。
