交叉验证的种类和原理(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对数据划分的影响,也要考虑数据集本身各方面的特点。
建议:把数据集打乱,多做几组交叉验证,显示验证结果,分析结果原因。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入【ByPass有点难的靶场实战】(九)

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 0、总体思路 先确认是否可以SQL注入,使用单…

Unity坦克大战开发全流程——开始场景——设置界面

开始场景——设置界面 step1:设置面板的背景图 照着这个来设置就行了 step2:写代码 关联的按钮控件 监听事件函数 注意:要在start函数中再写一行HideMe函数,以便该面板能在一开始就能隐藏自己。 再在BeginPanel脚本中调用该函数即…

ESP32入门六(读取引脚的模拟信号[2]:信号出现误差的原因)

在之前的章节中,我们测试了用ESP32来接收模拟电压信号,在测试中,读取到的数据与现实存在一定的误差,在这一篇中,我们尝试了解出现误差的原因和解决方法。 对于出现的误差,有多种软件和硬件方面的原因: 一、…

红黑树的删除

导航链接 红黑树的性质     红黑树的旋转、变色     红黑树的插入     红黑树的删除 文章目录 导航链接二叉搜索树如何删除结点?场景一:删除没有孩子的结点场景二:删除有一个孩子的结点场景三:删除有两个孩子的结点 红…

海康visionmaster-分支字符:控制调试模式开关的方

在图的右边分支字符模块有两个分支,通过 C#代码 GetParamValue 函数可以看到调试模 式的相关参数 ModuleInfoList 的值为:4#1#0KaTeX parse error: Expected EOF, got # at position 3: 10#̲0#0。其中分支 4#1#0$的 4 表示模 块 id,1 表示这…

操作系统:可变分区管理

有作业序列:作业A要求42K;作业B要求27K,作业C要求22K,作业和空闲内存区如下图所示,请画出最佳适应算法空闲队列图,并分析最佳适应算法是否适合该作业系列。 答:最佳适应算法是按照空闲块由小到大…

Harmony全局应用生命周期 EntryAbility.ts 讲解

之前 我们说过 page页面的生命周期 组件的生命周期 其实他和uni一样有一个整个应用的生命周期 我们如下图打开EntryAbility.ts 这是我们整个程序app的状态控制 他这里也有几个全局的生命周期 比如 我们手机 点开当前 App 启动 app 会触发 它的 onCreate 生命周期 当我们从手…

前端 js 基础(2)

js For In for in 循环遍历 person 对象每次迭代返回一个键 (x)键用于访问键的值键的值为 person[x] 如果索引顺序很重要,请不要在数组上使用 for in。 索引顺序依赖于实现,可能不会按照您期望的顺序访问数组值。 当顺序很重要时,最好使用 f…

元旦特辑:Note6---选择排序

目录 前言❌ 1. 基本思想⚠️ 2. 直接选择排序🟢 2.1 思路分析✳️ 2.2 代码实现❎ 2.2.1 sort.h 2.2.2 sort.c 2.2.3 test.c 2.3 问题解决❇️ 2.3.1 sort.c修改 2.4 特性总结✅ 3. 堆排序🔵 3.1 代码实现🏧 3.2 特性总结&…

Centos安装Kafka(KRaft模式)

1. KRaft引入 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer,以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 由…

c++ 简单实用万能异常捕获

多层捕获异常&#xff0c;逐渐严格。并打印出错信息和位置&#xff1a;哪个文件&#xff0c;哪个函数&#xff0c;具体哪一行代码。 #include <stdexcept> // 包含标准异常类的头文件try {int a 2 / 0; }catch (const std::runtime_error& e) {// 捕获 std::runt…

浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉

前言 大家都知道&#xff0c;前端在和后台进行交互联调时&#xff0c;肯定避免不了要传递参数&#xff0c;一般情况下&#xff0c;params 在 get 请求中使用&#xff0c;而 post 请求下&#xff0c;我们有两种常见的传参方式&#xff1a; JSON 对象格式和 formData 格式&#x…

AtCoder Beginner Contest 334 G

G.Christmas Color Grid 2&#xff08;枚举&#xff0c;Tarjan&#xff09; 题意&#xff1a; 本题与问题 E E E类似。有一个 H H H行和 W W W列的网格&#xff0c;每个单元格都被涂成红色或绿色。用 ( i , j ) (i,j) (i,j)表示从上到下第 i i i行、从左到右第 j j j列的单元…

UIToolKit使用心得

起因 因为那个uitoolkit自己写了一套graphView&#xff0c;所以想着来用用但是用完之后发现也不过如此 怎么构建自己的组件 我在继承Node之后想修改node的样式该怎么办呢是这样的。先用pick点击默认的node节点元素- 在pick默认创建的node节点之后&#xff0c;可以把它的uxml…

跨境电商迎来综合竞争力比拼时代 五大趋势解读跨境2024

过去几年&#xff0c;跨境电商成为外贸出口增长的一大亮点&#xff0c;随着年底国务院办公厅《关于加快内外贸一体化发展的若干措施》的发布&#xff0c;跨境电商在促进经济发展、助力内外贸一体化发展方面的价值更加凸显。 这是跨境电商变化最快的时代&#xff0c;也是跨境电…

CCSK认证:开启云安全领域的黄金大门

&#x1f31f;你是否对云安全领域充满热情&#xff1f;是否希望提升自己在云安全领域的专业性和竞争力&#xff1f;CCSK认证是你的不二之选&#xff01; &#x1f525;CCSK简介&#xff1a; CCSK是国际云安全联盟&#xff08;Cloud Security Alliance&#xff0c;CSA&#xff…

Vue3-29-路由-编程式导航的基本使用

补充一个知识点 路由配置中的 name 属性 &#xff1a; 可以给你的 路由 指定 name属性&#xff0c;称之为 命名路由。 这个 name 属性 在 编程式导航 传参时有重要的作用。 命名路由的写法如下 &#xff1a; 像指定 path 一样&#xff0c;直接指定一个 name 属性即可。{path:/d…

【已解决】 ubuntu apt-get update连不上dl.google.com

在终端使用apt-get update时&#xff0c;连接dl.google.com超时&#xff0c;一直卡在0%&#xff0c;原因是当前ip无法ping到google&#xff08;墙&#xff09;。 解决方法&#xff1a; dl.google.com国内可用IP 选一个&#xff0c;然后按以下命令操作&#xff1a; cd ~ vim …

RSA加密解密——用shell加密java解密

功能描述 使用shell opensll对明文进行RSA加密&#xff0c;将密文用java的RSA工具对密文解密。这应该是全网第一个同时用到shell和java的RSA加密解密教程。中间有很多坑&#xff0c;都踩过了&#xff0c;可以放心使用代码。 正确的实现流程 shell端 首先生成公钥私钥 &…

飞企互联-FE企业运营管理平台 登录绕过漏洞复现

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外&#xff0c;支持企业B2B、C2B与O2O等核心需求&#xff0c;为不同行业客户的互联网转型提供支持。 0x02 漏洞概…