业界 | 似乎没区别,但你混淆过验证集和测试集吗?

百家 作者:机器之心 2017-07-23 01:09:40

选自Machine Learning Mastery

机器之心编译

参与:蒋思源


很多机器学习入门者对测试集和验证集的概念有所混淆,甚至很多机器学习开发工程师常常都会混淆这两个概念。因为当我们采用验证集的时候,测试集好像和验证集实际上并没有多大区别,所以本文从学界定义到实践中的具体影响探讨验证集和测试集间的区别。


验证数据集(validation dataset)是模型训练过程中留出的样本集,它可以用于调整模型的超参数和评估模型的能力。但测试数据集(test dataset)不同,虽然同是模型训练过程中留出的样本集,但它是用于评估最终模型的性能,帮助对比多个最终模型并做出选择。在开发机器学习系统时,我们对验证数据集及其与测试数据集的区别存在诸多混淆。本文将介绍训练数据集(train dataset)、测试数据集和验证数据集的确切定义,以及如何在机器学习项目中使用这三种数据集。


通过阅读本文,我们将了解:


  • 机器学习领域的专家对训练数据集、测试数据集和验证数据集的定义。

  • 验证数据集和测试数据集在实践中的区别。

  • 使用哪些过程能充分利用验证数据集和测试数据集进行模型评估。

  • 专家对验证数据集的定义


本节,我们将了解部分顶级教科书和参考文献如何定义训练数据集、测试数据集和验证数据集及其区别。


通常情况下,「验证数据集」指模型训练过程中留出的样本集,可与「测试数据集」这个术语互换。在训练数据集上对模型能力进行评估得到的结果存在偏差。因此,用留出的样本对模型能力进行评估得出的结果偏差更小。我们通常称之为使用训练集测试集划分方法(train-test split approach)进行算法评估。


假如我们想评估在一系列观察值上使用特定的数据学习方法后所产生的测试误差,那么验证集方法非常适合该任务。它包括将这些观察值任意切分成两部分:训练集和验证集(又称留出集,hold-out set)。模型在训练集上进行拟合,然后使用拟合后的模型对验证集中保留的数据样本进行预测。并定量地计算模型验证误差,通常我们使用 MSE 对错误率进行评估,评估生成的验证集错误率即测试错误率。——Gareth James, et al., Page 176, An Introduction to Statistical Learning: with Applications in R, 2013.


在 Kuhn 和 Johnson 的著作《应用预测建模》(Applied Predictive Modeling)一书中,我们可以看到作者认为「验证数据集」和「测试数据集」这两个词语可以互换。他们在实例中明确指出,必须在留出的数据集上进行最终模型评估,无论评估目的是训练模型还是调整模型参数。


理想情况下,模型评估应该在未用于模型构建或微调的样本上进行,这样才能对模型效率进行无偏评估。因此如果我们有大量数据可用,则可以留出一部分样本集用于最终模型的评估。训练数据集指构建模型时使用的样本集,而测试数据集或验证数据集用于评估模型性能。——Max Kuhn and Kjell Johnson, Page 67, Applied Predictive Modeling, 2013


传统情况下,对最终模型进行性能评估的数据叫作「测试集」。Russell 和 Norvig 在 AI 教科书《人工智能:一种现代方法》中再次强调了保持测试集完全独立的重要性。他们认为,以任何形式使用测试集中的信息都是一种「窥探」(peeking),因此他们建议封存测试集,直到模型调整全部完成再作为最后的评估。


模型窥探预留数据集是使用测试集选择并评估假设函数的后果。若要避免窥视,必须将测试集单独留出,直到模型学习过程完全结束,才能最终对模型假设进行独立的评估。(如果你对评估结果不满意,想返回寻找更好的模型假设,那么你必须获取并封存一组全新的测试集。)—Stuart Russell and Peter Norvig, page 709, Artificial Intelligence: A Modern Approach, 2009 (3rd edition)


重要的是,Russel 和 Norvig 认为用于模型拟合的训练数据集可以进一步划分成训练集和验证集。验证集是训练数据集的子集,用于对模型能力进行初步评估。


如果测试集被封存后,你仍想在未知数据上进行模型性能评估,来选择性能好的模型假设,那么你需要将可用数据(不包含测试集)分为训练集和验证集。—Stuart Russell and Peter Norvig, page 709,Artificial Intelligence: A Modern Approach, 2009 (3rd edition)


该领域的其他教科书级的著作也佐证了此定义。Ripley 的著作《模式识别与神经网络》(Pattern Recognition and Neural Networks)中的术语表就是一个经典实例。具体来说,训练集、验证集和测试集的定义如下:


训练集:用来学习的样本集,用于分类器参数的拟合。

验证集:用来调整分类器超参数的样本集,如在神经网络中选择隐藏层神经元的数量。

测试集:仅用于对已经训练好的分类器进行性能评估的样本集。

—Brian Ripley, page 354, Pattern Recognition and Neural Networks, 1996


这些是数据集推荐的定义和用法。重申 Ripley 的术语定义之后,让我们来继续讨论「测试集」和「验证集」在机器学习建模过程中的常见混淆。


机器学习相关文献通常颠倒「验证集」和「测试集」的意思。这是人工智能研究中最明显的术语混淆。关键在于,神经网络的文献对测试集的标准定义认为测试集不应用于选择两个或多个网络较好的那个,因此测试集上的误差才是泛化误差的无偏评估(假设测试集和实际总体服从同一分布)。—Subject: What are the population, sample, training set, design set, validation set, and test set?


训练数据集、验证数据集和测试数据集的定义


为了强调上文中专家的研究结果,本节为这三个术语提供明确的定义。


  • 训练数据集:用于模型拟合的数据样本。

  • 验证数据集:用于调整模型的超参数,为拟合后的模型提供无偏评估。如果模型配置中已包括在验证集上的调整,则该评估偏差会更大。

  • 测试数据集:为拟合后的最终模型提供无偏评估。


我们可以通过下列伪代码具体来看它们的定义:


# split data

data = ...

train, validation, test = split(data)

# tune model hyperparameters

parameters = ...

for params in parameters:

 model = fit(train)

 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」一章中指出使用单独的「测试集」(或验证集)的局限性。


如前所述,k 折交叉验证是一种足以取代单独、独立测试集的技术:


  • 测试集是对模型的单次评估,无法完全展现评估结果的不确定性。

  • 将大的测试集划分成测试集和验证集会增加模型性能评估的偏差。

  • 分割的测试集样本规模太小。

  • 模型可能需要每一个可能存在的数据点来确定模型值。

  • 不同测试集生成的结果不同,这造成测试集具备极大的不确定性。

  • 重采样方法可对模型在未来样本上的性能进行更合理的预测。


Max Kuhn 和 Kjell Johnson 等人还推荐了适用于小规模样本的 10-折交叉验证,其偏差低、性能评估变化小;他们还推荐适用于模型性能比较的自助法(bootstrap method),该方法性能评估变化小。对于规模稍大的样本集,他们同样推荐 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-折交叉验证等重采样方法,尤其当重采样方法已经被嵌套在模型验证中时,「验证数据集」和「测试数据集」的概念可能会淡化。


原文链接:http://machinelearningmastery.com/difference-test-validation-datasets/


本文为机器之心原创,转载请联系本公众号获得授权

✄------------------------------------------------

加入机器之心(全职记者/实习生):hr@jiqizhixin.com

投稿或寻求报道:editor@jiqizhixin.com

广告&商务合作:bd@jiqizhixin.com


点击阅读原文,查看机器之心官网↓↓↓

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接
百度热搜榜
排名 热点 搜索指数