训练集和测试集的比例分布差距太大有好的处理方法吗

业界 | 似乎没区别,但你混淆过验证集和测试集吗?
选自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 = ...
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/
本文为机器之心原创,转载请联系本公众号获得授权。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点 上传我的文档
 下载
 收藏
粉丝量:320
温馨提示:请在右上角的搜索文本框中输入关键字如:“论文”、“毕业论文”、“硕士论文”、“营销”、“PDF”、“文案”、“双色球”或查看本人文档分类,可以快速找到您要找的资料。
 下载此文档
基于迁移学习和在线学习的网络流量分类方法研究
下载积分:2000
内容提示:基于迁移学习和在线学习的网络流量分类方法研究
文档格式:PDF|
浏览次数:1|
上传日期: 19:59:15|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2000 积分
下载此文档
该用户还上传了这些文档
基于迁移学习和在线学习的网络流量分类方法研究
关注微信公众号训练集和测试集的含义和区别?如何在实验中使用?比如比较推荐算法
[问题点数:5分]
训练集和测试集的含义和区别?如何在实验中使用?比如比较推荐算法
[问题点数:5分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|51CTO旗下网站
训练集和测试集
《写给程序员的数据挖掘实践指南》本书是写给程序员的一本数据挖掘指南,可以帮助读者动手实践数据挖掘、集体智慧并构建推荐系统。本节为大家介绍训练集和测试集。
作者:王斌 译来源:人民邮电出版社| 17:59
训练集和测试集
前一章的最后部分中,我们使用了3个不同的数据集:女子运动员数据集、Iris数据集以及汽车MPG数据集。我们把每个数据集分成两个子集,一个用于构建分类器,该数据集称为训练集(training set)。另一个数据集用于评估分类器,该数据集称为测试集(test set)。训练集和测试集是数据挖掘中的常用术语。
数据挖掘领域的人永远不会在用于训练系统的数据上进行测试!
下面以近邻算法为例来解释为什么不能使用训练数据来测试。如果上述例子中的篮球运动员Marissa Coleman在训练数据中存在,那么身高6英尺1英寸体重160磅的她就会与自己最近。因此,如果对近邻算法进行评估时,若测试集是训练数据的子集,那么精确率总是接近于100%。更一般地,在评估任意数据挖掘算法时,如果测试集是训练数据的子集,那么结果就会十分乐观并且过度乐观。因此,这种做法看起来并不好。
那么上一章使用的方法如何?我们将数据集分成两部分。较大的那部分用于训练,较小的那部分用于评估。事实表明这种做法也存在问题。在进行数据划分时可能会极端不走运。例如,所有测试集中的篮球运动员都比较矮(像Debbie Black的身高只有5英尺3英寸,体重只有124磅),他们会被分成马拉松运动员。而测试集中所有的田径运动员就像Tatyana Petrova(俄罗斯马拉松运动员,身高5英尺3英寸,体重108磅)一样较矮、体重较轻,可能会被分成体操运动员。如果测试集像上面一样,分类器的精确率会很差。另一方面,有时候测试集的选择又会十分幸运。测试集中的每个人都有所从事项目的标准身高和体重,此时分类器精确率接近100%。两种情况下,精确率都依赖于单个的测试集,并且该测试集可能并不能反映分类器应用于新数据的真实精确率。
上述问题的一种解决方法是重复多次上述过程并对结果求平均。例如,我们可以将数据分成两半:Part 1和Part 2。
我们可以使用Part 1的数据来训练分类器,而利用Part 2的数据对分类器进行测试。然后,我们重复上述过程,这次用Part 2训练而用Part 1测试。最后我们将两次的结果进行平均。但是,这种方法的问题在于我们每次只使用了一半数据进行训练。然而,我们可以通过增加划分的份数来解决这个问题。例如,我们可以将数据划分成3部分,每次利用2/3的数据训练而在其余1/3的数据上进行测试。因此,整个过程看起来如下:
第一次迭代 使用Part 1和Part 2训练,使用Part 3测试
第二次迭代 使用Part 1和Part 3训练,使用Part 2测试
第三次迭代 使用Part 2和Part 3训练,使用Part 1测试
对上述结果求平均。
在数据挖掘中,最常用的划分数目是10,这种方法称为&&
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:16199人学习过
讲师:12572人学习过
讲师:11917人学习过
精选博文论坛热帖下载排行
本书所介绍的Struts 2已经完全超出了Struts 1框架原有的高度,Struts 2建立在Struts 1和WebWork两个框架整合的基础之上,因此提供了更多优...
订阅51CTO邮刊

我要回帖

更多关于 训练集 开发集 测试集 的文章

 

随机推荐