训练集、验证集、测试集的作用和意义

以下内容转自:

训练集、验证集和测试集的意义-JobPlus

在有监督的机器学习中,经常会说到训练集(train)、验证集(validation)和测试集(test),这三个集合的区分可能会让人糊涂,特别是,有些读者搞不清楚验证集和测试集有什么区别。

1 划分

如果我们自己已经有了一个大的标注数据集,想要完成一个有监督模型的测试,那么通常使用均匀随机抽样的方式,将数据集划分为训练集、验证集、测试集,这三个集合不能有交集,常见的比例是8:1:1,当然比例是人为的。从这个角度来看,三个集合都是同分布的。

如果是做比赛,官方只提供了一个标注的数据集(作为训练集)以及一个没有标注的测试集,那么我们做模型的时候,通常会人工从训练集中划分一个验证集出来。

2 参数

有了模型后,训练集就是用来训练参数的,说准确点,一般是用来梯度下降的。而验证集基本是在每个epoch完成后,用来测试一下当前模型的准确率。因为验证集跟训练集没有交集,因此这个准确率是可靠的。那么为啥还需要一个测试集呢?

这就需要区分一下模型的各种参数了。事实上,对于一个模型来说,其参数可以分为普通参数和超参数。在不引入强化学习的前提下,那么普通参数就是可以被梯度下降所更新的,也就是训练集所更新的参数。

另外,还有超参数的概念,比如网络层数、网络节点数、迭代次数、学习率等等,这些参数不在梯度下降的更新范围内。尽管现在已经有一些算法可以用来搜索模型的超参数,但多数情况下我们还是自己人工根据验证集来调。

3 所以

那也就是说,从狭义来讲,验证集没有参与梯度下降的过程,也就是说是没有经过训练的;但从广义上来看,验证集却参与了一个“人工调参”的过程,我们根据验证集的结果调节了迭代数、调节了学习率等等,使得结果在验证集上最优。因此,我们也可以认为,验证集也参与了训练。

那么就很明显了,我们还需要一个完全没有经过训练的集合,那就是测试集,我们既不用测试集梯度下降,也不用它来控制超参数,只是在模型最终训练完成后,用来测试一下最后准确率。

然而

聪明的读者就会类比到,其实这是一个无休止的过程。如果测试集准确率很差,那么我们还是会去调整模型的各种参数,这时候又可以认为测试集也参与训练了。好吧,我们可能还需要一个“测试测试集”,也许还需要“测试测试测试集”...

算了吧,还是在测试集就停止吧。

我们通常不再划分一个测试集,可能的原因有两个:

1、我们也没法保证要提交的测试集是否跟训练集完全同分布,因此再划分一个跟训练集同分布的测试集就没多大意义了。

2、如果测试集准确率很差,那么我们还是会去调整模型的各种参数,这时候又可以认为测试集也参与训练了。

以下内容转自:

训练集、验证集、测试集的作用_22年继续加油!的博客-CSDN博客_训练集和测试集的作用

2. 训练集、验证集、测试集的作用
训练集(Training set)的作用:更新模型参数。

验证集(开发集)(Dev set) 的作用:评估训练得到的多种不同模型或者是带着不同参数的同一模型的效果,再根据模型在验证集的效果对模型进行选择和调参(因此可以说验证集也参与了训练),使得模型效果在验证集达到最优,最后选出效果最好的模型。

测试集(Test set) 的作用:对最终筛选出来模型的泛化能力进行评价。测试集最重要的是未知,即用一个学习集之外的数据集来对模型的效果进行评估,看看模型能否给出合适的输出;就像是用一张你平时刷题没刷到过的题组成的卷子,来检验你对知识的掌握情况,这样才合理嘛。

另外,我想提一下这个: 对于测试集的作用,Ng原话是:对最终选定模型的性能进行无偏估计。我刚看课程时是云里雾里的,后面发现对于测试集作用,两句话其实是一个意思😑。
下面为个人理解:无偏估计(概率论的东西),就是估计量的期望值等于被估计量的真实值。最重要的是这一句:样本均值的期望是总体均值的无偏估计。证明如下:(专门开个word写一遍。。)

上面是纯概率论的东西,现在把它代入到深度学习里面。把模型的性能评价指标(误差、准确度什么的)当成是随机变量X,在有n个数据的测试集上,你计算n个数据得到的n个指标值(即上面的X1~Xn),再除以n,不就得到样本均值的期望了(这里的样本是指标的值,不是指数据集里的那种样本)。根据样本均值的期望是总体均值的无偏估计,所以计算测试集上的性能评价指标平均值其实就是在对模型的总体性能做无偏估计,这个过程同时也是在对模型泛化性能进行评价。


3. 一些杂碎的东西
① 过拟合
一切试图提升效果的改变都会导致过拟合。比如对训练集的过拟合:你用梯度下降的方式对模型参数进行多次的调整,来降低train loss,经过多次调整后,模型对于训练集的拟合效果会特别好,然而对于验证集的拟合可能效果就不是特别好(就是泛化能力差),这就导致了过拟合。 亦或者是验证集的过拟合:你每次训练完若干批样本后,要用验证集对模型性能进行评估,然后多次调整超参数,让模型在验证集上的性能变得更好,这其实会在超参数层面的过拟合了。

② 验证集和测试集的区别
二者都有对模型效果进行评估的作用,它们最重要的区别在于对于模型是否未知。在用验证集进行人工调参的过程中,验证集对于模型是已知的。验证集在被反复使用,用于让模型朝着对验证集拟合甚至过拟合的方向前进,所以测试集的数据是肯定不能和验证集的数据混杂在一起的:混杂在一起就好比就是你把期末考试的题(未知)泄露到期末考前模拟题(已知)里面,这样期末考出来成绩虚高(在这个泄露数据的测试集里,模型性能指标好),学生可能没真正掌握知识点(泛化能力差,导致对于学习集之外的样本可能给不出合适的输出);而测试集仅仅使用一次来评价你调整完的最终模型的性能。

③ 三者划分比例
以下都是Ng课上提到的thumb rules:

小数据集(几千,几万个样本):train/test 7: 3 train/dev/test 6:2:2。
大数据集(百万级):验证集大概取1%即可挑出效果好的模型,测试集大概取1000左右个就足够评估最终模型的性能了。所以通常是train/dev/test 98:1:1,或者是继续压缩dev、test的占比。
④ 训练样本与 验证样本、测试样本分布不匹配的问题
比如对识别猫这一任务,你训练的图片可能是高像素、经过后期处理的;而你的验证样本和测试样本来源于用户手机随手拍的模糊猫图,这就导致样本分布不匹配的问题。而验证集是用来对多个模型性能进行评估和对模型性能进一步优化,我们是选择在验证集上效果最好的模型作为最终模型,并在测试集上进行模型性能评估。因此,要保证验证样本和测试样本来自同一分布。

⑤ 关于测试集
测试集不是必要的,训练集和验证集才是必要的。你要通过训练集让模型不断地学习新东西,然后用验证集来判断模型效果的好坏,然后调整模型,多次迭代得到最终模型。你得到最终模型靠的是训练集和验证集,测试集只不过是对你最终模型的效果进行评估而已。
————————————————
版权声明:本文为CSDN博主「22年继续加油!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/coolyuan/article/details/122628830

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值