训练集、验证集和测试集的区别和联系
1 三者的区别
- 训练集(train set) —— 用于模型拟合的数据样本。
- 验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。
在神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量;
在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。
- 测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
类别 | 验证集 | 测试集 |
---|---|---|
是否被训练到 | 否 | 否 |
作用 | 用于调超参数,监控模型是否发生过拟合(以决定是否停止训练) | 为了评估最终模型泛化能力 |
使用次数 | 多次使用,以不断调参 | 仅仅一次使用 |
缺陷 | 模型在一次次重新手动调参并继续训练后所逼近的验证集,可能只代表一部分非训练集,导致最终训练好的模型泛化性能不够 | 测试集为了具有泛化代表性,往往数据量比较大,测试一轮要很久,所以往往只取测试集的其中一小部分作为训练过程中的验证集 |
验证集的作用:
使用验证集是为了 快速调参,也就是用验证集选择超参数(网络层数,网络节点数,迭代次数,学习率这些)。另外用验证集还可以监控模型是否异常(过拟合啦什么的),然后决定是不是要提前停止训练。
验证集的关键在于 选择超参数,我们手动调参是为了让模型在验证集上的表现越来越好,如果把测试集作为验证集,调参去拟合测试集,就有点像作弊了。
而测试集既 不参与参数的学习过程,也 不参与参数的选择过程,仅仅用于模型评价。
验证集的正确打开方式:
验证集可以看做参与了 “人工调参” 的训练过程
一般训练几个 epoch 就跑一次验证看看效果(大部分网络自带这个功能)
这样做的第一个好处是:可以及时发现模型或者参数的问题,比如模型在验证集上发散啦、出现很奇怪的结果啦(Inf)、mAP不增长或者增长很慢啦等等情况,这时可以及时终止训练,重新调参或者调整模型,而不需要等到训练结束。
另一个好处是验证模型的泛化能力,如果在验证集上的效果比训练集上差很多,就该考虑模型是否过拟合了。同时,还可以通过验证集对比不同的模型。
训练集和验证集都是在训练阶段使用的!!!
|
|
一旦你完成了训练,那么你就对照你的测试集进行测试,并验证准确性是否足够。
详细解释
训练集:该数据集用于调整神经网络上的权重。 验证集:该数据集用于最小化过度拟合。 您没有使用此数据集调整网络的权重,您只是验证训练数据集的准确度的任何提高实际上都会提高准确性,而不是之前未向网络显示的数据集, 或者至少网络没有接受过培训(即验证数据集)。 如果训练数据集的准确度增加,但验证数据集的准确度保持不变或降低,则您的神经网络过度拟合,应该停止训练。 测试集:该数据集仅用于测试最终解决方案,以确认网络的实际预测能力。