训练模型是不是需要验证集?

Posted

技术标签:

【中文标题】训练模型是不是需要验证集?【英文标题】:Is validation set necessary for training a model?训练模型是否需要验证集? 【发布时间】:2018-08-10 05:58:20 【问题描述】:

我使用 CNN 构建了一个 3D 图像分类模型用于我的研究。我只有 5000 张图像,使用 4500 张图像进行训练,500 张图像用于测试集。 我为训练尝试了不同的架构和参数 F1 分数和训练集的准确率高达 0.9。幸运的是,我不必花费大量时间来找到这些设置以获得高精度。

现在我将这个模型应用于测试集,我得到了一个非常令人满意的预测,F1 分数为 0.8~0.85。

我的问题是,是否有必要进行验证?那时我参加机器学习课程时,我被教导使用验证集来调整超参数。我没有进行 k 折交叉验证的一个原因是因为我没有太多数据并且想使用尽可能多的训练数据。我的模型在测试集上显示出相当好的预测。只要准确率/f1 分数/ROC 足够好,我的模型还能让人信服吗?或者我可以尝试仅通过进行 k 折交叉验证而不单独对测试集进行制作和测试来说服人们吗?

谢谢!

【问题讨论】:

鉴于您的测试集非常小(500 张图像),我会进行交叉验证。您没有太多数据的事实凸显了交叉验证的必要性。相反,如果您有足够大的测试集,则可以跳过 CV 过程。 【参考方案1】:

交叉验证数据集用于调整超参数。 您不应该触摸测试集,除非您完成所有操作!

按照 cmets 的建议,我推荐 k 折交叉验证(例如 k=10):

    将数据集拆分为 k=10 个集合 对于 i=1..10:使用集合 1, 2,..., 10 \ i 作为训练集(并找到超参数)并设置 i 进行评估。 您的最终分数是这些 k=10 评估分数的平均值。

【讨论】:

您好,感谢您的回答。但我的意思是,仅显示 k 折交叉验证的平均准确率是否足以说服人们。我读过一篇科学论文,它只报告了交叉验证中 5 个测试集的平均误差。 我非常看情况。我怀疑任何论文只报告平均错误。每篇论文都应该至少有某种理由说明为什么改变会带来改进【参考方案2】:

不幸的是,我认为单一的结果是不够的。这是因为您的结果可能只是纯粹的运气。 使用 10 倍的 CV,您将 90% 的数据(4500 张图像)用于训练,剩下的 10% 用于测试。因此,基本上您不会在训练中使用更少的图像,从而获得更可靠的结果。

Martin 提出的验证方案已经是一个不错的方案,但如果您正在寻找更稳健的方案,您应该使用嵌套交叉验证:

将数据集拆分为 K 折 第 i 个训练集由 1,2,..,K \i 个折叠组成。 将训练集分成 N 折。 设置超参数值网格 对于每个超参数值集: 在 1,2,..,N \j 折上训练并在第 j 折上测试; 迭代所有 N 次折叠并计算平均 F 分数。

选择最大化指标的超参数集。

使用第 i 个训练集和最优超参数集训练模型,并在第 i 折上进行测试。

对所有 K 折重复并计算平均指标。

平均指标可能不足以证明方法的稳定性,因此建议同时提供置信区间或结果的方差。

最后,为了对您的方法进行真正稳定的验证,您可以考虑用重新采样程序代替最初的 K 折交叉验证。不是将数据拆分为 K 折,而是使用 90% 的样本作为训练样本和 10% 的样本作为测试样本随机重新采样数据集。使用 M>K 重复此 M 次。如果计算速度足够快,您可以考虑执行 20-50 或 100 次。

【讨论】:

以上是关于训练模型是不是需要验证集?的主要内容,如果未能解决你的问题,请参考以下文章

交叉验证

交叉验证

交叉验证(Cross Validation)原理小结

交叉验证(Cross Validation)原理小结

tensorflow 保存好训练的模型,restore 后验证集的正确率很低

机器学习:验证数据集与交叉验证