【机器学习】交叉验证 Cross-validation

交叉验证(CrossValidation)方法思想简介

以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标.常见CV的方法如下:

1).Hold-Out Method

将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性.

2).K-fold Cross Validation(记为K-CV)

将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.

3).Leave-One-Out Cross Validation(记为LOO-CV)

如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.相比于前面的K-CV,LOO-CV有两个明显的优点:


a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。


b.实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间.

对交叉验证这个问题,一直以来,不明白是怎么回事。近期看材料,涉及到了这个问题,写的通俗易懂,有种恍然大悟的感觉。下面,我写下对这个问题的理解。

现在假设这里有一堆数据,作为统计er的任务就是从这些数据中提取有用的信息。如何提取信息呢,我们的法宝就是–模型。模型在统计当中是极其重要的,学统计就是跟各种各样的模型混个脸熟。在模型的基础上,我们利用数据对模型的参数进行估计,从而通过参数化后的模型来描述数据的内在关系,了解数据内在的关系(pattern)非常必要,有助于对未来进行预测。

那么对于手里的数据,我们该套用什么样的模型呢?事实上,对于一个数据分析问题而言,可用的模型不只一个,不存在所谓最优的模型。你不能说,某个模型是最好的,其他模型都是不可取的,某个模型在某个问题下,可能解释能力优于其他模型,但这并不意味着在该类问题下,该模型就是万能的,可能换一种评价标准,这种模型就不是最好的。我们的任务是从几个备选模型中,按照某种评价标准,选择出较为合理的一个模型。

一个直接的想法是比较各个模型的对数据的拟合效果。例如,对于一个x,y

数据而言,线性回归的残差平方和可能比非线性回归的残差平方和要小,这时我们说,线性回归拟合效果更好,线性回归模型是理想的选择。但是这种比较方式存在一种缺陷—过拟合问题。有些模型,对原始数据拟合相当好,但是它的预测效果却出奇的差。更重要的是,数据分析的最终目的并不是拟合数据,而是对未来进行预测。一个合理的模型一方面可以拟合原始数据,另一方面又应该可以以高准确率进行预测。所以进行模型选择时,要综合考虑这两方面因素。情况常常是,拟合效果和预测误差二者鱼和熊掌不能兼得,我们需要在二者之间寻找一种平衡。

交叉验证就是基于这样的考虑。我们以K折交叉验证(k-folded cross validation)来说明它的具体步骤。

{A1,A2,A3,A4,A5,A6,A7,A8,A9}{A1,A2,A3,A4,A5,A6,A7,A8,A9}

为了简化,取k=10。在原始数据A的基础上,我们随机抽取一组观测,构成一个数据子集(容量固定),记为A1

重复以上过程10次,我们就会获得一个数据子集集合      {A1,A2,A3,A4,A5,A6,A7,A8,A9,A10}

接下来,我们首先对模型M1

进行交叉验证,如下,

{A2,A3,A4,A5,A6,A7,A8,A9,A10}基础上构建模型M1,并对数据集A1进行验证,将预测值与真值进行比较,在某一评价标准下,计算一个得分a1,1
.{A1,A3,A4,A5,A6,A7,A8,A9,A10}
基础上构建模型M1,并对数据集A2进行验证,将预测值与真值进行比较,在同一评价标准下,计算一个得分a1,2
.
……
在{A1,A2,A3,A4,A5,A6,A7,A8,A9}
基础上构建模型,并对数据集A10进行验证,将预测值与真值进行比较,在同一评价标准下,计算一个得分a1,10
.
a1=a1,1+a1,2++a1,10/10
作为模型M1的综合得分。

{A2,A3,A4,A5,A6,A7,A8,A9,A1

对每个模型都这样过一遍,最后得到了每个模型的一个得分,按照得分,我们就可以选择最合理的模型。

将数据打成好多份,交叉验证模型,很有点bootstrap的意思,bootstrap的思想渗透到了统计学的各个领域了已经。

除了K折交叉验证,另外两种交叉验证为Hold Out 验证和留一验证:

Hold验证:常识来说,Holdout 验证并非一种交叉验证,因为数据并没有交叉使用。 随机从最初的样本中选出部分,形成交叉验证数据,而剩余的就当做训练数据。 一般来说,少于原本样本三分之一的数据被选做验证数据。

留一验证: 正如名称所建议, 留一验证(LOOCV)意指只使用原本样本中的一项来当做验证资料, 而剩余的则留下来当做训练资料。 这个步骤一直持续到每个样本都被当做一次验证资料。 事实上,这等同于 K-fold 交叉验证是一样的,其中K为原本样本个数。

一、训练集 vs. 测试集

在模式识别(pattern recognition)与机器学习(machine learning)的相关研究中,经常会将数据集(dataset)分为训练集(training set)跟测试集(testing set)这两个子集,前者用以建立模型(model),后者则用来评估该模型对未知样本进行预测时的精确度,正规的说法是泛化能力(generalization ability)。怎么将完整的数据集分为训练集跟测试集,必须遵守如下要点:

1、只有训练集才可以用在模型的训练过程中,测试集则必须在模型完成之后才被用来评估模型优劣的依据。
2、训练集中样本数量必须够多,一般至少大于总样本数的50%。
3、两组子集必须从完整集合中均匀取样。
其中最后一点特别重要,均匀取样的目的是希望减少训练集/测试集与完整集合之间的偏差(bias),但却也不易做到。一般的作法是随机取样,当样本数量足 够时,便可达到均匀取样的效果,然而随机也正是此作法的盲点,也是经常是可以在数据上做手脚的地方。举例来说,当辨识率不理想时,便重新取样一组训练集/ 测试集,直到测试集的识别率满意为止,但严格来说这样便算是作弊了。

二、交叉验证(Cross Validation)

交叉验证(Cross Validation)是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集 (training set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。常见的交叉验证方法如下:

1、Hold-Out Method

将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此分类器的性能指标。 此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关 系,所以这种方法得到的结果其实并不具有说服性。

2、Double Cross Validation(2-fold Cross Validation,记为2-CV)

做法是将数据集分成两个相等大小的子集,进行两回合的分类器训练。在第一回合中,一个子集作为training set,另一个便作为testing set;在第二回合中,则将training set与testing set对换后,再次训练分类器,而其中我们比较关心的是两次testing sets的辨识率。不过在实务上2-CV并不常用,主要原因是training set样本数太少,通常不足以代表母体样本的分布,导致testing阶段辨识率容易出现明显落差。此外,2-CV中分子集的变异度大,往往无法达到“实 验过程必须可以被复制”的要求。

3、K-fold Cross Validation(K-折交叉验证,记为K-CV)

将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证 集的分类准确率的平均数作为此K-CV下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取 2。K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性。

4、Leave-One-Out Cross Validation(记为LOO-CV)

如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模 型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。相比于前面的K-CV,LOO-CV有两个明显的优点:
(1)每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
(2)实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间。

三、使用Cross-Validation时常犯的错误

由于实验室许多研究都有用到 evolutionary algorithms(EA)与 classifiers,所使用的 fitness function 中通常都有用到 classifier 的辨识率,然而把cross-validation 用错的案例还不少。前面说过,只有 training data 才可以用于 model 的建构,所以只有 training data 的辨识率才可以用在 fitness function 中。而 EA 是训练过程用来调整 model 最佳参数的方法,所以只有在 EA结束演化后,model 参数已经固定了,这时候才可以使用 test data。那 EA 跟 cross-validation 要如何搭配呢?Cross-validation 的本质是用来估测(estimate)某个 classification method 对一组 dataset 的 generalization error,不是用来设计 classifier 的方法,所以 cross-validation 不能用在 EA的 fitness function 中,因为与 fitness function 有关的样本都属于 training set,那试问哪些样本才是 test set 呢?如果某个 fitness function 中用了cross-validation 的 training 或 test 辨识率,那么这样的实验方法已经不能称为 cross-validation 了。

EA 与 k-CV 正确的搭配方法,是将 dataset 分成 k 等份的 subsets 后,每次取 1份 subset 作为 test set,其余 k-1 份作为 training set,并且将该组 training set 套用到 EA 的 fitness function 计算中(至于该 training set 如何进一步利用则没有限制)。因此,正确的 k-CV 会进行共 k 次的 EA 演化,建立 k 个classifiers。而 k-CV 的 test 辨识率,则是 k 组 test sets 对应到 EA 训练所得的 k 个 classifiers 辨识率之平均值。

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

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

相关文章

给新手教师的成长建议

随着教育的不断发展和进步,越来越多的新人加入到教师这个行列中来。从学生到教师,这是一个华丽的转身,需要我们不断地学习和成长。作为一名新手老师,如何才能快速成长呢?以下是一名老师教师给的几点建议: 一…

人工智能对我们的生活影响有多大

随着科技的飞速发展,人工智能已经渗透到我们生活的方方面面,并且越来越受到人们的关注。从智能语音助手到自动驾驶汽车,从智能家居系统到医疗诊断,人工智能技术正在改变着我们的生活方式。那么,人工智能对我们的生活影…

使用 RAFT 的光流:第 1 部分

一、说明 在这篇文章中,我们将了解一种旗舰的光流深度学习方法,该方法获得了 2020 年 ECCV 最佳论文奖,并被引用超过 1000 次。它也是KITTI基准测试中许多性能最佳的模型的基础。该模型称为 RAFT:Recurrent All-Pairs Field Trans…

微信表情太大怎么缩小?一分钟教会你!

在微信的较早版本中,单个表情的最大体积限制为500KB,而在后续版本中,这一限制已经放宽。目前,微信允许上传的单个表情最大体积为2MB。所以,我们只需要把图片或者GIF缩小到2MB即可,下面就向大家介绍三种实用…

如何给面试官解释什么是分布式和集群?

分布式(distributed) 是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务。 集群(cluster) 是指在多台不同的服务器中部署相同应用或服务模块,构成一个集群&#…

(论文阅读40-45)图像描述1

40.文献阅读笔记(m-RNN) 简介 题目 Explain Images with Multimodal Recurrent Neural Networks 作者 Junhua Mao, Wei Xu, Yi Yang, Jiang Wang, Alan L. Yuille, arXiv:1410.1090 原文链接 http://arxiv.org/pdf/1410.1090.pdf 关键词 m-RNN、…

Java面试题07

1.线程池都有哪些状态? 线程池的状态有RUNNING(运行中)、SHUTDOWN(关闭中,不接受新任务)、 STOP(立即关闭,中断正在执行任务的线程)和TERMINATED(终止&#x…

数字化转型与企业创新—基于中国上市公司年报的经验证据(2007-2022年)

参照潘红波(2022)的做法,对来自中南大学学报《数字化转型与企业创新—基于中国上市公司年报的经验证据》一文中的基准回归部分进行复刻。文章实证检验数字化转型对企业创新的影响。用年报词频衡量 一、数据介绍 数据名称:数字化转…

【C++心愿便利店】No.14---C++之探索list底层原理

文章目录 前言一、list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list operations1.2.7 list的迭代器失效 二、list的模拟实现2.1 定义一个结构体实现list的…

Mysql(基本介绍+下载安装+服务器+基本使用+建库建表+navicat/mybitas工具+外键及实例)

一、Mysql基本介绍 当谈论MySQL时,通常指的是一个流行的开源关系型数据库管理系统(RDBMS)。MySQL是由瑞典的开发者在1995年创建的,后来被Sun Microsystems收购,最终成为Oracle Corporation的一部分。以下是关于MySQL的…

opencv重点知识

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了大量用于图像处理和计算机视觉任务的工具和算法。以下是一些OpenCV中的重点知识: 图像加载与显示: 使用cv2.imread()加载图像。使用cv2.imshow()显示…

深入分析TaskView源码之触摸相关

问题背景 hi,粉丝朋友们: 大家好!android 10以后TaskView作为替代ActivityView的容器,在课程的分屏pip自由窗口专题也进行了相关的详细介绍分析。 这里再补充一下相关的TaskView和桌面内嵌情况下的触摸分析 主要问题点&#xff…

【经验分享】Ubuntu如何设置swap交换

我的Linux小鸡内存只有512兆,经常爆内存,导致很多应用没有办法一直正常运行,可以通过设置swap来缓解一下,虽然和内存的速度无法媲美,但是能一定程度缓解一下问题 文章目录 1. 创建一个交换文件2. 设置正确的权限3. 设置…

腾讯云标准型s5和s6有什么区别?CPU处理器有差异吗?

腾讯云服务器CVM标准型S5和S6有什么区别?都是标准型云服务器,标准型S5是次新一代云服务器规格,标准型S6是最新一代的云服务器,S6实例的CPU处理器主频性能要高于S5实例,同CPU内存配置下的标准型S6实例要比S5实例性能更好…

C++动态调用dll中的函数

vs中创建一个dll项目&#xff0c;头文件中写上如下代码&#xff1a; extern "C" __declspec(dllexport) int Add(int a, int b);cpp文件中&#xff1a; int Add(int a, int b) {return a b; }主程序中main.cpp中&#xff1a; #pragma once #include <iostream…

【开源】基于JAVA的社区买菜系统

项目编号&#xff1a; S 011 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S011&#xff0c;文末获取源码。} 项目编号&#xff1a;S011&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1…

OpenLDAP配置web管理界面PhpLDAPAdmin服务-centos9stream

之前已经发了一篇关于centos9下面配置openldap多主高可用集群的内容&#xff0c;不会配置ldap集群的请参考&#xff1a;服务器集群配置LDAP统一认证高可用集群&#xff08;配置tsl安全链接&#xff09;-centos9stream-openldap2.6.2-CSDN博客 这里跟着前篇文章详细说明如何配置…

【汇编】其他转移指令、call指令和ret指令

文章目录 前言一、其他转义指令1.1 jcxz指令怎么使用jcxz性质 1.2 loop指令 二、call和ret指令2.1 模块化程序设计模块化程序设计是什么&#xff1f; 2.2 call和retcall 指令指令“call far ptr 标号”实现的是段间转移转移地址在寄存器中的call指令转移地址在内存中的call指令…

RESTful API 设计指南——为什么要用(上)

引言 在上一篇中&#xff1a;RESTful API 设计指南——开篇词 我们介绍了几个十分有争议的案例&#xff1a; 所有的接口都使用Post请求不管成功还是失败&#xff0c;HTTP状态码都返回200API命名千奇百怪 本章我们来深入分析一下&#xff0c;为什么不要像案例中所说的那样干…

微信小程序内嵌h5页面,实现动态设置顶部标题的功能

一、需求描述 使用HBuilder X作为开发工具&#xff0c;vue作为开发语言&#xff0c;开发微信小程序。微信小程序页面内嵌h5页面&#xff0c;即<web-view></web-view>标签。通过设置不同url连接地址&#xff0c;设置不同的标题。 二、失败做法 页面A嵌入h5页面&a…