训练集、验证集、测试集以及交验验证的理解

训练集、验证集、测试集以及交验验证的理解在人工智能机器学习中,很容易将“验证集”与“测试集”,“交叉验证”混淆。一、三者的区别训练集(trainset)——用于模型拟合的数据样本。 验证集(developmentset)——是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。在神经网络中,我们用验证数据集去寻找最优的网络深度(nu…

大家好,又见面了,我是你们的朋友全栈君。

     在人工智能机器学习中,很容易将“验证集”与“测试集”,“交叉验证”混淆。

一、三者的区别

  • 训练集(train set) —— 用于模型拟合的数据样本。
  • 验证集(validation set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 通常用来在模型迭代训练时,用以验证当前模型泛化能力(准确率,召回率等),以决定是否停止继续训练。

                 在神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量;

               在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。

  • 测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
类别 验证集 测试集
是否被训练到
作用

1)调超参数;

2)监控模型是否发生过拟合(以决定是否停止训练)

为了评估最终模型泛化能力
使用次数 多次使用,以不断调参 仅仅一次使用
缺陷 模型在一次次重新手动调参并继续训练后所逼近的验证集,可能只代表一部分非训练集,导致最终训练好的模型泛化性能不够

一个形象的比喻:

    训练集———–学生的课本;学生 根据课本里的内容来掌握知识。

    验证集————作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。

    测试集———–考试,考的题是平常都没有见过,考察学生举一反三的能力。

传统上,一般三者切分的比例是:6:2:2,验证集并不是必须的。

二、为什么要测试集

a)训练集直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止课本死记硬背的学生拥有最好的成绩,即防止过拟合)

b)验证集参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不能算是学习好的学生)。

c) 所以要通过最终的考试(测试集)来考察一个学(模)生(型)真正的能力(期末考试)

但是仅凭一次考试就对模型的好坏进行评判显然是不合理的,所以接下来就要介绍交叉验证法

三、交叉验证法(模型选择)

 a) 目的

   交叉验证法的作用就是尝试利用不同的训练集/验证集划分来对模型做多组不同的训练/验证,来应对单独测试结果过于片面以及训练数据不足的问题。(就像通过多次考试,才通知哪些学生是比较比较牛B的)

交叉验证的做法就是将数据集粗略地分为比较均等不相交的k份,即

训练集、验证集、测试集以及交验验证的理解

然后取其中的一份进行测试,另外的k-1份进行训练,然后求得error的平均值作为最终的评价,具体算法流程如下:

训练集、验证集、测试集以及交验验证的理解

       举个例子:假设建立一个BP神经网络,对于隐含层的节点数目,我们并没有很好的方法去确定。此时,一般将节点数设定为某一具体的值,通过训练集训练出相应的参数后,再由交叉验证集去检测该模型的误差;

然后再改变节点数,重复上述过程,直到交叉验证误差最小。

b) 交叉验证算法的具体步骤如下

1.      随机将训练数据等分成k份,S1, S2, …, Sk。

2.      对于每一个模型Mi,算法执行k次,每次选择一个Sj作为验证集,而其它作为训练集来训练模型Mi,把训练得到的模型在Sj上进行测试,这样一来,每次都会得到一个误差E,最后对k次得到的误差求平均,就可以得到模型Mi的泛化误差。

3.      算法选择具有最小泛化误差的模型作为最终模型,并且在整个训练集上再次训练该模型,从而得到最终的模型。

               K折交叉验证,其主要 的目的是为了选择不同的模型类型(比如一次线性模型、非线性模型、),而不是为了选择具体模型的具体参数。比如在BP神经网络中,其目的主要为了选择模型的层数、神经元的激活函数、每层模型的神经元个数(即所谓的超参数)。每一层网络神经元连接的最终权重是在模型选择(即K折交叉验证)之后,由全部的训练数据重新训练。 

目的在模型选择,而非模型训练调整参数。

c) K值的选择

      K值的选取是一个偏差与方差的权衡:

  K=1时,所有数据用于训练,容易过拟合;

 K=N时,相当于留一法LOOCV  (Leave-one-out cross-validation ).; 

通常建议K=10.,2017年的一项研究给出了另一种经验式的选择方法[3],作者建议 训练集、验证集、测试集以及交验验证的理解 且保证 训练集、验证集、测试集以及交验验证的理解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146295.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVASCRIPT拷贝内容到剪切板

    JAVASCRIPT拷贝内容到剪切板

    2021年8月12日
    53
  • idea怎么取消多行注释_idea注释快捷键哪里修改

    idea怎么取消多行注释_idea注释快捷键哪里修改1、一次性添加多行注释的快捷键首先选中要注释区域,然后ctrl+/    这个是多行代码分行注释,每行一个注释符号ctrl+shift+/  这个是多行代码注释在一个块里,只在开头和结尾有注释符号2、取消多行注释快捷键怎样添加快捷键的,用相同方法取消,如ctrl+/ 添加注释,则ctrl+/取消注释ctrl+shift+/添加注释,则ctr

    2022年8月15日
    4
  • (1)美团面试题:Hashmap的结构,1.7和1.8有哪些区别,史上最深入的分析「建议收藏」

    (一)真实面试题之:Hashmap的结构,1.7和1.8有哪些区别不同点:(1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法就是能够提高插入的效率,但是也会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。(2)扩…

    2022年4月9日
    33
  • QQ vx 刷屏神器!!

    QQ vx 刷屏神器!!在电脑上桌面新建一个txt,然后在里面写入下面的代码,写好后把文件的txt格式改为vbs格式即可次数别设太多,会卡死,间隔时间别太短setwshshell=wscript.createobject(“wscript.shell”)wshshell.AppActivate”王择玉”fori=1to2wscript.sleep100wshshell.sendKeys…

    2022年6月12日
    54
  • C/C++之makefile写法

    C/C++之makefile写法参考:https://www.cnblogs.com/owlman/p/5514724.html什么是makefileMakefile文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile的好处是能够使用一行命令来完成…

    2022年5月1日
    40
  • 【超详细教程】移植RT-Thread nano,并基于 nano 添加 FinSH/shell

    【超详细教程】移植RT-Thread nano,并基于 nano 添加 FinSH/shell目录背景:移植RT-Threadnano,并基于nano添加FinSH/shell前提及准备工作step1:添加rt-threadnano到裸机工程1.1、NanoPack安装方法一:PackInstaller安装方法二:手动安装1.2、基础工程准备1.3、开始移植rttnano到裸机工程1.4、适配RT-Threadnano1.5…

    2022年5月21日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号