三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

01_测试集 训练集 验证集的区别

01_测试集 训练集 验证集的区别

训练集、验证集、测试集的区别详解

1. 一个生动的比喻:期末考试

想象你是一名学生,正在准备一场数学期末考试:

  • 训练集(Training Set)=课本和练习题。你反复看、反复做,甚至背下了答案。这是你学习知识、掌握规律的唯一来源。
  • 验证集(Validation Set)=考前模拟卷(押题卷)。每学完一个单元,你做一套模拟卷,看看哪里没学好,然后调整学习策略(比如多攻应用题,少练计算题)。注意:你只看模拟卷的分数,但绝不把模拟卷的答案背下来当课本学。
  • 测试集(Test Set)=正式高考卷。在此之前你从未见过这些题。高考成绩才是评判你真实水平的唯一标准。绝对禁止在考前偷看高考题,否则成绩毫无意义。

2. 核心区别(从机器学习的角度)

维度训练集验证集测试集
核心目的**让模型“记住”**数据中的规律(拟合参数)。**帮模型“选”**最好的超参数(如学习率、网络层数),并防止过拟合。给模型“打分”,评估其最终的真实泛化能力。
模型是否“看见”能看见。模型会反复多次学习这些数据。能看见(间接)。模型不看标签,但人类会根据验证集的结果调整模型结构。不能看见。模型在整个训练过程中绝对无法接触测试集,直到最后。
参与参数更新吗参与。这是唯一用来更新权重和偏置的数据。不参与。它只用于评估,不反向传播修改模型参数。不参与。它只在最终做一次性评估。
过拟合风险极高。模型可能把训练集背下来。中等。如果基于验证集调参太多,模型会“偷偷”拟合验证集。无风险(只要不用它调参)。它是唯一的“公证员”。

3. 为什么要分三份?只分训练和测试不行吗?

不行。原因在于**“验证集”解决了调参时的“泄露”**问题。

  • 如果你只有训练集和测试集,你每次调完参数都去测试集上试一下,试了100次后选了个最好的。
  • 表面上看测试集准确率很高,但实际上你已经把测试集的特征“泄露”给了模型,模型已经在“作弊”了。
  • 验证集的作用就是充当“中间隔离带”,让你随便调参,最后只拿从未参与调参的测试集来定胜负。

4. 验证集与测试集在工程上的微妙区别(常见误区)

在实际工作中,很多人会把验证集和测试集混用,这里澄清两点:

  1. 验证集(Dev/Val Set)你(人类)要经常看。你需要根据它在TensorBoard上的损失曲线,决定是加大学习率还是增加层数。
  2. 测试集(Test Set)你(人类)尽量不看。只在论文投稿、比赛提交结果或项目交付前跑一次。如果跑出来分数不理想,你回头去改模型,改完后再跑的那个测试集就不再是“测试集”了,它已经变成了你新的“验证集”

5. 数据量怎么分?(实操建议)

在数据量充足的情况下,经典比例是6:2:27:1.5:1.5(训练:验证:测试)。

但实际工作中更有参考价值的是:

  • 数据量极大(百万级以上):可以把验证集和测试集设得较小,比如98:1:1。因为几万条数据足够验证模型变化了。
  • 数据量极小(几千条)不建议划分验证集!因为数据太宝贵了。此时应使用K折交叉验证(K-Fold CV),即轮流把其中1份当作验证集,其余训练,最后取平均成绩。

6. 特别提示:当心“验证集”和“测试集”命名的坑

在很多开源项目(如Kaggle竞赛)中,你下载到的文件经常命名为:

  • train.csv(训练集)—— 带标签,给你学。
  • valid.csvdev.csv(验证集)—— 带标签,给你调参。
  • test.csv(测试集)——不带标签,只供你预测后提交给平台打分。

注意:在Kaggle上,他们口中说的“Public Leaderboard”分数,其实是用测试集的一部分算的,这在实际定义中更接近于**“公开验证集”;而“Private Leaderboard”才是真正的“最终测试集”**。

← 返回列表