前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >测试数据集与验证数据集之间有什么区别呢?

测试数据集与验证数据集之间有什么区别呢?

作者头像
StoneDemo
发布2018-02-02 10:44:06
5.4K0
发布2018-02-02 10:44:06
举报
文章被收录于专栏:小石不识月小石不识月

验证数据集(Validation Datasets)是训练模型时所保留的数据样本,我们在调整模型超参数时,需要根据它来对模型的能力进行评估。

测试数据集(Test Datasets)与验证数据集同样,都是在训练模型时保留的数据样本,但它们的用途有所不同。测试数据集用于在最终调整好的模型之间进行比较选择时,给出各个模型能力的无偏估计。

在机器学习的应用场景中,验证数据集究竟是什么?以及它比起测试数据集有何不同?这其中概念常使人混淆。

在本文中,您会发现关于训练集(Training Datasets),测试集和验证数据集的清晰的定义,同时也能了解到您可以如何在自己的机器学习项目中使用它们。

阅读本篇文章后,您可以学到:

  • 机器学习领域中的专家是如何定义训练集,测试集和验证数据集的。
  • 在实践中,验证集与测试数据集的区别。
  • 在评估模型时,您可以使用的一些程序,它们能使验证集和测试集发挥出最大效用。

现在,与我一同开启新世界的大门吧!

测试和验证数据集有什么区别?
测试和验证数据集有什么区别?

(译者注:原图注释中,给出了图片原地址 veddderman

教程概述

本教程分为 4 个部分,分别是:

  1. 专家眼中的验证数据集是怎样的?
  2. 关于训练,验证和测试数据集的具体定义
  3. 仅有验证数据集是不够的
  4. 消失的验证集和测试数据集

专家眼中的验证数据集是怎样的?

我发现清楚地认识从业者与专家是如何描述数据集的,这对我们有很大助益。

在本节中,我们将看到训练集,测试集和验证数据集是如何定义的,以及在一些高级的机器学习文献和参考资料中,它们的定义是如何不同的。

一般而言,术语 “验证集 ” 与 “测试集 ” 可以互换使用,它们都是指代从训练模型中保留的数据集样本。

对模型使用训练数据进行能力的评估,将会得到带有偏差的结果。因此将模型在外延样本上进行评估,给出模型能力的无偏估计,这通常被称为用于算法评估的训练测试分割法。

假设我们想要估计在一组观测值上采用特定统计学习方法进行拟合后的测试误差。验证集方法 [...] 对于这个任务来说是一个非常简单的策略。它将可用的观测值随机分为两部分,一部分作为训练集,另一部分作为验证集或保持集(hold-out set)。该模型使用训练集进行拟合,拟合后的模型用于预测验证集中的观察结果的响应。由此产生的验证集误差率 —— 通常在定量分析的情况下使用 MSE(Mean-square Error,均方误差) 方法进行评估 —— 提供了测试误差率的估计值。

- 引用自 Gareth James 等人所著,2013 年出版的《An Introduction to Statistical Learning: with Application in R(统计学习简介:在 R 语言中的应用)》一书中,第 176 页。

我们可以直接在 Kuhn 和 Johnson 的佳作 “Applied Predictive Modeling(应用预测模型)” 中明确地看到可互换性。在本例中,他们清楚地指出,最终模型的评估必须在一个没有在训练模型或是调整参数时被使用过的数据集上进行。

理想情况下,模型应该对那些没有用来构建或微调模型的样本进行评估,从而提供对模型有效性的不偏不倚的感觉。当有大量数据时,可以将一组样本放在一边评估最终模型。“训练”数据集是用于创建模型的样本的总称,而“测试”或“验证”数据集用于限定性能。

- 引用自 Max Kuhn 与 Kjell Johnson 所著,2013 年出版的《Applied Predictive Modeling(应用预测模型 )》一书中,第 67 页。

或许习惯上我们称评估最终模型性能的数据集为 “测试集”。Russell 和 Norvig 在他们开创性的 AI 领域教材中重申了保持测试集完全独立的重要性。他们认为以任何方式使用来自测试集的信息这种行为,都是 “窥视(Peeking)”。他们建议封印测试集,直到所有模型都完成调整为止。

窥视即是使用测试集性能来选择一个假设,并对其进行评估的结果。避免这种情况的方法是,无论如何都要将测试集合封存起来直至完全学习完毕,并且只是单纯地希望得到对最终假设的独立评估。(而且,若你对这次结果不满意 ...... 并且如果你想回头找一个更优的假设,你就去获取一个全新的测试集。)

- 引用自 Stuart Russell 与 Peter Norvig 所著,2009 年出版的书籍《Artificial Intelligence: A Modern Approach(人工智能:一种现代方法)》(第3版),书中第 709 页。

需要划重点的是,Russell 和 Norvig 注释道,用于拟合模型的训练数据集可以进一步分成一个训练集和一个验证集,而验证集即是训练集的子集,用于初步评估模型能力。

如果您封存了测试集,但仍想测量模型对于不可见数据的性能,以作为选择一个好的假设的方法。此时您可以将可用数据(不包括测试集)拆分成一个训练集和一个验证集。

- 同样引用自 Stuart Russell 与 Peter Norvig 所著,2009 年出版的书籍《Artificial Intelligence: A Modern Approach(人工智能:一种现代方法)》(第3版),书中第 709 页。

AI 领域的其他一些重磅文献也证实了验证集的这一定义。一个比较不错的(同时也是较老的)例子就是 Ripley 的著作“Pattern Recognition and Neural Networks(模式识别与神经网络)”中的术语表。训练集,验证集和测试集的具体定义如下所述:

- 训练集:用于学习的一组样例,用于拟合分类器的相关参数。 - 验证集:用于调整分类器参数的一组样例,例如选择神经网络中隐含层单元数量。 - 测试集:仅用于评估完整的最终分类器的性能的一组样例。

- 引用自 Brian Ripley 的著作,1996年出版的 《Pattern Recognition and Neural Networks(模式识别与神经网络)》一书中,第 354 页的内容。

这就是关于三种术语的推荐定义及其用法。

关于这些规范化定义的一个很好的例子,是他们在有名的神经网络常见问题解答中对定义的重申。除了重申了 Ripley 在术语表中的定义之外,他们还讨论了机器学习应用场景中常见的,滥用术语“测试集”和“验证集”的问题。

关于机器学习的一些文献经常混淆“验证”和“测试”集合的含义。这种最明显的术语混淆的例子已经弥漫在人工智能的相关研究当中。 至关重要的一点是,一个符合在 NN[神经网络] 文献中的标准定义的测试集,从不用于在两个或更多个网络中进行选择,因此测试集上的误差就可以代表了泛化误差的无偏估计(假设测试集是模型簇(Population)的代表等等)。

- 引用自 “主题:模型簇,样本,训练集,设计集(Design Set),验证集以及测试集分别是什么呢?”(译者注:原文此处给出了主题相关的链接,但由于是一个 ftp 地址,在此处属于不合规链接,无法设置超链接。如有需要,请到原文中获取相应地址。)

您知道这些术语有什么其他明确定义或用法吗?比如说在论文或教科书中的引用。 如果有,请在底下的评论中告诉我。

关于训练,验证和测试数据集的具体定义

为重申上述对专家的研究中所认识到的内容,本节对这三个术语提供了明确的定义。

  • 训练数据集:用于拟合模型的数据样本。
  • 验证数据集:在调整模型超参数时,为训练数据集所拟合的模型所提供的,用于无偏估计的数据样本。由于验证数据集的能力被纳入模型配置中,得到评估结果会带有偏向。
  • 测试数据集:用于对通过训练集拟合得到的最终模型提供无偏估计的数据样本。

我们可以用一段伪代码来具体地描绘它们:

# split data
data = ...
train, validation, test = split(data)
# tune model hyperparameters
parameters = ...
for params in parameters:
	model = fit(train, params)
	skill = evaluate(model, validation)
# evaluate final model for comparison with other models
model = fit(train)
skill = evaluate(model, test)

以下是一些附加的澄清说明:

  • 验证数据集也可以在其他形式的模型准备中发挥作用,比如说特征选择。
  • 最终模型可以使用训练和验证数据集的并集来进行拟合。

在您的用例中,这些定义是否明确呢? 如果没有,请在底下的评论中提出问题。

仅有验证数据集是不够的

还有一些其他方法,它们也可以计算出模型对于不可见数据的能力的无偏(或者在使用验证数据集的情况下越来越带有偏向)估计。

一个比较常见的例子,是使用 k 折交叉验证(K-fold Cross-validation)来调整模型超参数而非仅仅使用验证数据集。

在 Kuhn 和 Johnson 的著作中,有一个标题为 “Data Splitting Recommendations(数据分割的推荐规范)” 的部分,他们在这个部分中阐述了使用唯一 “测试集”(或验证集) 会带来的局限性:

正如我们先前讨论的,对于一个独立的测试集有以下这些技术要点: - 测试集只是对模型的单一评估,对结果不确定性(Uncertainty)的表征能力有限。 - 比例较大的测试集以一种会增加性能估计偏差的方式划分数据。 - 样本量小: - 模型可能需要使用所有可能的数据点,以适当地确定模型相关值。 - 测试集的不确定性可能是大于预期,以至于不同的测试集可能会产生各不同的结果。 - 重采样方法可以合理地预测模型在未来样本上的表现。

- 引用自 Max Kuhn 和 Kjell Johnson,2013 年出版的《Applied Predictive Modeing(应用预测模型)》一书中第 78 页的内容。

他们紧接着推荐在通常的小样本量情况下使用 10 折交叉验证,因为它对于性能估计具有理想的低偏差和方差的性质。比较模型性能时,他们推荐使用会得到方差较小的性能估计值的 bootstrap 方法(译者注: bootstrap 方法是一种统计学方法,有时翻译成 “自助法”)。

一般对于较大的样本量,他们也会推荐使用 10 折交叉验证法。

消失的验证集和测试数据集

在现代应用机器学习中,您可能难以看到关于训练集,验证集和测试数据集的参考文献。

如果实践者选择对训练数据集使用 k 折交叉验证来调整模型超参数,则对于 “验证数据集” 的引用就不复存在。

我们可以用一段伪代码来描述上述概念,如下所示:

 # split data
data = ...
train, test = split(data)
# tune model hyperparameters
parameters = ...
k = ...
for params in parameters:
skills = list()
for i in k:
fold_train, fold_val = cv_split(i, k, train)
model = fit(fold_train, params)
skill_estimate = evaluate(model, fold_val)
skills.append(skill_estimate)
skill = summarize(skills)
# evaluate final model for comparison with other models
model = fit(train)
skill = evaluate(model, test)

如果使用训练数据集调整的模型超参数的交叉验证嵌套在模型更广泛的交叉验证之中,则对于 “测试数据集” 的引用也可能会随之消失。

最终,剩下的仅仅是一个来自同一个域的数据样本,这个样本我们可以继续称之为训练数据集。

扩展阅读

如果您需要对本文提出的概念进行深入研究,本节将提供更多有关该主题的资源。

您知道其他关于这个话题的高质量资源吗?若有,请您在底下的评论中分享出来。

总结

在本教程中,您发现了围绕着术语 “验证数据集” 和 “测试数据集” 存在许多混淆的概念,同时也了解到在评估自己的机器学习模型能力时如何正确使用这些术语。

更具体地说,您学到了以下几点:

  • “训练数据集”,“验证数据集” 和 “测试数据集” 在评估模型时有明确的前例。
  • “验证数据集” 主要用于描述调整超参数和数据预处理时的模型评估,而 “测试数据集” 则主要用于描述最终模型之间的模型能力评估。
  • 当采用 k 折交叉验证等交替重采样方法时,“验证数据集” 和 “测试数据集” 的概念就有可能会消失,特别是当重采样方法之间存在嵌套时。

您还有其它什么问题吗? 如果有,请您在下面的评论中提出您的问题,我会尽我所能给您一个满意的答复。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 教程概述
  • 专家眼中的验证数据集是怎样的?
  • 关于训练,验证和测试数据集的具体定义
  • 仅有验证数据集是不够的
  • 消失的验证集和测试数据集
  • 扩展阅读
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档