训练集的识别率一直波动_机器学习验证集为什么不再有新意?

机器学习中,一般将样本数据分成独立的三部分:训练集、验证集和测试集。

其中验证集在机器学习中所起到的作用是:开发模型总需要调节模型的参数,而整个调节过程需要在验证集数据上运行训练的模型,从而给出其表现的反馈信号来修改网络模型及参数。

然而在对样本数据的划分上,往往受限于一些过时的规则以及思维定式的限制,在划分验证集以及解决验证集目前存在的一些问题上,面临着比较大的阻碍。

数据科学家 Ray Heberer 专门撰写了一篇文章来介绍验证集目前存在的一些问题,并表达了自己的看法:验证集如今变得不再有新意。

对此,他提出用心理模型来改善验证集当前的困局。

正文内容如下:

研究者们入门数据科学世界时,意识到的第一件事便是,拥有训练和验证机器学习模型的独立数据集,至关重要。但是要实现这一点,很不容易。尽管我们对于为何要对数据集进行划分的背后有一个简单的直觉,然而深入理解这一困扰这个行业的问题,仍存在许多阻碍。

其中一个阻碍便是坚持使用已过时的“拇指规则”(也叫经验法则),例如“ 按 70:30 的比例分割训练集和测试集”(70–30 train-test split)或大数据出现之前的黑暗时代遗留下来的方法。

另一个阻碍是:我们许多人在学习“除了测试集之外,我们还应该有一个独立验证集用于调整超参数”的过程中都会遇到一个问题:如果我们仅通过调整超参数就会导致测试集过拟合,那么就不会导致验证集过拟合吗?然而针对这一问题,研究者们还没有找到一个好的答案。

对于该问题的回答当然是肯定的。这会导致验证集过拟合,并且这已经不是新鲜事了。这里本文我尝试探索一些方法来思考为什么会发生这种情况,并希望通过这样做,还能开辟出一条更深入地理解过拟合和数据划分的道路,而不仅仅是讨论上面这两个人们为准备面试而需要了解的命题陈述。

本文首先将探讨损失曲面(Loss Landscapes)的概念,以及如何利用样本曲面与总体曲面之间的关系理解验证集泄漏。在此过程中,将基于一些简化的假设来开发有用的心理模型(Mental Model )。最后,将通过一个快速的实验来验证我们的理解。

让我们开始吧!

一、损失曲面

96f65cd793adbf914c9d83cdf66a9e5d.png

双变量函数(GitHub代码地址:https://gist.github.com/rayheberer/bd2d94443e77b9734d52a7a4c736bbf3)

如果你熟悉机器学习,尤其是研究过神经网络和梯度下降算法,以及阅读过下面这篇关于梯度优化算法的(文中有丰富的可视化图片和动画)文章,那么你对损失曲面概念一定不陌生。

  • 文章地址:https://ruder.io/optimizing-gradient-descent/#visualizationofalgorithms

具体而言,损失曲面就是将机器学习模型的损失或误差作为其参数的函数。

如果你觉得这个概念过于简单而不必特别关注,我十分能理解。尽管你已经理解了相关基本概念,但“损失曲面”实际上是这类函数的名称,知道它后你可以轻松查阅各种有趣的内容和相关研究。

  • 相关阅读参考:https://arxiv.org/abs/1712.09913

ba4b4637e3275768769962e25daeb128.png

“曲面”一词唤起了我们的物理直觉。照片由 Fabrizio Conti 在 Unsplash 上提供

损失曲面是可以通过梯度下降或其他方法(例如模拟退火、演化方法)进行遍历的函数。即使你要处理的函数通常位于高维空间中, 这样命名让我们不由得根据物理直觉来思考它。

尽管我们通常将损失曲面视为模型参数函数,但也可将它们视为超参数函数。

需要注意的是:虽然损失可以根据数据和模型参数显式计算,但损失与模型超参数之间联系更不直接。如果你对此感到困惑,不妨回顾下生物学家使用适应度曲面( Fitness Landscapes)将繁殖成功作为遗传因素的函数。必要时你可将超参数函数(和数据)的损失和“模型适应度曲面”的损失,视作相同的。

现在要意识到的关键是,每个数据集分区都会有独立的损失曲面,而训练集、验证集和测试集的损失曲面完全不同。如果数据已经被很好地分割,那么每一组数据就都是一个有代表性但不相同的样本。

最重要的是,所有现有数据的损失曲面与真实环境中的潜在“总体”数据的损失曲面不同。我们之所以同时需要验证集和测试集,是因为如果随着时间的推移验证集确实泄漏了信息,那么我们仍需要一些数据来无偏估计模型在真实环境中的性能。

一种考虑超参数调整的方法是,将遍历验证集数据的损失曲面作为超参数函数。让我们从假设一个“理想”曲面来开始建立直觉。

二、面向心理模型:假设独立的超参数

对于理想的损失曲面,超参数当然是“独立的”,意思是超参数与损失的之间没有相互作用项。这类函数的等高线不会对角突出,如下图所示:

9fc3bc89cc6f9ca0ab28a0368a7a9bb8.png

这类的损失曲面之所以理想,是因为在处理它们时,可以将调整许多超参数的问题分解为一次单独调整一个超参数。由于任意一个超参数的最佳值与其他超参数无关,因此我们可以按顺序而不是并行地进行超参数调整。

换句话说,就是将每个超参数视为一个旋钮。我们要做的就是不断调整每个特定旋钮,直到找到最佳位置。

然后关联每个旋钮,就可以得到损失曲面的投影。我们的这部分函数将只有一个自变量:正在不断调整的超参数。

4f038e7cf79a6e599682f5c3c8517c63.png

这就是变得有趣的地方:回想一下,每个数据集都有自己的损失曲面。现在想象在调节的每个旋钮之后叠加这些函数的投影。然后让我们选择用于确定最佳超参数值的验证数据的损失曲面,和全部总体数据的假设损失曲面,它是我们期望的模型最优结果,也是测试集的估计(如果采样正确)。

当我们根据验证集数据每次都将旋钮调至最佳值后,会发生什么呢?

可能的结果是验证集和“总体”损失曲面不太一致。当每次我们调整一个超参数值使验证集的损失曲面达到峰值时,我们可能已经越过“总体”损失曲面的峰值。调整得越多,越过的峰值就越多。这将导致验证集和实际性能(由测试集估计)之间的差距越来越大。

61e23686e00782a37bc4cfde229ad94d.png

就像这样!这就是验证集会变得过时和泄漏信息的原因,或者至少是一种有用的思考方式。

在这里,特别细心的读者可能会问:“如果验证和总体损失曲面没有全部重合,那为什么峰值的重合要少于其他点的重合呢?”这是一个很好的问题,并且开始测试我们开发的心理模型的局限性。

为了回答这个问题,考虑单个超参数的验证性能。现在,将目标函数的每个值都视为获得了来自泛化特征和验证集数据异常的贡献。

随着获得更多的最优值,每一个部分做出贡献的机会就会增加。为了在不降低测试集和真实环境性能的情况下提升验证性能,要求提高验证性能的贡献只来自泛化特征部分。

作为反馈,在这里向大家提出以下问题:如果你要优化的一个超参数实际上不能从数据(例如 random_state)中学习泛化特征,针对这种情况优化验证损失会产生什么影响?

归根结底,我们在此讨论的是一个心理模型,正如 George Box 的著名格言所说的:

  • 所有模型都是错的,但有些是有用的。

我希望这是思考验证集过度拟合背后机制的一种有用方法。

三、“弄脏”我们的手:模拟验证集泄漏

作为数据科学家,我们不能不通过实验就阐述一个观点。要求超参数之间没有任何交互作用,是过于严格的。尽管这对于开发心理模型很有用,但最好有一些经验结果表明这种想法能扩展到没那么理想的场景。

接下来进行一个关于梯度提升回归模型(Gradient Boosting Regression Model)上执行的调整量以及验证集和测试集性能之间的差距的快速实验。其中选择使用梯度提升算法的原因,是它是具有大量超参数的主流模型。

根据我们对验证集泄漏的理解,我们期望的结果是:随着调整的增加,验证集和测试集之间的性能差距将不断扩大。在实验中,“更多的”调整定义为通过5个不同的超参数进行更多次的随机搜索迭代。迭代次数越多,就越有可能在验证集上找到更理想的结果。如果心理模型的部分最优值真的来自非泛化的验证数据异常,那么我们期望在测试数据上不要出现这种性能提升。

在展示最终结果之前,需要提前说明一件重要的事:这个实验可能偏向于支持我的论点:

当然,通过使用大型验证集可以减少验证集泄漏的风险,但我使用了小数据来进行训练和验证,即“波士顿的房价”数据集,为的是能够轻松地演示过度调整小的验证集的情况。

你可以怀疑这些结论是否适用于除我选择的特定数据集以外的其它数据集!我鼓励你提出自己的实验并分享你的结果。

  • 实现代码的GitHub地址:https://gist.githubusercontent.com/rayheberer/dcbaf91e9ca053316755e60991e48da9/raw/29eae8febe4e147b02d72b9624a062e86b4a0cc5/validation-test-perforance-gap-experiment.py

2720eb7b6ec59389a137523cfbfd9f13.png

如图所示,当我们投入越多的精力用于优化超参数和根据验证集性能选择模型时,验证集和测试集之间的性能差距就越大。

如果我们已经调优了一个超参数子集,然后再调优另一个超参数集,或者尝试切换使用的模型族,验证集和测试集间的性能差距会更加显著。根据数据样本(验证集)做出的每个决策,都会将该样本的随机波动缓慢地编码到结果中。

四、结论

这实际上是我第二次尝试解释超参数调整与验证集过拟合现象之间的关系。而难以置信的是,我们很难清楚地解释相对简单的潜在直觉想法。

  • 相关阅读参考:https://medium.com/@rayheberer/black-magic-and-hyperparameter-tuning-ef875eb31712

我认为部分原因是,“提问-回答”的思维定式仍然主导了我们的集体认知,例如“过度拟合验证数据”和“验证集泄漏信息”没有视觉或经验直觉的支持。

尽管本文是为了更深入、更初级的解释超参数调整和过拟合验证集之间的关系,但我们仍有更多角度空间和思考方式。 Cassie Kozyrkov 最近发布了一篇文章,将教学和《憨豆先生》进行类比,对数据集分割进行了有趣的论述:

  • 文章地址:https://towardsdatascience.com/training-validation-and-test-phases-in-ai-explained-in-a-way-youll-never-forget-744be50154e8

很高兴看到数据社区提出一些其它想法! 雷锋网雷锋网雷锋网

via:https://towardsdatascience.com/why-machine-learning-validation-sets-grow-stale-69fa043fd547

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java写一个web聊天工具_javaweb写的在线聊天应用

写这个玩意儿就是想练练手, 用户需要登陆才能在线聊天,不要依赖数据库, 不需要数据库的操作, 所有的数据都是保存在内存中, 如果服务器一旦重启,数据就没有了;登录界面:聊天界面&…

python dataframe删除重复行_详解pandas使用drop_duplicates去除DataFrame重复项参数

Pandas之drop_duplicates:去除重复项方法DataFrame.drop_duplicates(subsetNone, keepfirst, inplaceFalse)参数这个drop_duplicate方法是对DataFrame格式的数据,去除特定列下面的重复行。返回DataFrame格式的数据。subset : column label or sequence o…

O-C相关-08-动态类型与静态类型

08-动态类型与静态类型 1, 什么是动态类型和静态类型 1) 动态语言 又叫动态编程语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除…

python中numpy是什么_什么是NumPy?

本文是对官方文档的翻译,原文在此What is NumPy? - NumPy v1.14 Manual​docs.scipy.org以下开始正文。NumPy是Python的一个用于科学计算的基础包。它提供了多维数组对象,多种衍生的对象(例如隐藏数组和矩阵)和一个用于数组快速运算的混合的程序&#x…

java for循环 等待_java – 主题:忙等待 – 空循环

参见英文答案 > Is this starvation? 2个在我们的大学课程中,我们学习了Threads并使用“Busy Waiting”方法作为在TrafficLight等待的汽车的示例.为此,我们构建了三个类:> TrafficLight(实现Runnable)>汽车(实现Runna…

人物角色群体攻击判定(一)

我们制作3D动作游戏的时候,常常主人公是一对多人进行攻击,或者敌人在角色前方一定范围内进行攻击. 我们怎么实现这种效果呢? 1. 使用触发器(多体攻击)方便调试,可视化(推荐)2. 运用点乘和叉乘,判断敌人的角度和位置(单,多)一般3. 使用Physics的Physics.OverlapSpher…

mfc cimage加载显示图片_在微信小程序里实现图片预加载组件

网页中的图片预加载我们知道在 Web 页面中实现图片的预加载其实很简单,通常的做法是在 JS 中使用 Image 对象即可,代码大致如下var image new Image() image.onload function() {console.log(图片加载完成) } image.src"//misc.360buyimg.com/lib…

java mongodb 删除字段类型_Mongodb基本数据类型、常用命令之增加、更新、删除

1.null---表示空值或者该字段不存在,如{"name":null}2.布尔 --- 和java中的布尔一样,有两种:true,false,如{"sex":true}3.浮点数---shell中所有的数字都是浮点数,如{"age":12},{"m…

HDU 2242 双连通分量 考研路茫茫——空调教室

思路就是求边双连通分量&#xff0c;然后缩点&#xff0c;再用树形DP搞一下。 代码和求强连通很类似&#xff0c;有点神奇&#xff0c;_&#xff0c;慢慢消化吧 1 #include <cstdio>2 #include <cstring>3 #include <algorithm>4 #include <vector>5 #…

wxpython菜单栏嵌套窗口_如何在wxpython中使嵌套的Panel和Sizer工作

此处的逻辑是创建一个Panel,在其中添加控件,然后创建一个BoxSizer,在其中声明您在Panel中添加的每个控件在调整大小时的行为,并最终在Panel上设置应用BoxSizer的对象.您有2期.>首先,您缺少posPnlobject的上述语句的最后一部分.添加&#xff1a;posPnl.SetSizer(posPnlSzr)将…

Java多态与反射

多态通过分离做什么和怎么做&#xff0c;从另一个角度将接口与实现分离开来&#xff1b;通过多态来消除类型之间的耦合关系&#xff0c;在Java中&#xff0c;多态也叫动态绑定&#xff0c;后期绑定或运行时绑定&#xff0c;那么什么是方法绑定&#xff1f; 方法调用绑定&#x…

java webservice用户验证_使用java webservice的.net4.0 web app需要Usernametoken身份验证

我是使用.net 4.0 VS2010的新手。我需要使用java web服务并发送usernametoken自定义身份验证来访问服务&#xff0c;这是我很容易在VS2005中使用WSE2.0&#xff0c;那么在net 4.0中替换它是什么&#xff1f;我的客户端是.net 4.0 Asp.net Web应用程序(网站)&#xff0c;服务是j…

python随机数模块_python 随机数模块 -- random

一、概述这个模块实现的伪随机数生成器。对于整数&#xff0c;从区间选取。对于序列&#xff0c;随机元素。在实线的&#xff0c;有功能来计算均匀分布&#xff0c;正态分布(高斯) &#xff0c;对数正态分布&#xff0c;负指数&#xff0c;γ和β分布。对于生成的角度分布&…

织梦dedecms5.7二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法...

dedecms升级到5.7SP1后&#xff0c;开启二级域名&#xff0c;你会发现&#xff0c;在二级域名下的文章&#xff0c;上传的图片地址都是&#xff1a;二级域名图片地址&#xff0c;这是相对路径。但是你的图片是默认上传在uploads里面的。应该使用绝对路径。这就出现图片路径错误…

java注册中心nacos_spring-cloud整合nacos做注册中心

前面讲了spring-cloud整合nacos做配置中心&#xff0c;这节讲一下nacos做注册中心至于注册中心是什么&#xff0c;我就不讲了&#xff0c;不了解的可以去问度娘下面我就直接开始了&#xff0c;也是比较简单的&#xff1a;1.引入依赖1.8Greenwich.SR12.1.0.RELEASEorg.springfra…

python批量转换图片格式_python批量将图片转换为JPEG格式

标签&#xff1a;# -*- coding:utf-8 -*-import osfrom PIL import Imagedef resize(path):filelist os.listdir(path)for i in filelist:img Image.open(path i)outfile os.path.splitext(i)[0] .jpegif img ! outfile:img.save("C:/Users/Administrator/Desktop/最…

判断 JS 中对象的类型

1.typeof 形如 var x "xx"; typeof x string typeof(x) 返回类型有&#xff1a;undefined “string” number boolean function object 缺点&#xff1a;对于object类型不能细分是什么类型 优点&#xff1a;对空null的判断 undefined的应用 2.instanceof 形如 var …

java中接口回调_Java中的接口回调实例

定义&#xff1a;/*** author Administrator* project&#xff1a; TestOne* package&#xff1a; PACKAGE_NAME* date&#xff1a; 2018/11/30 0030 15:42* brief: 郭宝**/public class Person {/*** 自定义一个接口**/public interface OnNameChangeListener{//接口中的抽象函…

python经纬度转换xy坐标公式_python 经纬度和平面坐标相互转换利用米勒坐标系

xy_coordinate [] # 转换后的XY坐标集def millerToXY (lon, lat):"""经纬度转换为平面坐标系中的x,y 利用米勒坐标系:param lon: 经度:param lat: 维度:return:"""L 6381372*math.pi*2W LH L/2mill 2.3x lon*math.pi/180y lat*math.pi/1…

Android基于mAppWidget实现手绘地图(二)--概要

离线地图是一张被切成类似瓷砖般格子图像组成&#xff0c;这些被切开的格子组织成多个缩放级别。缩放级别是从0开始。0这个缩放级别&#xff0c;地图图像的尺寸为1*1像素。在每下一个缩放级别&#xff0c;图像尺寸则会两倍递增。 每个地图都是有层和地图对象的。 层是一个抽象的…