(Deep Learning)交叉验证(Cross Validation)
交叉验证(Cross Validation)
交叉验证(Cross Validation)是一种评估模型泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。
交叉验证不但可以解决数据集中数据量不够大的问题,也可以解决模型参数调优的问题。
交叉验证主要有以下三种方式:
1.简单交叉验证(Simple Cross Validation)
其中,简单交叉验证将原始数据集随机划分为训练集(Train Set)和测试集(Test Set)两部分。
例如:将原始数据样本按照7:3的比例划分为两部分,其中70%的样本用于训练模型,30%的样本用于测试模型及参数。
缺点:
(1)数据样本仅被使用一次,没有得到充分的利用。
(2)在测试集上得到的最终评估指标可能与数据集的划分有很大的关系。
2.K折交叉验证(K-fold Cross Validation)
为了解决简单交叉验证的不足,提出了K折交叉验证。
K折交叉验证的流程为:
(1)首先将全部样本划分成K个大小相等的样本子集
(2)依次遍历这K个子集,每次把当前子集作为验证集,其余所有样本作为训练集,进行模型的训练和评估
(3)最后把K次评估指标的平均值作为最终的评估指标,在实际实验中,K通常取10
例如,当K取10时,K折交叉验证如下图所示:
(1)先将原始数据集分成10份,此时每一份中包含的数据样本数为D
(2)每次将其中的一份作为测试集,剩下的9份(即K-1份)作为训练集,此时训练集就变成了(K-1)*D
(3)最后计算K次求得的评价指标的平均值,作为该模型或者假设函数的真实性能
3.留一交叉验证(Leave-one-out Cross Validation)
留一交叉验证是K折交叉验证的特殊情况,当K等于样本数N时,对于这N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。
留一交叉验证主要用于样本量非常少的情况,例如:对于普通适中问题,当N小于50时通常使用留一交叉验证。
交叉验证的方法在数据理解上较为简单,且具有说服性,但需要谨记的是,当样本总数过大时,使用留一法的时间开销极大。
以下内容转载自知乎:
一:交叉验证(Cross Validation)
在K折交叉验证之前最常用的验证方法是简单交叉验证,即把数据划分为训练集(Train Set)、验证集(Validation Set)和测试集(Test Set)。一般的划分比例为6:2:2。但如何合理的抽取样本就成为了使用交叉验证的难点,不同的抽取方式会导致截然不同的训练性能。同时由于验证集和测试集是不参与训练的,导致大量的数据无法应用于学习,所以显而易见的会导致训练的效果下降。
二:K折交叉验证
将训练集(Train Set)数据划分为K部分,利用其中的K-1份训练模型,剩余的1份作为测试,最后取平均测试误差做为泛化误差。这样做的好处是,训练集(Train Set)的所有样本在必然成为训练数据的同时也必然有机会成为1次测试集。因此,K折交叉验证可以更好的利用训练集(Train Set)数据。
在K折交叉验证中,K越大,被视为泛化误差的平均误差结果就越可靠,但K越大,进行K折交叉验证所花费的时间也是呈线性增长的。
三:存在的问题
以上所述均为书上的内容,但我发现这一步存在一个问题?即在进行K折之前是否需要划分训练集(Train Set)和测试集(Test Set)。
如果划分训练集(Train Set)和测试集(Test Set),(跑论文的实验)在利用公开数据集进行训练时,在相同网络相同数据集的情况下,你的结果可能比别人差(你只使用80%的数据进行训练,而不进行划分则可以使用所有的数据进行训练)。
如果划分测试集,在一些小规模的数据集中该怎么办?可能数据集本身就只有少量数据,此时分走20%用做测试,则用于训练的数据更加不够。
如果不划分测试集(Test Set),直接对所有数据进行K折,网络层数、学习率(Learning Rate)这些参数好定,但是学习轮次(Epoch)怎么决定,到什么程度停止学习。你不能选择测试集上效果最好的轮次,因为这会泄露一部分信息给模型。同时如果最后想要选出一个最佳的模型怎么办?
四:不同情况下给出的可行的——K折验证的方案
情况1:大数据规模
直接使用简单交叉验证(Simple Cross Validation),无需使用K折。因为数据规模较大时,即使以6:2:2的形式划分训练集(Train Set)-验证集(Validation Set)-测试集(Test Set)。其中60%的数据都足以代表所有数据的分布。
举个例子:现在我们需要通过统计的方法去计算投掷骰子时,每个点出现的概率。你现在做了100万次独立的实验,即使你只使用了其中的六十万次的结果也足以得到一个让人信服的概率,即每个点数出现的概率为六分之一。
情况2:中小规模的数据
1:公司使用的情况:首先划分训练集(Train Set)和测试集(Test Set)。在训练集上进行K折,K折中每1折在验证集中误差最小的模型(因为事先划分了训练集和测试集,书中所述的K折中的测试集我在这里称它为验证集(Validation Set))被放在测试集上进行测试,计算测试误差。最后模型的性能为每折中选中的模型在测试集上误差的平均。
(为什么说K折中每1折在验证集上误差最小的模型。因为在训练之前我们并不知道算法需要训练多少轮次才会达到最佳效果,所以我的想法是尽可能的让他多跑,然后在里面选在验证集上表现最佳的模型。再把选出来的模型丢到测试集上去测。)
对中小规模数据集、公司商用情况下流程的意识流示意图
ps:划分之后,会存在训练集数据不足的问题,但是在公司的项目中你必然要选出一个合适的模型进行部署,不先进行训练集和测试集的划分是选不出来合适的模型的!
2:论文实验的情况:如在论文实验中划分训练集(Train Set)和测试集(Test Set),则会存在说服力的问题。即:如何保证你选用的测试集不是经过你精心挑选的,十分容易判断的简单样例!所以,在不需要挑选出最佳模型而仅需评估方法效果的情况下,可以直接在所有的数据上进行K折。这样做的好处在于:你所使用的数据多了,模型的效果也更好,在测试集上的测试误差也会更加接近于泛化误差。
但是这样做会存在一个训练的迭代次数的问题,即:你将在何时停止你学习的过程。
在仅划分训练集(Train Set)和测试集(Test Set)的情况下,你只有两种可行的方法:
(1)选测试集上效果最好的,这就存在将测试集数据分布泄露给训练集的问题。
(2)定死迭代次数,这存在怎么选迭代次数的问题。
因此给出我的方法:在整个数据集上进行K折。在划分的训练集(Train Set)中,抽取一小部分比如5%做为验证集(Validation Set),然后将验证集(Validation Set)上效果最佳的模型置于测试集(Test Set)中测试,然后重复进行K次,泛化误差约等于K次测试误差的平均。
这种方法存在以下两个好处:
(1)所有的样本都在测试集中出现了一次,即不存在说服力不足的问题。
(我全都测了,总不可能说我故意选最容易评估的了吧!)
(2)训练数据集中的样本数据没有显著的减小。
(我只是在划分出来的训练集中再划分出一小部分做验证集),得出的模型效果会更加接近模型的真实泛化误差。
Reference:
- K折验证交叉验证_k折交叉验证_*Snowgrass*的博客-CSDN博客
- K-折交叉验证(记一个坑) - 知乎
- http://t.csdn.cn/8hgXy
相关文章:

(Deep Learning)交叉验证(Cross Validation)
交叉验证(Cross Validation) 交叉验证(Cross Validation)是一种评估模型泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。 交叉验证不但可以解决数据集中数据量不够大的问题,也可以…...

通俗举例讲解动态链接】静态链接
参考动态链接 - 知乎 加上我自己的理解,比较好懂,但可能在细节方面有偏差,但总体是一致的 静态链接的背景 静态链接使得不同的程序开发者和部门能够相对独立的开发和测试自己的程序模块,从某种意义上来讲大大促进了程序开发的效率…...
K8S部署常见问题归纳
目录一. 常用错误发现手段二、错误问题1. token 过期2. 时间同步问题3. docker Cgroup Driver 不是systemd4. Failed to create cgroup(未验证)子节点误执行kubeadm reset一. 常用错误发现手段 我们在部署经常看到的提示是: [kubelet-check] It seems …...

Redis高可用
最近离职后还没开始找工作,在找工作前去学习一下Redis高可用方案。 目录Redis高可用高可用的概念实现方式持久化主从复制简单结构优化结构优缺点哨兵模式(Sentinel)哨兵进程的作用自动故障迁移(Automatic failover)优缺点集群优缺点Redis高可…...

Hyperledger Fabric 2.2版本环境搭建
前言 部署环境: CentOS7.9 提前安装好以下工具 git客户端golangdockerdocker-composecurl工具 以下是个人使用的版本 git: 2.39.2golang: 1.18.6docker: 23.0.3dockkekr-compose: v2.17.2curl: 7.29.0 官方文档参考链接:跳转链接,不同的版本对应的官…...

macOS Monterey 12.6.5 (21G531) Boot ISO 原版可引导镜像
本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日(北京…...

【软件设计师13】数据库设计
数据库设计 1. 数据库设计过程 2. E-R模型 3. E-R图向关系模型的转换 例如一对一联系,可以将联系单独做为关系模式,也可以存放到任意一个实体中 而一对多要合并只能合并到多这边,不能存放到1 多对多则联系必须单独转成一个关系模式 4. 案…...
SpringMVC的全注解开发
文章目录一、spring-mvc.xml 中组件转化为注解形式二、DispatcherServlet加载核心配置类三、消除web.xml一、spring-mvc.xml 中组件转化为注解形式 跟之前全注解开发思路一致, xml配置文件使用核心配置类替代,xml中的标签使用对应的注解替代 <!-- 组件…...
C# | 导出DataGridView中的数据到Excel、CSV、TXT
C# | 导出DataGridView中的数据到Excel、CSV、TXT 文章目录C# | 导出DataGridView中的数据到Excel、CSV、TXT前言DataGridView数据转存DataTableDataTable转Excel方法一、使用Microsoft.Office.Interop.Excel方法二、使用EPPlus库方法三、使用NPOI库DataTable转CSVDataTable转T…...

新规拉开中国生成式AI“百团大战”序幕?
AI将走向何方? ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论,AI该如何管理?AI该如何发展?一系列问题都成为人们热议的焦点。此前,马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代…...

日撸 Java 三百行day31
文章目录day31 整数矩阵及其运算面向对象思想java异常处理java中的getter和setter方法代码day31 整数矩阵及其运算 面向对象思想 结合之前day7和day8面向过程开发,只关注了矩阵加法和矩阵乘法的功能。而day31是面向对象开发,一个矩阵类,在这…...

在线绘制思维导图
思维导图是一种可视化的思维工具,它可以将放射性思考具体化为可视的图像和图表。 思维导图利用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来,把主题关键词与图像、颜色等建立记忆链接。 它运用图像和颜色等多种元素&…...

月薪20k的性能测试必备技能:发现性能瓶颈掌握性能调优
背景 当下云计算、大数据盛行的背景下,大并发和大吞吐量的需求已经是摆在企业面前的问题了,其中网络的性能要求尤为关键,除了软件本身需要考虑到性能方面的要求,一些硬件上面的优化也是必不可少的。 作为一名测试工作者…...
3、Web前端学习规划:CSS - 学习规划系列文章
CSS作为Web前端开发的第2种重要的语言,笔者建议在学了HTML之后进行。CSS主要是对于HTML做一个渲染,其也带了一些语言语法函数,功能也非常强大。 1、 简介; CSS(层叠样式表)是一种用于描述网页样式的语言。它可以控制网页中的字体、…...

城市轨道交通列车时刻表优化问题【最优题解】
文章目录城市轨道交通列车时刻表优化问题思路文章底部城市轨道交通列车时刻表优化问题 最新进度在文章最下方卡片,加入获取思路数据代码论文:2023十三届MathorCup交流 (第一时间在CSDN分享,文章底部) 题目为数据分析类题目。列车时刻表优化…...

常年不卷,按时下班,工作能力强,同事求助知无不言,不扯皮,不拉帮结派,这样的职场清流竟然被裁掉了!...
在职场上,你永远想不到什么样的员工会被优化,比如下面这位:常年不卷,按时下班,工作很专业,同事问什么都回答,不扯皮,不拉帮结派,简直是职场清流。在上个月竟然被优化了&a…...

基于改进多目标灰狼优化算法的考虑V2G技术的风、光、荷、储微网多目标日前优化调度研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Python 函数、文件与模块
“探索 Python” 这一系列的前几篇文章已为 Python 编程新手介绍了几方面的主题,包括变量、容器对象和复合语句。本文以这些概念为基础,构造一个完整的 Python 程序。引入了 Python 函数和模块,并展示了构建一个 Python 程序、将其存储在文件…...

在Spring Boot微服务使用RedisTemplate操作Redis
记录:400 场景:在Spring Boot微服务使用RedisTemplate操作Redis缓存和队列。 使用ValueOperations操作Redis String字符串;使用ListOperations操作Redis List列表,使用HashOperations操作Redis Hash哈希散列,使用SetO…...

4月软件测试面试太难,吃透这份软件测试面试笔记后,成功跳槽涨薪30K
4 月开始,生活工作渐渐步入正轨,但金三银四却没有往年顺利。昨天跟一位高级架构师的前辈聊天时,聊到今年的面试。有两个感受,一个是今年面邀的次数比往年要低不少,再一个就是很多面试者准备明显不足。不少候选人能力其…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...