在进行机器学习建模时,为什么需要验证集(validation set)?
在进行机器学习建模时,为什么需要评估集(validation set)?
笔者最近有一篇文章被拒了,其中有一位审稿人提到论文中的一个问题:”应该在验证集上面调整参数,而不是在测试集“。笔者有些不明白为什么除了训练集、测试集之外,还需要额外划分一个验证集。经过查找资料,在《Deep Learning with Python》这本书上面我发现了比较好的解释,于是将这部分内容摘录在本博文中,并且翻译为中文。
下文摘自《Deep Learning with Python》4.2小节,翻译如下:
不在同样的数据上面验证模型的原因显然在于:在几轮训练之后,模型就会过拟合。即,相较于模型在训练数据上一直在变好的表现,模型在新样本上的表现会在某一时刻开始变差。
机器学习的目的是构造有很强泛化能力—在新样本上有着良好的表现—的模型,而过拟合是我们需要重点解决的问题。这一小节,我们将会聚焦于如何去衡量模型的泛化能力:如何去评估模型。
训练集、验证集和测试集
评估模型的重点在于将可用数据还分为三个部分:训练集(training set)、验证集(validation set)和测试集(test set)。在训练集上面训练模型,并且在验证集上面评估模型。一旦模型被准备好,最后就在测试集上面测试模型。
为什么不直接使用两个数据集:一个训练集和一个测试集?直接在训练集上面训练模型,在测试集上面评估模型,这样不是更简单一些吗?
不这样做的原因在于,开发一个模型通常需要我们去调整模型的配置:例如,选择最佳的全连接层数或者每一层的节点数(这些被称之为模型的超参数,以区分于模型自身的参数,如:模型的权重和偏置)。我们通过模型在验证集上面的表现来做这种调整。本质上,这种调整也是一种学习的过程:在某种参数空间中寻找最佳的模型配置。结果,根据模型在验证集上面的表现来调整其配置会很快地导致模型在验证集上面过拟合,即便模型从来没有直接在验证集上进行训练。
产生这一现象的原因即所谓的“信息泄漏“。每一次基于模型在验证集上面的表现来调整某个超参数的时候,某些关于验证集的信息就会泄漏给模型。如果我们仅仅作一次这样的调整,那么只会有很少的信息被泄漏,那么你的验证集依然可以被用来评估模型。然而,如果你多次重复这一过程——运行一个实验,在验证集上面评估模型,然后修改模型——那么关于验证集的越来越多的信息会被泄漏个模型。
最后,我们只会得到一个在验证集上面表现良好的模型,因为你就是朝着这个方向去优化它的。然后我们所关心的是模型在新数据上面的表现,而不是验证集,所以我们需要应用一个完全不同的,全新的数据集来评价这个模型,即测试集。我们的模型不能够直接地或者间接地接触过任何关于测试集的信息。如果模型基于测试集的表现来进行调整的话,那么对模型的泛化能力的评价是存在缺陷的。
将现有数划分为训练集、验证集和测试集看起来是很直接的做法,然而这边还有一些高级的方式在数据有限的情况下来完成这种划分,包括:hold-out validation、k-fold validation和iterated k-fold validation with shuffling(这些方法细节便不再赘述,网上可以找到很多资料)。
牢记以下几点:
(1)数据代表性:我们希望训练数据和测试数据能够很好地代表手上的数据。例如,如果我们试图将手写字符进行分类,然后我们手头上有一组根据它们的类别来排列的样本。如果你使用80%的数据作为训练集,另外20%数据作为测试集的话,这会导致训练集中只包含0-7,而测试集中只包含8-9。这看起来是一个滑稽的错误,然而这种情况其实是很常见的。因此,我们需要在分割数据的时候,将现有数据进行随机地打乱。
(2)时间之箭:如果你试图根据过去来预测未来的话,你不应该在划分数据之前随机打乱数据,因此这样会导致“时间泄漏”:你的模型最后很有可能会在来自未来的数据上训练。在这种情况下,你应该保证你的测试集在时间上是落后于训练集的。
(3)数据冗余:如果数据中的某些样本出现两次,那么打乱数据之后将其划分为训练集和验证集会导致训练集和测试集之间的数据冗余。最坏的结果就是,你会在部分的训练集上测试你的模型。一定要保证你的训练集和验证集是不相关的。
在进行机器学习建模时,为什么需要验证集(validation set)?的更多相关文章
- [机器学习] 训练集(train set) 验证集(validation set) 测试集(test set)
在有监督(supervise)的机器学习中,数据集常被分成2~3个即: 训练集(train set) 验证集(validation set) 测试集(test set) 一般需要将样本分成独立的三部分 ...
- AI---训练集(train set) 验证集(validation set) 测试集(test set)
在有监督(supervise)的机器学习中,数据集常被分成2~3个即: 训练集(train set) 验证集(validation set) 测试集(test set) 一般需要将样本分成独立的三部分 ...
- 训练集(train set) 验证集(validation set) 测试集(test set)。
训练集(train set) 验证集(validation set) 测试集(test set). http://blog.sina.com.cn/s/blog_4d2f6cf201000cjx.ht ...
- 训练集(train set) 验证集(validation set) 测试集(test set)
转自:http://www.cnblogs.com/xfzhang/archive/2013/05/24/3096412.html 在有监督(supervise)的机器学习中,数据集常被分成2~3个, ...
- 训练集(train set),验证集(validation set)和测试集(test set)
把数据集分为三部分,分别为:训练集(train set),验证集(validation set)和测试集(test set). 具体比例有各种说法.待补充 测试集是为了测模型泛化能力,不能在训练的时候 ...
- [DeeplearningAI笔记]改善深层神经网络1.1_1.3深度学习使用层面_偏差/方差/欠拟合/过拟合/训练集/验证集/测试集
觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.1 训练/开发/测试集 对于一个数据集而言,可以将一个数据集分为三个部分,一部分作为训练集,一部分作为简单交叉验证集(dev)有时候也成为验 ...
- 【ML入门系列】(一)训练集、测试集和验证集
训练集.验证集和测试集这三个名词在机器学习领域极其常见,但很多人并不是特别清楚,尤其是后两个经常被人混用. 在有监督(supervise)的机器学习中,数据集常被分成2~3个,即:训练集(train ...
- 交叉验证(Cross Validation)方法思想简介
以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train ...
- 机器学习建模高级用法!构建企业级AI建模流水线 ⛵
作者:韩信子@ShowMeAI 机器学习实战系列: http://www.showmeai.tech/tutorials/41 本文地址:http://www.showmeai.tech/articl ...
随机推荐
- XAML属性和事件
1.元素属性 XAML是一种声明性语言,XAML编译器会为每一个标签创建一个与之对应的对象.对象创建出来之后要对它的属性进行必要的初始化之后才有使用意义.因为XAML语言不能写程序运行逻辑,所以一份X ...
- 【随笔】CLR:向头对象(Object Header)迈进一大步!!!
前言 在我之前一篇随笔里(戳我),我们知道,一个引用类型的对象,包含了2个额外的开销,一个是头对象(object header),一个是MT.我们接下来看看头对象到底有多神秘... Object He ...
- 在RPA中使用Python批量生成指定尺寸的缩略图!比Ps好用!
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 htt ...
- git 多账户链接不同gitlab仓库
1.若之前对 git 设置过全局的 user.name 和 user.email.类似(用git config --global --list 进行查看你是否设置) 一定要清除之前设置的用户和邮箱 $ ...
- 如何通过纯javascript实现表单提交
通常,如果是POST方法,一般使用vuejs+axios,或使用Jquery实现表单提交.有些地方,我想使用纯JS实现,比方简单的登陆跳转.话不多说,看原代码, laravel中的HTML部分,如果不 ...
- Javascript中的几种函数
(1)普通函数:这种函数是我们日常使用中用的最多的,用function关键字定义的函数.这也是符合多种语言定义的. function foo(){ // code } (2)箭头函数:用=>运算 ...
- 告诉你如何在Xcode中安装炫酷的插件!!!!!
(如果你已经有了自己喜欢的插件,你可以直接找到该插件的下载地址,下载下来,参照下面的步骤来安装到Xcode工程之中) 如果还没有找到自己想要的插件,那么推荐你在开源中国社区http://www.osc ...
- Discuz 数据库各表的作用
pre_common_addon 插件扩展中心服务商表 pre_common_admincp_cmenu 后台管理面板,自定义常用菜单表 pre_common_admincp_group 后台团队职务 ...
- 获取oracle的建表DLL语句
get_ddl('TABLE','表名','实例名') from dual select dbms_metadata.get_ddl('TABLE','RMS_CITY','RMS') from ...
- [PHP] CentOS下搭建下PHP的运行环境
在公司里面有分配的测试机,所有的开发代码都运行在测试机里面.因为公司的测试机机房退租,所以要在新申请的几台测试机上搭建开发环境.开发环境尽量做到和线上的环境一致,包括代码的目录路径,运行程序的进程用户 ...