1.6 测试和验证
了解模型对新实例的泛化能力的唯一方法是在新实例上进行实际尝试。
一种方法是将模型部署到生产环境并监控其性能。
这种方法很有效,但如果模型非常糟糕,你的用户就会抱怨,所以这显然不是最好的方法。
更好的选择是将数据分成两组:训练集和测试集。
使用训练集训练模型,并使用测试集对其进行测试。
- 泛化误差(或样本外误差):新实例的错误率称为泛化误差(或样本外误差),通过在测试集上评估模型,你可以获得误差的估计值。这个值能告诉你模型在处理以前从未见过的实例时的表现。
如果训练误差很低(即模型在训练集上犯的错误很少)但是泛化误差很高,这意味着模型过拟合训练数据。
通常使用80%的数据进行训练,保留20%的数据进行测试。
然而,这取决于数据集的大小:如果它包含1000万个实例,那么保留1%意味着你的测试集将包含10万个实例,这可能足以很好地估计泛化误差。
1.6.1 超参数调整和模型选择
模型选择与模型评估:如果在两个模型之间择优,可以同时训练这两个模型,使用测试集比较它们的泛化能力,从而能对两个模型进行评估。(评估方法就是使用测试集进行测试)
问题提出:过度拟合测试集导致不适应新数据:针对测试集不断调整超参数来训练模型,找到最佳超参数使得泛化误差最小,这样的模型是拟合该测试集的最佳模型,但是部署在实际环境中的性能将会降低,在新数据中的表现未必更好。
解决方案:保持验证:保持训练集的一部分,以评估几个候选模型并选择最佳模型。新的保留集称为验证集(或开发集)。
更具体地说,你可以在简化的训练集(即完整训练集减去验证集)上训练具有各种超参数的多个模型,然后选择在验证集上表现最佳的模型。
在此保持验证过程之后,你在完整训练集(包括验证集)上训练最佳模型,这就是你的最终模型。最后,你在测试集上评估这个最终模型以获得泛化误差的估计。
-
如果验证集太小,则模型评估就不精确,你最终可能会错误地选择一个次优模型。
-
相反,如果验证集太大,那么剩余的训练集会比完整的训练集小得多。
为什么这样不好?好吧,由于最终模型是在完整的训练集上进行训练,因此在小得多的训练集上训练的候选模型并不理想。这就像选择最快的短跑运动员去参加马拉松比赛。
解决这个问题的一种方法是使用许多小的验证集执行重复的交叉验证。每个模型在对其余数据进行训练后,每个验证集都会评估一次。通过对模型的所有评估求平均,可以更准确地衡量其性能。
然而,有一个缺点:训练时间是验证集数量的倍数。
1.6.2 数据不匹配
训练集与实际生产环境中的数据不匹配
解决方案:
将常规的训练集(称为集合A)拆成训练集(称为集合B)和train-dev(训练开发)集(称为集合C)两部分,在集合B上完成模型训练,然后在集合C上进行模型评估:
- 在集合C上模型表现不佳:对集合B过拟合,应该尽量简化/正则化该模型、获取更多的训练数据、清洗训练数据
- 在集合C上模型表现良好:接下来在开发集上进行评估:
- 开发集上表现不佳:那么问题一定来自数据不匹配。你可以尝试通过预处理网络图片来解决这个问题,使它们看起来更像来自实际生产环境的图片,然后重新训练模型
- 开发集上表现良好:那么便拥有了在train-dev集和开发集上都表现良好的模型,可以在测试集上最后一次评估它,以了解它在生产环境中的表现。
🚓混淆辨析
至此,相信有人已经对训练集、训练开发集、开发集、测试集、验证集的概念混淆了,我们再来区分一下,辨析和总结一下他们的异同:
在机器学习和统计建模中,数据集通常被分为几个不同的部分,以便在模型训练和评估过程中使用。以下是这些术语的定义和区分:
-
训练集(Training Set):
- 这是用于训练模型的数据集。模型通过这个数据集学习规律和模式,以便能够对新的、未见过的数据做出预测或分类。
- 训练集是模型学习的基础,其质量直接影响模型的性能。
-
训练开发集(Training Development Set):
- 这个术语不常用,但可以理解为训练集的一个子集,用于在训练过程中进行模型的调整和优化。它可能用于早期停止(early stopping)或超参数调整,以防止模型在训练集上过拟合。
- 训练开发集帮助模型开发者监控训练过程中的性能,以便及时调整模型。
-
开发集(Development Set)/验证集(Validation Set):
- 这两个术语经常可以互换使用,但有时有细微的差别。开发集/验证集用于在模型训练过程中评估模型的性能,但不参与模型的训练。
- 开发集/验证集的主要目的是评估模型的泛化能力,即模型在未见过的数据上的表现如何。
- 在某些情况下,开发集可能用于模型选择(如选择不同的模型架构)和超参数调整,而验证集用于最终评估模型的性能。
-
测试集(Test Set):
- 测试集是完全独立的数据集,用于最终评估模型的性能。模型在训练和开发/验证阶段从未见过测试集的数据。
- 测试集提供了模型在实际应用中可能遇到的数据上的一个无偏估计。
- 测试集的结果通常用于最终报告模型的性能,如准确率、召回率等指标。
区分这些数据集的关键是它们在模型开发和评估过程中的不同用途。训练集用于训练模型,开发集/验证集用于模型选择和超参数调整,测试集用于最终评估模型的性能。正确的数据集划分对于确保模型的泛化能力和避免过拟合至关重要。
🌭没有免费的午餐定理
在1996年的一篇著名论文(https://homl.info/8)中,David Wolpert证明,如果你完全不对数据做出任何假设,那么就没有理由偏爱某个模型。这被称为没有免费的午餐(No Free Lunch,NFL)定理。
对于一些数据集,最好的模型是线性模型,而对于其他数据集,最好的模型是神经网络模型。不存在一个先验模型可以保证一定能更好地工作(这是定理名称的由来)。
确定哪种模型最好的唯一方法是对所有模型进行评估。由于这是不可能的,因此在实践中你对数据做出了一些合理的假设并仅评估了几个合理的模型。