在进行机器学习建模时,为什么需要验证集(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 ...
随机推荐
- 从程序集加载类型,遇到 ReflectionTypeLoadException 的处理办法
处理办法 catch ReflectionTypeLoadException ,然后从里面读取 Types 数据(成功加载的类型)就可以了. 参考 ReflectionTypeLoadExceptio ...
- Discuz! X3 数据表、数据字段说明
pre_common_admincp_cmenu 后台菜单收藏表 字段名 数据类型 默认值 允许非空 自动递增 备注 id smallint(6) unsigned NO 是 title v ...
- hadoop 自定义OutputFormat
1.继承FileOutputFormat,复写getRecordWriter方法 /** * @Description:自定义outputFormat,输出数据到不同的文件 */ public cla ...
- element-ui修改表单自带验证的样式
1.比如重写在表单自带验证的样式 .el-form-item__error是对应是的文字的类名,图标我是通过伪元素插进去的 下面是伪元素代码 基本上要重写样式的,到控制台看样式名,因为是封装的,所以有 ...
- oracle通过impdp导入不同表用户、不同表空间的数据
原创 tegwy 发布于2013-04-21 17:34:39 阅读数 46592 收藏 展开 impdp smtj2012/密码@localhost/devdb DIRECTORY=dump_dir ...
- mySql创建带解释的表及给表和字段加注释的实现代码
1.创建带解释的表 CREATE TABLE test_table( t_id INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '设置主键自增', t_name ...
- Linxu:磁盘分区
了解磁盘分区 磁盘的物理组成: 圆形的磁盘盘(主要记录数据的部分): 机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据): 主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据. ...
- Shell命令-网络操作之基础之scp、wget
文件及内容处理 - scp.wget 1. scp:用于不同主机之间复制文件 scp命令的功能说明 scp 命令用于 Linux 之间复制文件和目录.scp 是 secure copy 的缩写, sc ...
- Mysql类
架构层面可以采用读写分离,主从复制等等,在数据库前端加cache,如memcache,用于用户登录,商品查询 1.mysql优化的原则是什么? 答: 1.mysql的优化首先要从设计表的过程中 ...
- 6、zabbix自定义监控
一.概述 为什么需要自定义监控呢? 虽然zabbix已经给我们准备好了很多的模板,但是有的东西还是无法监控,这时候就要我们自定义监控了. 自定义监控的思路? 比如我们现在想要监控这个值,如下所示,模板 ...