(Deep Learning)交叉验证(Cross Validation)

news2025/2/28 19:58:36

交叉验证(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在训练集上进行KK折中每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:

  1. K折验证交叉验证_k折交叉验证_*Snowgrass*的博客-CSDN博客
  2. K-折交叉验证(记一个坑) - 知乎
  3. http://t.csdn.cn/8hgXy

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

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

相关文章

CSS中flex属性的的使用以及应用场景有哪些

文章目录一. flex属性?(虚假的) --- 这里主要是回顾1.1 flex-grow1.2 flex-shrink1.3 flex-basis二. flex属性 ! (真正的!!!)三. flex一些常见的值, 以及使用场景3.1 flex:initial 使用场景3.2 flex:0 和 flex:node 适用场景3.3 flex:1 和 flex:auto3.4 总结一. flex属性?(虚…

54 openEuler搭建Mariadb数据库服务器-Mariadb介绍

文章目录54 openEuler搭建Mariadb数据库服务器-Mariadb介绍54.1 MariaDB的架构54.2 MariaDB的存储引擎54 openEuler搭建Mariadb数据库服务器-Mariadb介绍 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的…

零售数据分析操作篇14:利用内存计算做销售筛选分析

各位数据的朋友,大家好,我是老周道数据,和你一起,用常人思维数据分析,通过数据讲故事。 上一讲讲了图表间联动的应用场景,即当我们点击某个图表时,会影响其他图表一起变化,而变化背…

Vue3 Element-plus el-menu无限级菜单组件封装

对于element中提供给我们的el-menu组件最多可以实现三层嵌套,如果多一层数据只能自己通过变量去加一层,如果加了两层、三层这种往往是行不通的,所以只能进行封装 效果图一、定义数据 MenuData.ts export default [{id: "1",name:…

spring boot 访问HTML

HTML整合spring boot简介默认文件路径访问自定义文件路径访问或通过Controller控制器层跳转访问简介 SpringBoot默认的页面映射路径(即模板文件存放的位置)为“classpath:/templates/*.html”。静态文件路径为“classpath:/static/”,其中可…

三菱FX3U PLC计米轮功能块(完整ST代码)

计米轮功能块(wheel_FB)详细计米、测速原理请参看下面的博客: PLC高速脉冲输入计米轮模块(编码器测速/计米详细讲解)_RXXW_Dor的博客-CSDN博客线缆行业单绞机PLC控制算法详细解读可以参看下面的文章链接:线缆行业单绞机控制算法(详细图解+代码)_RXXW_Dor的博客-CSDN博客在…

大佬入局AI,职场人有新机会了?

卸任搜狗CEO一年半后,王小川宣布在AI大模型领域创业,与前搜狗COO茹立云联合成立人工智能公司百川智能,打造中国版的OpenAI,并对媒体表示:“追上ChatGPT水平,我觉得今年内可能就能够实现,但对于G…

第六天 CUDA内存管理

操作内存分配和数据复制过程概述 在gpu上开辟一块空间,并把地址记录在mem_device上在cpu上开辟一块空间,并把地址记录在mem_host上,并修改了该地址所指区域的第二个值把mem_host所指区域的数据都复制到mem_device的所指区域在cpu上开辟一块空…

面试代码——排序算法【建议收藏】

最近家里小朋友准备计算机类的研究生复试,可能会考到常见的排序算法,于是帮助整理一波,顺带复习下相关知识,考验下自己的编码能力; 关于排序算法,网上关于排序算法的帖子和代码也比较多,有的帖…

万字长文介绍R package “vegan”——入门学习与重复文献数据

vegan介绍与入门 vegan是一个用于群落生态学(community ecology)分析的包,可以进行排序、多样性和差异性分析(ordination, diversity and dissimilarity)。 vegan包含了多样性分析、排序方法和差异性分析的工具。 示…

L2-043 龙龙送外卖

L2-043 龙龙送外卖 题目描述: 给你n个点,m次询问,n个点构成一棵树 给出n个点,每个点的父节点 你现在在根结点,对于每次询问i,你都要回答,从根结点出发,至少经历1到i次询问的每个点1…

构建用户画像完整版

01 画像平台产品架构 上图是基于快看数据中台画像平台产品的理解和定位整理出来的产品架构。 画像平台首先是服务于业务的,运营可以基于画像平台对单个用户或者人群包做画像的洞察,平台服务的业务应用层包含: (1)个…

【C++初阶】(入门)命名空间

在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字…

【文章学习系列之模型】FEDformer

本章内容文章概况模型流程主要结构Frequency Enhanced Decomposition Architecture(频率增强分解结构)Fourier enhanced blocks and Wavelet enhanced blocks(傅里叶增强模块和小波增强模块)Fourier Enhanced Structure&#xff0…

基于Segment anything的实例分割半自动标注

介绍 使用Meta AI的SAM,并添加了一个基本界面来标记图像,并保存COCO格式的掩码。 源码 https://github.com/anuragxel/salt 安装 安装SAM;创建conda虚拟环境,使用conda env create -f environment.yaml;安装coco-viewer来快速可视化标注结果。使用方法 1、将图片放入到…

WSL下的Kafka开发容器:Docker搭建、API、整合

背景介绍 Kafka是一个分布式流处理平台,可以处理大规模数据流并支持实时数据流的处理。 本文介绍了如何在WSL下使用Docker搭建Kafka容器,并使用Python的kafka-python库和FastAPI框架实现了一个简单的API。同时,还将该服务整合到一个整体的d…

ssm异常处理

ssm异常处理 类上和方法上都要有注解: 类上的注解: 异常处理用到的注解,里面包含了其他的一些必须的注解,详解看下图 方法上的注解: 上面的要懂打配合 现在创建一个处理异常的工具类,加上前面提到的注…

CSRF与SSRF比较

CSRF与SSRF比较 参考:简述CSRF、SSRF的区别 CSRF CSRF,全名 Cross-site requestforgery,也就是 跨站请求伪造。XSS是跨站脚本攻击。与XSS比较,XSS攻击是跨站脚本攻击,CSRF是跨站请求伪造,也就是说CSRF攻…

【Redis】入门篇之相关概念与Redis的安装

目录 一、关系型数据库与非关系型数据库 1、非关系数据库的种类 2、关系型数据库与非关系型数据库的区别 二、认识Redis 1、概念 2、特点 1.键值型 2.单线程 3.低延迟、速度快 4.支持数据持久化 5.支持主从集群、分片集群 6.支持多语言客户端 三、Redis的安装 1、…

IO-IO基础

简介 IO流,以计算机内存为主体,从内存到网络/磁盘等其他地方叫输出流(内存往外出);网络/磁盘等其他地方写到内存叫输入流(往内存输入)。 Java中的IO流 4个抽象基类 InputStream/Reader(读到内存里) 所有的输入流的基…