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

2023-05-16

交叉验证(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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(Deep Learning)交叉验证(Cross Validation) 的相关文章

随机推荐

  • window11 无法切换输入法打印不出汉字问题修改

    1 xff09 按 WINDOW 43 R 键启动cmd 窗口 2 xff09 在cmd窗口中输入 services msc 启动服务窗口 3 xff09 找到 TextInputManagementService xff0c 开启即可
  • 在c++中字符串复制与内存复制之间的区别

    1 编程实现strcpy函数 字符串复制的实现 原型char strcpy char strdest const char strSrc 对于上述代码 xff0c 为什么要用char 类型呢 xff1f 为了能够链式表达式 2 内存复制函数
  • static静态变量与普通变量的区别

    1 static全局变量与普通全局变量的区别 全局变量的说明之前再加上static就构成静态全局变量 全局变量本身就是静态存储方式 xff0c 静态全局变量当然也是静态存储方式 这两者在存储方式上没有区别 区别在于 xff0c 非静态全局变
  • VS2013与数据库mysql8.0的连接

    1 准备 xff1a vs2013 mysql 8 0 1 1首先我们到官网上下载mysql 下载完成后解压 xff0c 安装 vs2013下载解压安装 2 我们打开安装后的mysql文件夹 我们一会要重点用到 include 和lib 所
  • 用VS2013中MFC开发视频播放器

    1 搭建开发环境 1 1 vs2013网上有许多软件可以自行下载或者 vs2013的安装包 有需要的留言我给发 1 2 搭建DirectShow开发环境 我参考的书上说要自己下一个DriectShow xff0c 但是我下载了好多次 xff
  • 用VS2013中MFC开发视频播放器(2)

    上一个博客我写了做视频播放器的环境搭建 xff0c 没写完这个项目 xff0c 所以今天在把它详细的写一遍流程 xff0c 介绍一下这个项目的编写 1 需求分析 xff1b 要求开发播放器系统能够播放媒体文件 xff0c 而且还可以进行播放
  • 基于正点原子探索者使用STM32CubeMX+FreeRTOS+LWIP

    开发板是使用正点原子的探索者为例 xff0c PHY芯片可以是LAN8720A和IP101GR xff0c 因为有两份代码参考 xff0c 一份是LAN8720A xff0c 一份是IP101GR 首先第一步 xff1a 我们使用移植好的功
  • C++笔试中遇到的问题

    1 sizeof与strlen的区别 xff1f 答 xff1a sizeof是操作符 xff0c 分配的数组实际所占的内存空间大小 xff0c 不受里面存储内容的影响 strlen是函数 xff0c strlen计算字符串的长度 xff0
  • CRC计算的简单原理及代码实现(python)

    目录 多项式的获取 CRC计算的示例图 示例代码 多项式的获取 举例如下 xff08 其余的多项式依次类推即可 xff09 xff1a 故最终多项式获取的参与异或计算的数据为 xff1a 1011 CRC计算的示例图 假设原始数据为 xff
  • 深度学习训练数据中的特征重要性排名

    查看神经网络模型特征重要性的思路 xff1a 依次变动各个特征 xff0c 通过模型最终预测的结果来衡量特征的重要性 神经网络特征重要性的获取步骤如下 xff1a 训练一个神经网络模型 xff1b 每次对一个特征列进行随机shuffle x
  • (笔记)Python import 其他路径下的文件

    一般情况下 xff0c 如果要import的文件和被import的文件位于同一路径下 xff0c 可以使用 xff1a import 文件名 的方式直接进行引用 但如果这两个文件不在同一路径下 xff0c 就需要在被import的文件路径下
  • (Note)Python osgeo&shapefile库的安装

    1 shapefile anaconda xff1a conda install pyshp pip xff1a pip install pyshpe 2 osgeo 进入Link xff1a https www lfd uci edu g
  • (Note)Python 统计列表中各元素出现的次数

    演示列表 xff1a Demo list 61 1 2 3 3 3 5 6 2 2 0 4 5 2 7 8 4 5 1 3 9 8 7 1 统计列表中不同元素的个数 Demo list 61 1 2 3 3 3 5 6 2 2 0 4 5
  • (Note)海韵&海韵代工的电源-风扇智能启停按钮

    海韵是电源四大厂之一 xff0c 旗下有众多型号的电源 其中 xff0c 部分电源的后部会有一个方形的按钮 xff08 在电源开关左侧 xff09 如图所示 xff1a 这是海韵FOCUS 43 电源特有的 34 HYBRIDMOOE 34
  • (Note)七彩虹30系列显卡——《一键超频》按键

    七彩虹部分30系高端显卡提供了一键超频功能 xff0c 通过按下超频按钮可以实现显卡一键超频 七彩虹显卡的一键超频按钮使用方法 xff1a 按下超频 xff0c 弹起默认 切换需要重启电脑 xff01
  • (Note)优化器Adam的学习率设置

    记录一下知乎看到的问题 xff1a Adam的学习率设置 常用的神经网络优化器Adam的自适应学习率并不是真正意义上的自适应 从统计的角度看 xff0c Adam的自适应原理也是根据统计对梯度进行修正 xff0c 但依然离不开前面设置的学习
  • (Note)深度学习与人工提取的特征

    首先 xff0c 深度学习一般 不需要人工提取特征 如果仅仅给网络提供人工提取的特征 xff0c 反而有可能会造成网络性能的下降 xff08 深度学习模型可能提取到一些人类不易察觉的特征 xff0c 这些特征可能对结果的判定有着较大的贡献
  • Linux驱动开发与裸机开发区别

    Linux驱动开发与裸机开发区别 裸机驱动开发回顾Linux驱动开发思维Linux驱动开发分类 裸机驱动开发回顾 1 底层 跟寄存器打交通 xff0c 有些MCU提供了库 Linux驱动开发思维 1 Linux下驱动开发直接操作寄存器不现实
  • Linux下使用U盘

    第一步 xff1a 插入U盘 xff0c 如果能够识别出U盘 xff0c 则会打印出一些信息 xff1b 第二步 xff1a 查看U盘系统分配给U盘的设备名 xff1b 输入如下命令进行查看 xff1a fdisk l dev sda 如果
  • (Deep Learning)交叉验证(Cross Validation)

    交叉验证 xff08 Cross Validation xff09 交叉验证 xff08 Cross Validation xff09 是一种评估模型泛化性能的统计学方法 xff0c 它比单次划分训练集和测试集的方法更加稳定 全面 交叉验证