交叉验证的种类和原理(sklearn.model_selection import *)

交叉验证的种类和原理
所有的来自https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation-iterators并掺杂了自己的理解。

文章目录

  • 前言
  • 一、基础知识
    • 1.1 交叉验证图形表示
    • 1.2 交叉验证主要类别
  • 二、部分交叉验证函数(每类一个)
    • 2.1 Cross-validation iterators for i.i.d. data(i.i.d.数据的交叉验证迭代器)
      • K-fold定义
    • 2.2 Cross-validation iterators with stratification based on class labels(基于类标签分层的交叉验证迭代器)
      • Stratified k-fold定义
    • 2.3 Cross-validation iterators for grouped data(分组数据的交叉验证迭代器)
      • Group k-fold
    • 2.4 Cross validation of time series data(时间序列数据的交叉验证)
      • Time Series Split定义
  • 三、全部交叉验证函数
  • 总结


前言

前提:假设某些数据是独立且相同分布的 (i.i.d.),假设所有样本都源于同一个生成过程,并且假设生成过程没有对过去生成的样本的记忆。
注意:虽然i.i.d.数据是机器学习理论中的常见假设,但在实践中很少成立。如果知道样本是使用瞬态过程生成的,则使用时间序列感知交叉验证方案会更安全(例一)。同样,如果我们知道生成过程具有组结构(从不同受试者、实验、测量设备收集的样本),则使用分组交叉验证会更安全(例二)。
例一:像振动信号这样的信号,我们对一个信号分段截取后,每一段都和之前和之后截取的数据在时间维度上是相关的,所以每个片段之间不是独立且同分布的,所以官网针对具有时间相关性的数据创建了相关的交叉验证(时间序列感知交叉验证)。
例二:从多个患者那里收集医疗数据,从每个患者(也可以是机器部件)身上采集多个样本。在我们的示例中,每个样本的患者 ID 将是其组(group)标识符。在这种情况下,我们想知道在一组特定组上训练的模型是否能很好地泛化到看不见的组。为了衡量这一点,我们需要确保测试集中的所有样本都来训练集中根本没有表示的组。


一、基础知识

1.1 交叉验证图形表示

以四倍交叉验证为例:
0,1,2,3:每一行表示测试集和训练集的划分的一种方式。
class:表示类别的个数(下图显示的是3类),有些交叉验证根据类别的比例划分测试集和训练集(例三)。
group:表示从不同的组采集到的样本,颜色的个数表示组的个数(有些时候我们关注在一组特定组上训练的模型是否能很好地泛化到看不见的组)。举个例子(解释“组”的意思):我们有10个人,我们想要希望训练集上所用的数据来自(1,2,3,4,5,6,7,8),测试集上的数据来自(9,10),也就是说我们不希望测试集上的数据和训练集上的数据来自同一个人(如果来自同一个人的话,训练集上的信息泄漏到测试集上了,模型的泛化性能会降低,测试结果会偏好)。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1.2 交叉验证主要类别

  • 独立同分布数据的交叉验证迭代器(对应理想情况下)
  • 基于类标签分层的交叉验证迭代器(对应例三)
  • 分组数据的交叉验证迭代器(对应例二)
  • 时间序列数据的交叉验证(对应例一)

二、部分交叉验证函数(每类一个)

2.1 Cross-validation iterators for i.i.d. data(i.i.d.数据的交叉验证迭代器)

K-fold定义

KFold 将所有样本分成 k堆大小相等的样本堆,称为折叠数(如果 k=n,这相当于 Leave One Out 策略)。分别使用其中
k-1堆样本做训练,剩余的1堆做测试(进行k次实验)。下图是k=4的情况。第0行的红色样本(1堆)作为测试集,剩余的蓝色样本(4-1=3堆)作为训练集。可以从图中看出,测试集和训练集的划分和class及grou无关,但从图上可以看出每个类别数据的数量是不一样的,同时也不是来自同一个group。所以存在一些问题
行标0,1,2,3表示训练集和测试集划分情况,K-fold这个交叉验证的class和group行只表示数据集的情况,即class表示类别的个数和每个类别所占的比例,group表示组的个数和每个组所占的比例。
值得注意的是:该划分和class及group无关,会存在在训练里没有的类别样本,在测试集里有(例如第0行的数据集划分就出现的了这样的问题:训练集没包含所有类别的样本)。
打散数据可以解决或缓解上述问题。
在这里插入图片描述

2.2 Cross-validation iterators with stratification based on class labels(基于类标签分层的交叉验证迭代器)

Stratified k-fold定义

有些分类问题的不同类别样本的比例可能不一样。
Stratified K-Fold 是 k-fold 的一种变体,它根据类别的比例指导数据集的划分,如下图所示。假设class行各个颜色(类别)的比例是1:3:6,可以看到第0行第一个红色的大小占第一个类别的1/4(k=4),第0行第二个红色的大小占第二个类别的1/4,等。
在这里插入图片描述

2.3 Cross-validation iterators for grouped data(分组数据的交叉验证迭代器)

Group k-fold

有些情况下,我们想知道在特定组别上训练出来的模型是否能很好地泛化到未见过的组别上。为了衡量这一点,我们需要确保测试集中的所有样本都来自训练集中完全没有的组。
Group K-Fold 是 k-fold 的一种变体,它可以确保测试集和训练集中不包含同一群体。它根据group划分测试集和训练集。
值得注意的是:该划分根据group划分数据集的,该划分和class无关,例如:第2行第一个红块包含了class行的藏青色类(第一个块)的所有样本,训练集中完全没有这各类别的数据——这是一个很大的问题。
打散数据不一定可以解决或缓解上述问题。
在这里插入图片描述

2.4 Cross validation of time series data(时间序列数据的交叉验证)

Time Series Split定义

时间序列数据的特点是时间相近的观测值之间存在相关性(自相关性)。然而,经典的交叉验证技术(如 KFold 和 ShuffleSplit)假设样本是独立且同分布的,这将导致时间序列数据的训练实例和测试实例之间存在不合理的相关性(导致泛化误差估计值较差)。因此,在 "未来 "观测数据上评估我们的时间序列数据模型非常重要,这些观测数据至少与用于训练模型的观测数据相同。为此,TimeSeriesSplit 提供了一种解决方案。
在这里插入图片描述

三、全部交叉验证函数

2.1 Cross-validation iterators for i.i.d. data(i.i.d.数据的交叉验证迭代器)
2.1.1 K-fold
2.1.2 Repeated K-Fold
2.1.3 Leave One Out (LOO)
2.1.4 Leave P Out (LPO)
2.1.5 Random permutations cross-validation a.k.a. Shuffle & Split
2.2 Cross-validation iterators with stratification based on class labels(基于类标签分层的交叉验证迭代器)
2.2.1 Stratified k-fold
2.2.2 Stratified Shuffle Split
2.3 Cross-validation iterators for grouped data(分组数据的交叉验证迭代器)
2.3.1 Group k-fold)
2.3.2 StratifiedGroupKFold
2.3.3 Leave One Group Out
2.3.4 Leave P Groups Out
2.3.5 Group Shuffle Split
2.4 Cross validation of time series data(时间序列数据的交叉验证)
2.5 Predefined Fold-Splits / Validation-Sets(预定义的折叠分割/验证集)
2.6 Using cross-validation iterators to split train and test(使用交叉验证迭代器拆分训练和测试)

总结

基于类标签分层的交叉验证迭代器比其他缺了3个迭代器,因为基于类标签分层的交叉验证迭代器不存在leave one out(留一法),leave p out(留P法)等。
在这里插入图片描述
要综合考虑class和group对数据划分的影响,也要考虑数据集本身各方面的特点。
建议:把数据集打乱,多做几组交叉验证,显示验证结果,分析结果原因。

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

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

相关文章

如何在VSCode搭建ESP-IDF开发ESP32

文章目录 概要安装VScode安装ESP-IDF插件使用官方例程小结 概要 ESP-IDF(Espressif IoT Development Framework) 即乐鑫物联网开发框架,它基于 C/C 语言提供了一个自给自足的 SDK,可为在 Windows、Linux 和 macOS 系统平台上开发 ESP32 应用程序提供工具…

旅游平台网页前后端

功能清单 游客功能 用户注册、登录登录权限拦截按名称搜索房间支付流程查看订单信息和状态评论预定过的房间,并自动修改订单状态查看统计剩余房间数量,数量为0时不可预定 管理员功能 房间分类管理 类型的删除、修改、查询(准备添加增添功能…

3D展2D数学原理

今年早些时候,我为 MAKE 杂志写了一篇教程,介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理,并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub,但我在这里编写了对使这一…

【大数据面试知识点】Spark的DAGScheduler

Spark数据本地化是在哪个阶段计算首选位置的? 先看一下DAGScheduler的注释,可以看到DAGScheduler除了Stage和Task的划分外,还做了缓存的跟踪和首选运行位置的计算。 DAGScheduler注释: The high-level scheduling layer that i…

深度学习核心技术与实践之自然语言处理篇

非书中全部内容,只是写了些自认为有收获的部分。 自然语言处理简介 NLP的难点 (1)语言有很多复杂的情况,比如歧义、省略、指代、重复、更正、倒序、反语等 (2)歧义至少有如下几种: …

策略模式示例,Lambda表达式

这样会有很多代码冗余 以上代码使用策略模式优化 优化方案1 那么现在可以这样 优化方案二 原先定义了接口,还需要一个个写实现类,其实完全没必要,用匿名内部类方式就可以 优化方案三:用lambda方式简写 优化方案四:不需要定义接口 使用Stream API

从0到1浅析Redis服务器反弹Shell那些事

文章目录 前言Redis服务1.1 特点与应用1.2 安装与使用1.3 语法和配置1.4 未授权访问 反弹Shell2.1 Web服务写入Webshell2.2 Linux定时任务反弹shell2.3 /etc/profile.d->反弹shell2.4 写入ssh公钥登录服务器2.5 利用Redis主从复制RCE2.6 SSRF漏洞组合拳->RCE 总结 前言 …

SDG大数据平台简介

联合国可持续发展目标(Sustainable Development Goals)缩写SDGs,是联合国制定的17个全球发展目标,在2000-2015年千年发展目标(MDGs)到期之后继续指导2015-2030年的全球发展工作。(摘自百度&…

Windows电脑引导损坏?按照这个教程能修复

前言 Windows系统的引导一般情况下是不会坏的,小伙伴们可以不用担心。发布这个帖子是因为要给接下来的文章做点铺垫。 关注小白很久的小伙伴应该都知道,小白的文章都讲得比较细。而且文章与文章之间的关联度其实还是蛮高的。在文章中,你会遇…

AI-ChatGPTCopilot

ChatGPT chatGPT免费网站列表:GitHub - LiLittleCat/awesome-free-chatgpt: 🆓免费的 ChatGPT 镜像网站列表,持续更新。List of free ChatGPT mirror sites, continuously updated. Copilot 智能生成代码工具 安装步骤 - 登录 github&am…

微信小程序自定义步骤条效果

微信小程序自定义一个步骤条组件,自定义文字在下面,已完成和未完成和当前进度都不一样的样式,可点击上一步和下一步切换流程状态,效果如下。 这是视频效果: 前端实现步骤条效果 下面我们一步步实现编码,自定…

Spring Cloud + Vue前后端分离-第10章 基于阿里云OSS的文件上传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第10章 基于阿里云OSS的文件上传 前面介绍的文件上传是基于本地文件服务器的文件上传,但是自己搭文件服务器会有很多运维的问题,比如磁盘满了要扩容…

无监督关键词提取算法:TF-IDF、TextRank、RAKE、YAKE、 keyBERT

TF-IDF TF-IDF是一种经典的基于统计的方法,TF(Term frequency)是指一个单词在一个文档中出现的次数,通常一个单词在一个文档中出现的次数越多说明该词越重要。IDF(Inverse document frequency)是所有文档数比上出现某单词的个数,通常一个单词…

【C++杂货铺】C++11新特性——可变参数模板

文章目录 一、可变模板参数相关概念的引入二、获取参数包中参数的个数三、递归函数方式展开参数包四、逗号表达式展开参数包五、可变模板参数的实际应用——emplace相关接口5.1 回顾一下 push_back 的三种用法5.2 emplace_back 使用方法介绍5.3 听说 emplace_back 可以提高效率…

0101包冲突导致安装docker失败-docker-云原生

文章目录 1 前言2 报错3 解决结语 1 前言 最近在学习k8s,前置条件就是要安装指定版本的docker,命令如下 yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.62 报错 file /usr/libexec/docker/cli-plugins/docker-buildx fr…

云原生|对象存储|minio分布式集群的搭建和初步使用(可用于生产)

前言: minio作为轻量级的对象存储服务安装还是比较简单的,但分布式集群可以大大提高存储的安全性,可靠性。分布式集群是在单实例的基础上扩展而来的 minio的分布式集群有如下要求: 所有运行分布式 MinIO 的节点需要具有相同的访…

【小沐学NLP】Python实现K-Means聚类算法(nltk、sklearn)

文章目录 1、简介1.1 机器学习1.2 K 均值聚类1.2.1 聚类定义1.2.2 K-Means定义1.2.3 K-Means优缺点1.2.4 K-Means算法步骤 2、测试2.1 K-Means(Python)2.2 K-Means(Sklearn)2.2.1 例子1:数组分类2.2.2 例子2&#xff1…

简写英语单词

题目: 思路: 这段代码的主要思路是读取一个字符串,然后将其中每个单词的首字母大写输出。具体来说,程序首先使用 fgets 函数读取一个字符串,然后遍历该字符串中的每个字符。当程序遇到一个字母时,如果此时…

职场小白培养项目管理能力的6个小技巧

有很多职场新人会碰到这样一个场景:入职一段时间,领导突然将一个重要项目的其中一个模块分配给你负责,但你之前并没有接触过任何项目。 这时你可能会焦躁无措,不知如何往下规划和开展工作,在推进一段时间后领导开始时…

消息中间件常见知识点

一:消息队列的主要作用是什么? 1.消息队列的特性: 业务无关,一个具有普适性质的消息队列组件不需要考虑上层的业务模型,只做好消息的分发就可以了,上层业务的不同模块反而需要依赖消息队列所定义的规范进行…