测试集可用作验证集;验证集不能来自训练集!(交叉验证,留一法)

首先,搞清楚验证集的作用

验证集是用来让我们验证一下网络的当前训练结果,以便于我们观察模型的泛化能力,看模型是否有过拟合,以调整网络的超参数如网络架构,学习率等。注意网络的训练并没有真的用到验证集,因为验证期间没有计算梯度,没有更新参数

然后细说三大集

我们知道,传统机器学习的根本假设是:用于训练模型的数据和用来测试模型的数据来自同一个概率分布

对于size很大的数据集,我们可以理想一点,认为他们服从这个根本假设。既然数据集很大,那我们就可以奢侈一点,把数据集划分为术业有专攻的三块:训练集,验证集,测试集。

但是其实很多时候只分为两块,即训练集和测试集,一是因为数据量有限,二是因为测试集可以身兼两职,既可以用作验证集来验证模型的训练结果,又可以用来得到最终测试结果。

分为两块的这种划分还有个专门的名字,叫做“留出法”。
在这里插入图片描述
在这里插入图片描述

训练集

训练集用来训练NN,即根据反向传播的误差对每个参数的梯度进行参数更新;

验证集

验证集专门用来看看每经过1个epoch的训练之后,NN的性能如何,即验证一下当前模型的能力,那当然要用模型从来没见过的数据,即验证集绝对不能来自训练集

如果把训练集的一部分作为验证集,那模型当然会表现很好,因为已经见过了,并且根据这些数据还做了自我校正。就像考试出原题无法验证考生的真实学习能力一样。

最重要的一点:验证NN性能的过程不会更新网络的参数,因为验证时停止了梯度的反向传播!这一点一看代码就知道了。

所以!验证就是测试,测试就是验证,使用的是同样的代码,只是由于目的不同而有了不同的名字

所以!如果你的任务中数据集比较小的话,完全可以拿测试数据作为验证数据,而不必非要分为三部分,害的每一部分的size都很捉襟见肘,搞得训练集太小不够训练,测试集太小使得测试精度不那么可信,很尴尬。

这也是为什么很多论文中给出的训练过程图中给的是训练精度(train_accuracy)和测试精度(test_accuracy)的变化,而非训练精度和验证精度(validation_accuracy)。比如:在这里插入图片描述

如果验证集就是测试数据的话,那么test_accuracy曲线的最后一个值就是最终的测试精度啦

测试集

测试集就是最终要测试的数据了,是要得到一个结果,比如精度或者误差。

既然测试集可以用作验证集,那为啥还要分成三个集呢?
这太简单了,因为测试数据会变化啊。训练好一个模型后,之后可能会把他用到新的测试数据上,但是之前训练过程中用了当时任务的测试数据做验证集。

三大集的划分要注意数据分布的一致性,如类别比例:分层采样

划分训练集和测试集的时候,不能因为划分而引入额外的偏差,从而影响结果。
在这里插入图片描述

交叉验证

有必要说一说交叉验证,因为我之前把交叉验证和验证集搞混。

上面的留出法多做几次,把结果取平均就是交叉验证了:
在这里插入图片描述
在这里插入图片描述

交叉验证是针对数据集太小的情况,想要充分榨干这个小数据集的光和热,数据集够大就不需要折腾这个了。直接举个例子说明:

如果一个数据集有100条数据,按照8:2分为训练集和测试集(直接用测试集作为验证集),则应该用训练集的80条数据训练模型,用测试集的20条数据来测试训练的效果如何。

显然,这个模型只见到了80条数据,而有20条没见过,如果这俩数字是80000和20000,那我们觉得这个模型是可信的,毕竟8万条数据含有的多样性大概率已经包含了这2万条所含的多样性,所以无需钻研交叉验证。

但是80和20这两个数字,,emmm,样本量太吝啬,我们会觉得这80条数据很可能没有包含着20条所能展示的多样性(信息),所以用这80条数据训练的模型的效果也就不那么可信了,因为这个模型没见过这20条数据的模式,所以识别效果也许也不好,即过拟合。

如果不考虑扩充数据集,那就只能充分利用这个小数据集。于是就有了交叉验证:我们再重新划分4次训练集和测试集,每次拿不同的80条作为训练集,另外20条作为测试集;最后把五次实验结果一平均,就是5折交叉验证。

注意在实现中,5次实验的5个测试集,不是说必须完全不同(第一次以编号为0-19的作为测试集,第二次20-39,第三次40-59,第四次60-79,,,),当然,这样做才严格符合交叉验证的定义,这样最好。

但是为了实现方便,一般是用随机法来近似。即:随机选择20条作为测试集,剩下的就是训练集了,5折就选5次,10折就选10次。

小数据集的窘境(贫贱数据集百事哀):
怎么划分都得不到好的结果。。。
也许划分的训练集包含了比较全面的信息,但是却因测试集数据少,刚好只包含训练集没包含的那点信息,于是就得到了很差的精度,让我们误以为这个模型不好,但其实这个模型挺好的。。
在这里插入图片描述

留一法交叉验证,LOO

Leave-One-Out,就是让交叉验证的k等于数据集的规模m。

有一种比较特殊的情况,即数据集实在小的吓人,比如就40条数据,为了尽可能多拿点数据来训练模型,以让模型见到尽量多的样本(多见见世面以增加泛化能力),每次只用一条数据作为测试集,其他都作为训练集,这就是留一法。

每次用39条数据训练一个模型,然后用留出的一条作为测试数据,重复40次实验,则最终的精度是:正确识别次数/40。
在这里插入图片描述

总结

上面说的逻辑上还算比较清楚,总之:

  • 训练集是用来通过梯度反向传播更新参数的,而验证集和测试集不会通过梯度反向传播更新参数,所以测试集和验证集完全可以是同一个数据集,而他俩都不可以和训练集有交叠,即必须互斥。

有的书里说的是尽量互斥,即允许少量重叠。

### 回答1: 交叉检验的目的是评估模型的泛化能力,避免过度拟合训练集。如果交叉检验的训练集和最终模型训练的训练集重合,可能会影响模型的泛化能力和可靠性,因为模型学习了与最终测试集非常相似的数据。这可能导致模型在测试集上的性能表现不佳。因此,为了确保模型的泛化能力,建议在交叉检验和最终模型训练中使用不同的训练集。 ### 回答2: 交叉检验常用于评估机器学习模型的性能,通过将数据集划分为若干子集进行训练和验证,从而得出模型的泛化能力。当交叉检验的训练集与最终模型训练的训练集完全重合时,可能会对模型的评估结果产生一定的影响。 首先,训练集验证集的重合可能导致模型过于乐观的性能评估。因为最终模型在训练过程中也使用了与交叉检验重合的训练集,模型的学习过程会受到更多来自这部分数据的信息,从而更好地适应这部分数据。因此,最终模型在交叉检验中的表现可能比实际情况要好,无法准确地反映模型在未见过的数据上的表现。 其次,重合的训练集可能导致模型过于拟合。训练集验证集的重合,意味着模型在训练过程中能够充分学习到这部分数据的特点,可能会导致模型过于关注这部分数据的细节,而对其他数据的泛化能力较差。当模型遇到未见过的数据时,由于之前的训练过程中过于依赖于重合的训练集,模型可能无法很好地处理这些新数据,从而导致性能下降。 为了准确评估模型的性能和避免过度拟合,交叉检验常常会将训练集验证集尽可能地分开,确保彼此独立。这样可以更好地模拟模型在实际应用中的泛化能力,评估其在未知数据上的表现。因此,当交叉检验的训练集和最终模型训练的训练集完全重合时,需要警惕评估结果的可靠性,同时在模型选择和调优过程中,考虑使用其他划分方式,如随机划分或者分层划分等,以减少重合带来的影响。 ### 回答3: 交叉检验是一种评估机器学习模型性能的常用方法,它将训练集划分为多个子集,其中一个子集作为验证集,其余子集作为训练集交叉验证多次进行,以评估模型的稳健性和泛化能力。 在交叉检验过程中,如果训练集和最终模型训练的训练集重合,可能会引起一定的影响。 首先,由于最终模型在交叉检验中使用了全部的训练数据,这就意味着模型对于这部分数据已经过拟合。如果在后续的实际应用中,这部分数据与训练集完全一致,那么模型对于这部分数据的预测性能可能会比较好。但是对于其他与训练集不同的数据,模型可能无法很好地进行泛化。 其次,训练集和最终模型训练的训练集重合会导致无法真正评估模型的性能。在交叉验证中,验证集是用来评估模型对于未见过的数据的预测能力的。如果验证集训练集完全一致,那么模型在验证集上的性能表现会非常理想,但无法反映其在真实环境中的性能。 因此,最好的做法是在交叉检验中将训练集和最终模型训练的训练集设置为不重合的数据集。这样可以更准确地评估模型的泛化能力和性能,从而更好地指导模型的选择和优化。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值