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

Is validation set necessary for training a model?

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

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

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

谢谢!

交叉验证数据集用于调整超参数。 你不应该接触测试集,除非你已经完成了所有的事情!

正如评论中所建议的,我推荐 k-fold 交叉验证(例如 k=10):

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

不幸的是,我认为单一的结果是不够的。这是因为您的结果可能只是纯粹的运气。 使用 10 倍 CV,您将 90% 的数据(4500 张图像)用于训练,其余 10% 用于测试。所以基本上你并没有在训练中使用更少的图像来获得更可靠的结果。

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

  • 将 data-set 拆分为 K 折
  • i-th 训练集由 {1,2,..,K} \ i 折叠组成。
  • 将训练集分成 N 份。
  • 设置一个 hyper-parameter 值网格
  • 对于每个 hyper-parameter 组值:
    • 训练 {1,2,..,N} \ j 折并测试 j-th 折;
    • 迭代所有 N 次并计算平均值 F-score。
  • 选择一组 hyper-parameter 来最大化您的指标。

  • 使用 i-th 训练集和 hyper-parameter 的最优集训练模型,并在 i-th 折叠上进行测试。

  • 重复所有 K 次折叠并计算平均指标。

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

最后,为了对您的方法进行真正稳定的验证,您可以考虑用 re-sampling 过程替代初始的 K-fold 交叉验证。不是将数据分成 K 倍,而是使用 90% 的样本作为训练样本,10% 的样本用于测试,随机对数据集重新采样。重复 M 次,M>K。如果计算足够快,你可以考虑这样做 20-50 或 100 次。