【机器学习系统的构建】从模型开发的过程讲清楚K-Fold 交叉验证 (Cross-Validation)的原理和应用

news2024/11/28 20:39:46

0、前言

最近在学习集成学习的时候了解到了k折交叉验证,其实在之前学习吴恩达老师的课程中也学过交叉验证,但是当时也不是很明白。这次借着自己的疑问以及网上搜找资料,终于把交叉验证给弄明白了。

在弄清楚前,我有这样几个疑问:

  1. ❓只划分测试集和训练集不行吗?貌似我之前训练的yolo并不需要valid验证集也可以训练呀,训练集用来得到最终的模型,测试集用来评估模型的性能,很对呀,为什么好端端多出来一个验证集❓
  2. ❓验证集就验证集,还得叫k折交叉验证?到底是如何进行的呢?验证集是否参与训练呢?如果不参与训练,那他岂不是和测试集作用差不多❓
  3. ❓什么时候用k折交叉验证划分数据集呢?(因为在Stacking集成方法的学习中,基学习器和元学习器的的数据集划分方式不一样,基学习器采用直接划分训练集和测试集进而将数据集划分为两部分,而元学习器采用k折交叉验证进行划分:在这里插入图片描述

带着这样几个疑问,我开始学习,在这之前,我先先过一遍理论,重学一遍吴恩达老师对这部分知识点的讲解。这部分是围绕机器学习系统的构建,我们知道了如何构建分类、回归、神经网络模型的一些它们的基本结构、基本工作原理,但是在这个机器学习系统(模型)的真正构建中(这个构建不只是说你得到了模型,同时你必须保证这个模型的性能是符合要求的),一次训练可以得到一个模型,但是这个模型的性能不一定是符合要求的,如何保证一次训练能得到一个较好、较为接近理想的模型,以及在得到不理想模型后,如何进行对模型的诊断和优化,这才是机器学习系统的构建!它是包含了数据的选择、数据集划分、训练模型、以及模型的诊断优化
在这里插入图片描述
关于上图几个过程需要强调的是:

  1. 从选择(数据+模型)到训练模型,是训练的过程,训练完成后,我们就已经获得了基于当前训练集集的最优模型,注意是基于当前训练集,而不是模型实际的性能。——key:如何进行正确的划分数据集,从而经过训练后,能使这个模型的实际性能尽可能好呢?
  2. 但是这个训练得到的模型是否真正符合需求呢(泛化能力),那么我们还需要评估模型(模型的诊断diagnostics),模型的评估我们采用测试集进行,获得方差和偏差,从而判断是否需要重新选择结构(模型、数据等)来进行优化。——key:如何根据方差和偏差来调整呢?

  💡对于上面两大段文字,你只要清楚:如果能在过程1中经过训练,得到模型,且这个模型的性能(泛化能力)非常好,那是不是就能减轻过程2 的工作量(无需做更多次优化),所以如何基于现有数据就得到一个性能好的模型,就十分重要,我们不能单单只靠过程2去不断优化模型从而得到最终的好模型,这样工作量极大且十分低效!(其实k折交叉验证就是在帮助过程1能尽量训练一次就得到一个很棒的模型,直观上来说就是在客观的模型评估时方差和偏差都低)

其实弄清楚了上面的过程和关键点其实也就大概明白了k折交叉验证存在的意义,如果不懂也没关系,下面会一步一步讲解清楚的。

一、模型评估

  模型的评估(evaluate the performance of the model),是指已经得到经过训练的模型(意味着,在训练上它的数据上已经表现得非常好了,但这不意味着它有很好的泛化能力),如何去评估这个模型实际的性能(泛化能力,即在其他没有见过的数据上的表现)。

  比如说在下面这个例子上,在训练集上,这个模型训练的肯定是极佳了(损失函数几乎就是0了),但是这个模型性能不一定就是最好的,来个新数据,很有可能就预测不准确。所以,我们要一个好的模型,这个好,是它在其他任意数据到来时都能表现的好。
在这里插入图片描述

  那么如何判断这个模型好不好呢?就需要用到我们模型评估的方法,直接给它上没见过的数据,看看预测的咋样呗——测试集(test set)

❗❗❗需要强调的是,必须是没见过的,即没有参与模型训练的数据,如何你从训练集里面拿数据(也就是已经参与训练这个模型的数据)来评估,这将不是客观的,不可取的,无法体现模型的实际性能!

在这里插入图片描述

  如下图,通过计算模型分别在测试集上和训练集上的损失函数,我们可以进行模型性能的诊断和评估:
在这里插入图片描述

关于如何利用这两个值进行模型评估,在方差和偏差那一节会详细讲

这里需要强调的是,模型评估只能用来评估模型的性能,从而对这个模型进行优化。它不能用来作为选择模型的指标!!这句话其实很难懂。

换句话来说,模型评估,是基于你已经确定了一个模型的基础上进行的,这个步骤(模型评估)是在模型选择这个步骤之后的,且用测试集进行评估了之后,你不能再拿测试集去改模型,这就相当于把测试集数据当成了训练数据,会导致最终再拿这个测试集去评估时无法客观准确的去判断(那我再拿一些数据来?咳咳,数据集的划分也是在这些步骤之前的,你需要遵守,如果你预先留了一些数据,那么是不是按照刚刚的说法,你是不是得留无穷无尽的数据呢?)。

那么什么是模型的选择呢?

二、模型的选择(模型开发)&验证集

下面我们来讲模型的选择(model selection),这会解释:为什么不能拿测试集的损失函数结果来进行选择模型❓以及带大家了解,❓什么是验证集,它到底有什么作用?

  • 🌸什么是模型的选择
  • 🪧答:其实是指选择模型的结构,也成为模型的开发过程,一些超参数层面上的,比如一些决策树的深度、神经网络的层数,如何选择可以得到一个更好的性能?

下图这个例子,比如我们想从已经训练好的十个多项式模型里面进行选择一个性能好的模型,OK,我直接拿测试集进行代价函数计算,选在测试集上代价函数最小的那个模型不就OK啦?在测试集上的代价函数小,就说明其泛化能力强不是吗?

在这里插入图片描述
这样想法是错误的,为什么呢?因为当你用测试集进行选择了一个代价函数最小的时候,你其实这个过程还是在训练模型的过程(广义上的,指由数据得到一个模型),也就是说你的测试集是参与了你的模型的训练,你选择了当前这些模型中在测试集上损失函数最小的那个,其实这个模型是基于训练集数据+测试集数据得到的,这时测试集也不再是测试集,它不再具有模型泛化能力的客观评估作用,它其实还是相当于训练集。因为模型的结构的那些神经网络的层数、决策树的深度,其实也相当于模型训练过程的参数,只不过是超参数,如果你根据测试集的代价函数的结果大小去选择模型(其实本质就是调整超参数),那么你还是相当于用测试集去参与了模型的训练过程(更精确来讲是模型的开发过程,包括模型的训练和模型的选择即超参数调整),这时,再用测试集去评论模型的泛化能力就不再客观了。

上面说了这么多,你只用得出的结论就是:测试集(test set)的作用是客观公正的评估一个模型的性能(泛化能力),它必须独立于模型的开发过程(模型的训练、选择、超参数调整),这样才能保证模型评估的客观公正.(🍀到这里也解释了开篇提到的第一个问题,为什么需要验证集!)

那么,模型的选择(超参数的选择)改如何办呢?——验证集(valid set)

也可以称为开发集( dev set),因为它是直接参与模型的开发中的模型选择这个过程中的。

有了验证集,我们可以进行模型的选择,根据验证集,选择了模型之后,我们才可以用测试集进行模型的评估!
在这里插入图片描述

三、训练集、验证集、测试集:作用总结

综上,我们基本就弄清楚了各个各个数据集的作用,在这里我们总结一下:

  • 训练集(train set):在一个确定的模型结构上,基于训练集的数据,用相应模型的训练方法(比如反向传播和梯度下降)进行模型的训练——模型的训练
  • 验证集(valid set/ dev set):对训练好的、不同结构的模型进行性能的评估,进行选择,选择一个性能最好的(这里的最好,是只这个模型是基于训练集、验证集表现的最好的,并不代表它的泛化能力就一定强)——模型的选择和超参数调整
  • 测试集(test set):独立于模型开发过程,在最终由前两个步骤推出来一个模型后,对这个模型的泛化能力进行客观公众的评估。——在最终选择好模型后,进行模型性能评估(当然不仅仅是看代价函数,还有准确率(Accuracy)、精确度(Precision)、和召回率(Recall)F1 分数(F1 Score)、均方误差(Mean Squared Error, MSE)、混淆矩阵(Confusion Matrix),当然这都是后话

四、k折交叉验证法

k折交叉验证,是一种特殊数据集划分,从而选择模型的方法,用这种数据集划分的方法来进行模型的开发(训练和选择)

对全部数据集划分成训练集和测试集,然后对训练集进行K折

所谓k折就是把训练集等分为k分,取其中的1份作为验证集,其余的k-1份作为训练集,这样取k次,可以训练得到k个模型(结构相同但是参数已经被训练的不同了)。
在这里插入图片描述

具体流程:

  1. 将全部训练集S分成k个不相交的子集,假设S中的训练样例个数为m,那么每一个子集有m/k个训练样例,相应的子集称作 { S 1 , S 2 , . . . , S k } \left \{ S_1,S_2,...,S_k \right \} {S1,S2,...,Sk}

  2. 每次从模型集合M中拿出来一个 M i M_i Mi,然后在训练子集中选择出k-1 { S 1 , S 2 , S j − 1 , S j + 1 . . . , S k } \left \{ S_1,S_2,S_{j-1},S_{j+1}...,S_k \right \} {S1,S2,Sj1,Sj+1...,Sk},(也就是每次只留下一个 { S j } \left \{ S_j \right \} {Sj},,使用这k-1个子集训练 M i M_i Mi​后,得到假设函数 h i j h_{ij} hij。最后使用剩下的一份 { S j } \left \{ S_j \right \} {Sj}作测试,得到经验错误: ε ^ S j ( h i j ) \hat{\varepsilon}_{S_j}(h_{ij}) ε^Sj(hij)

  3. 由于我们每次留下一个 { S j } \left \{ S_j \right \} {Sj},(j从1到k),因此会得到k个经验错误,那么对于一个模型 M i M_i Mi,它的经验错误是这k个经验错误的平均。(而对于这一个模型结构 M i M_i Mi会得到k个由其训练出来的模型)

  4. 选出平均经验错误率最小的 M i M_i Mi(⭐最终模型选择得出!),然后使用全部的S再做一次训练,得到最后的 h i h_i hi

核心内容: 通过上述1,2,3步进行模型性能的测试,取平均值作为某个模型的性能指标,关于最终模型的获得有以下两者方式:

  • 🍀方法一,将所有训练的KFold进行融合——不再进行第四步的全部重新训练,使用模型融合的方式(集成学习),即:多个模型的预测结果做了个简单的Ensemble,会更稳定一点
  • 🍀方法二,根据性能指标来挑选出最终单个的最优模型,再进行上述第4步重新进行训练,获得最终模型——用上训练集和验证集的全部数据,再基于k个子集的完整训练集进行重新训练

对k折交叉验证作用的理解

  • 模型选择&超参数调整: 对于上面步骤4步很好理解,对于模型选择上,相较于传统的固定划分验证集和训练集的方法,交叉验证能够尽可能使所有数据参与验证,减少了由于训练集和验证集的分布差异较大从而造成的误差,能够更客观公正的进行模型开发阶段模型之间的比较和选择

  • 模型的集成,使总模型更加稳定:由一个模型架构可以训练出k个模型,k个模型的预测结果做了个简单的Ensemble,会更稳定一点。

  • 充分利用数据: 传统的对数据划分的方法有可能会保留大约20%-30%的数据作为测试集,10%-20%的数据作为验证集。这意味着只有50%-70%的数据被用于训练模型。然而,在数据量较小的情况下,我们希望用尽可能多的数据来训练模型,以便模型能学习到足够的信息。k折交叉验证通过轮流将数据的每个子集作为验证集,使得每个数据点都有机会被用于验证,并且同样也被用于训练。这样,我们实际上使用了全部的数据进行训练和验证,从而充分利用了有限的数据。(所以在小数据量的情况下,可以使用k折验证方法划分数据集!)

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

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

相关文章

Windows系统和unbtun系统连接usb 3.0海康可见MVS和红外艾睿相机

一.海康可见USB3.0工业面阵相机 海康usb相机需要去海康官网上下载对应系统的MVS客户端及SDK开发包 海康机器人-机器视觉-下载中心 选择Windows系统和unbtun(我是linux aarch64,所以选择了对应压缩包解压) Windows系统 1.双击安装包进入安装界面&…

第三节课,前端

一、参考链接; 总 知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具 分 2022-03-18 星球直播笔记-用户中心(下) 语雀 二、登录 2.1登录网址 2.2前端页面修改 2.1 页面修改 2.2 页脚的超链接 网址&am…

机器学习算法--朴素贝叶斯(Naive Bayes)

一、实验环境 1. python3.7 2. numpy > 1.16.4 3. sklearn > 0.23.1 二、朴素贝叶斯的介绍 朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。NB模型所需估计的参数很少,对缺…

25考研英语长难句Day02

25考研英语长难句Day02 【a.词组】【b.断句】 如果你是你讲话对象中的一员,你就能了解你们大家共同的经历和问题,你也可以顺便评论一下食堂里难吃的食物或董事长臭名昭著的领带品味。 【a.词组】 单词解释addressv. 演说, 演讲;…

【进程终止】概念理解 | 三种情况 | 退出码

目录 什么是进程终止 进程退出的场景 退出码 0退出码 !0系统退出码 非0自定义退出码 进程的终止从三个方面去谈。清楚进程终止是在做什么?进程终止的3中情况?如何终止?注意进程终止不是进程暂停。 什么是进程终止 ❓进程…

Map集合的实现类~HashMap

存储结构:哈希表 键重复依据是hashCode和equals方法(键不能重复) 添加: 先创建Student类,那么往HashSet添加的就是Student对象作为键值,后面的作为值 删除: 判断: 遍历&#xff1a…

Android 系统启动流程源码分析

一、Init进程启动 是一个由内核启动的用户级进程。内核自行启动之后,就通过启动一个用户级程序init的方式,完成引导进程。 启动的代码init.c中的main函数执行过程:system\core\init.c中: 主要下面两个重要的过程: 1…

每日OJ题_贪心算法三⑤_力扣134. 加油站

目录 力扣134. 加油站 解析代码 力扣134. 加油站 134. 加油站 难度 中等 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一…

基于51单片机的ADC0804的电压表设计(仿真+源码+设计资料)

目录 1、前言 2、资料内容 3、仿真图 4、程序 资料下载地址:基于51单片机的ADC0804的电压表设计(仿真源码设计资料) 1、前言 最近看网上有很少的ADC0804的设计了,都由0809代替,但是有个别因为成本原因和学校课…

60、郑州大学附属肿瘤医院 :用于预测胃癌患者术后生存的深度学习模型的开发和验证[同学,我们的人生应当是旷野]

馒头老师要说的话: 我近期看了一下北京的脑机公司,大概是我之前对这一行业太过于乐观,北京的BCI公司和研究所,比上海、深圳、杭州甚至是重庆都要少,门槛也要高很多。也有我自己的原因,有时站的太高&#x…

LM4562NA 直插DIP8双运放 音频hifi运算放大器

LM4562NA是一款高性能音频运算放大器,其应用领域主要集中在音频和声音处理方面,包括但不限于: 1. 专业录音设备:在录音棚、广播电台和电视台等专业环境中,用于信号放大和处理,确保高质量的声音录制和传输…

Deep Learning Part Eight--Attention 24.5.4

01.在翻译、语音识别等将一个时序数据转换为另一个时序数据的任务中,时序数据之间常常存在对应关系 引入了Attention的概念,介绍了Attention的注意力机制: 困难出现,seq2seq的问题引入:固定化长度问题(过于…

LeetCode 面试经典150题 252.会议室

题目:给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。 思路:因为一个人在同一时刻只能参加一个会议,因此…

QGraphicsView实现简易地图10『自适应窗口大小』

前文链接:QGraphicsView实现简易地图9『层级缩放显示底图』 自适应窗口大小 当地图窗口放大或缩小的时候,需要地图能够动态覆盖整个视口。 1、动态演示效果 2、核心代码 注:WHMapView继承自MapViewvoid WHMapView::resize() {if (m_curLev…

Linux\_c输出

第一条Linux_c输出 初界面 : ls # 显示目录下的文件cd # 进入到某个目录 # 比如 我进入了Codels # 发现没有显示, 说明为文件下为空vim cpucdoe.c # 创建一个 .c的源码文件进入到了vim的编辑界面: i # 按i 就可以进行编辑 , 下面显示插入标识在编辑模式下, 可以通…

纯血鸿蒙APP实战开发——底部面板嵌套列表滑动案例

介绍 本示例主要介绍了利用panel实现底部面板内嵌套列表,分阶段滑动效果场景。 效果图预览 使用说明 点击底部“展开”,弹出panel面板。在panel半展开时,手指向上滑动panel高度充满页面,手指向下滑动panel隐藏。在panel完全展开…

netty 高性能架构设计--零拷贝

文章目录 前言一、直接内存1.1 什么是直接内存1.2 代码实现1.3 使用直接内存的优缺点 二、netty 零拷贝设计2.1 netty 直接内存2.2 netty 内存池 三、零拷贝的两种方式 前言 本篇从源码层面剖析 netty 高性能架构设计之零拷贝,并且扩展讲述零拷贝的两种实现方式。 …

免费在线录屏、无需注册、免费可用、无限制

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…

【C++STL详解(八)】--------stack和queue的模拟实现

目录 前言 一、stack模拟实现 二、queue的模拟实现 前言 前面也介绍了stack和queue的常见接口,我们也知道stack和queue实际上是一种容器适配器,它们只不过是对底层容器的接口进行封装而已,所以模拟实现起来比较简单!一起来看看是…

FastDFS-单机扩容

描述 周一上班收到用户反馈系统异常,紧急排查日志发现报错:FdfsServerException:错误:28,错误信息:没有足够的存储空间。 解决 根据异常信息判断是文件服务器可用内存不够了,首先登录文件服务器,使用df -h命令查看一…