StratifiedKFold解释和代码实现

StratifiedKFold解释和代码实现

文章目录

  • 一、StratifiedKFold是什么?
  • 二、 实验数据设置
    • 2.1 实验数据生成代码
    • 2.2 代码结果
  • 三、实验代码
    • 3.1 实验代码
    • 3.2 实验结果
    • 3.3 结果解释
    • 3.4 数据打乱对这种交叉验证的影响。
  • 四、总结


一、StratifiedKFold是什么?

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

二、 实验数据设置

2.1 实验数据生成代码

X, y = np.arange(0,60).reshape((30,2)), np.hstack(([0] * 3, [1] * 9, [2] * 18))
print("数据:", end=" ")
for l in X:print(l, end=' ')
print("")
print("标签:", y)

2.2 代码结果

数据: [0 1] [2 3] [4 5] [6 7] [8 9] [10 11] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
标签: [0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

数据个数、标签个数:30个
类别个数:3个(分别是0,1,2,比例是0.1:0.3:0.6和class每类对应),StratifiedKFold
组别(group):由于StratifiedKFold交叉验证结果和group无关,所以这里不再设置。

三、实验代码

3.1 实验代码

代码如下:

from sklearn.model_selection import StratifiedKFold
import numpy as np
# X, y = np.ones((30, 1)), np.hstack(([0] * 20, [1] * 10))
# print(np.arange(0,30).reshape((30,1)))
X, y = np.arange(0,60).reshape((30,2)), np.hstack(([0] * 3, [1] * 9, [2] * 18))
print("数据:", end=" ")
for l in X:print(l, end=' ')
print("")
print("标签:", y)
skf = StratifiedKFold(n_splits=3)
for i,(train, test) in enumerate(skf.split(X, y)):print("=================StratifiedKFold 第%d折叠 ===================="% (i+1))print('train -  {}'.format(np.bincount(y[train])))print("  训练集索引:%s" % train)print("  训练集标签:", y[train])print("  训练集数据:", end=" ")for l in X[train]:print(l, end=' ')print("")# print("  训练集数据:", X[train])print("test  -  {}".format(np.bincount(y[test])))print("  测试集索引:%s" % test)print("  测试集标签:", y[test])print("  测试集数据:", end=" ")for l in X[test]:print(l, end=' ')print("")# print("  测试集数据:", X[test])print("=============================================================")

3.2 实验结果

结果如下:

数据: [0 1] [2 3] [4 5] [6 7] [8 9] [10 11] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
标签: [0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
=================StratifiedKFold 第1折叠 ====================
train -  [ 2  6 12]训练集索引:[ 1  2  6  7  8  9 10 11 18 19 20 21 22 23 24 25 26 27 28 29]训练集标签: [0 0 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]训练集数据: [2 3] [4 5] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
test  -  [1 3 6]测试集索引:[ 0  3  4  5 12 13 14 15 16 17]测试集标签: [0 1 1 1 2 2 2 2 2 2]测试集数据: [0 1] [6 7] [8 9] [10 11] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] 
=============================================================
=================StratifiedKFold 第2折叠 ====================
train -  [ 2  6 12]训练集索引:[ 0  2  3  4  5  9 10 11 12 13 14 15 16 17 24 25 26 27 28 29]训练集标签: [0 0 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]训练集数据: [0 1] [4 5] [6 7] [8 9] [10 11] [18 19] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
test  -  [1 3 6]测试集索引:[ 1  6  7  8 18 19 20 21 22 23]测试集标签: [0 1 1 1 2 2 2 2 2 2]测试集数据: [2 3] [12 13] [14 15] [16 17] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] 
=============================================================
=================StratifiedKFold 第3折叠 ====================
train -  [ 2  6 12]训练集索引:[ 0  1  3  4  5  6  7  8 12 13 14 15 16 17 18 19 20 21 22 23]训练集标签: [0 0 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]训练集数据: [0 1] [2 3] [6 7] [8 9] [10 11] [12 13] [14 15] [16 17] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] 
test  -  [1 3 6]测试集索引:[ 2  9 10 11 24 25 26 27 28 29]测试集标签: [0 1 1 1 2 2 2 2 2 2]测试集数据: [4 5] [18 19] [20 21] [22 23] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
=============================================================进程已结束,退出代码 0

3.3 结果解释

可以看到测试集和训练集划分是根据折叠数和标签的比例。例如:这里的折叠数是3,标签的比例是1:3:6,所以在第一折叠处测试集标签0的个数是1/3(折叠数)*0.1(标签比例)*30(样本数)=1个。剩余的分析同理。

=================StratifiedKFold 第1折叠 ====================
train -  [ 2  6 12]训练集索引:[ 1  2  6  7  8  9 10 11 18 19 20 21 22 23 24 25 26 27 28 29]训练集标签: [0 0 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]训练集数据: [2 3] [4 5] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
test  -  [1 3 6]测试集索引:[ 0  3  4  5 12 13 14 15 16 17]测试集标签: [0 1 1 1 2 2 2 2 2 2]测试集数据: [0 1] [6 7] [8 9] [10 11] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] 
=============================================================

3.4 数据打乱对这种交叉验证的影响。

X, y = np.arange(0,60).reshape((30,2)), np.hstack(([0] * 3, [1] * 9, [2] * 18))

改为下面的代码

arr = np.hstack(([0] * 3, [1] * 9, [2] * 18))
print("原始标签:", arr)
# 使用np.random.shuffle函数将数组打乱
np.random.shuffle(arr)
X, y = np.arange(0,60).reshape((30,2)), arr

可以看出划分和标签的先后顺序有一定的关系。

四、总结

StratifiedKFold:考虑了标签(class),但没考虑组(group)的影响。

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

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

相关文章

Eclipse汉化

目录 一、首先电脑已经下载好Eclipse 二、打开Eclipse Babel 三、打开Eclipse 1、工具栏——>Help——> Install New Software 2、 点击Add 3、添加复制的链接,点击Add 4、等待加载 5、勾选Chinese(Simpliied),而后Next&…

动画墙纸:将视频、网页、游戏、模拟器变成windows墙纸——Lively Wallpaper

文章目录 前言下载github地址:网盘 关于VideoWebpagesYoutube和流媒体ShadersGIFs游戏和应用程序& more:Performance:多监视器支持:完结 前言 Lively Wallpaper是一款开源的视频壁纸桌面软件,类似 Wallpaper Engine,兼容 Wal…

HarmonyOS 组件通用属性之通用事件 文档参数讲解(触摸事件)

好 本文 我们来说说触摸事件 字面意思也非常好理解 就是我们手机手指触摸物体触发 我们先在编辑器组件介绍中 找到这个东西的基本用法 Button("跳转").onTouch((event: TouchEvent) > {})最明显的就是 event 的类型变了 点击事件的是 ClickEvent 而这里是 Touc…

主成分分析(PCA):探索数据的核心

文章目录 前言1. 什么是 PCA ?2. PCA 的原理2.1 协方差和方差2.2 核心思想2.3 步骤 3. PCA 的应用场景4. PCA 的优缺点5. 示例:人脸识别5.1 完整代码5.2 运行结果 结语 前言 当今社会,数据无处不在。从社交媒体到金融交易,从医疗…

【代码解析】代码解析之生成token(1)

本篇文章主要解析上一篇:代码解析之登录(1)里的第8行代码调用 TokenUtils 类里的genToken 方法 https://blog.csdn.net/m0_67930426/article/details/135327553?spm1001.2014.3001.5501 genToken方法代码如下: public static S…

基于C#的机械臂欧拉角与旋转矩阵转换

欧拉角概述 机器人末端执行器姿态描述方法主要有四种:旋转矩阵法、欧拉角法、等效轴角法和四元数法。所以,欧拉角是描述机械臂末端姿态的重要方法之一。 关于欧拉角的历史,由来已久,莱昂哈德欧拉用欧拉角来描述刚体在三维欧几里…

如何找到并杀掉占用显存的僵尸进程

如何找到并杀掉占用显存的僵尸进程 nvitop 命令发现占用显存的僵尸进程 nvitop 命令可以实时监控显卡显存的占用,CPU 的占用,以及占用显卡的进程信息等(如下图)。nvitop 中显示 No Such Process 的进程,且它的 CPU 使…

【SpringCloud Alibaba笔记】(2)Nacos服务注册与配置中心

Nacos Nacos简介与下载 是什么? 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos(Dynamic Naming and Configuration Service)就是注册中心+配置中心的组合 Nacos Eureka Config Bus 替代Eureka…

前端 js 基础对象 (3)

js 对象定义 <!DOCTYPE html> <html> <body><h1>JavaScript 对象创建</h1><p id"demo1"></p> <p>new</p> <p id"demo"></p><script> // 创建对象&#xff1a; var persona {fi…

数据结构与算法——符号表API设计及有序符号表设计

Java学习手册面试指南&#xff1a;https://javaxiaobear.cn 符号表最主要的目的就是将一个键和一个值联系起来&#xff0c;符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据&#xff0c;我们可以根据键来查找对应的值。 符号表中&#xff0c;键具有唯一性。 符…

Linux文件系统调用接口

文件内容属性 所有对文件的操作就是对 1.文件内容 2.文件属性。 内容是数据&#xff0c;属性也是数据&#xff0c;存储文件&#xff0c;必须既存储内容&#xff0c;也要存储属性。 文件没有被访问时&#xff0c;一般在磁盘中。对文件访问时&#xff0c;由冯诺依曼体系结构知…

媒体捕捉-拍照

引言 在项目开发中&#xff0c;从媒体库中选择图片或使用相机拍摄图片是一个极为普遍的需求。通常&#xff0c;我们使用UIImagePickerController来实现单张图片选择或启动相机拍照。整个拍照过程由UIImagePickerController内部实现&#xff0c;无需我们关心细节&#xff0c;只…

【分布式微服务专题】SpringSecurity快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、Spring Security介绍1.1 什么是Spring Security1.2 它是干什么的1.3 Spring Security和Shiro比较 二、快速开始2.1 用户认证2.1.1 设置用户名2.1.1.1 基于application.yml配置文件2.1.1.2 基于Java Config配置方式 2.1.2 设置加密…

IBM介绍?

IBM&#xff0c;全名国际商业机器公司&#xff08;International Business Machines Corporation&#xff09;&#xff0c;是一家全球知名的美国科技公司。它成立于1911年&#xff0c;总部位于美国纽约州阿蒙克市&#xff08;Armonk&#xff09;&#xff0c;是世界上最大的信息…

一起学Elasticsearch系列-Query DSL

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 查询上下文相关度评分&#xff1a;scoreTF/IDF & BM25 源数据&#xff1a;source 源数据过滤全文检索match&#xff1a;匹配包含某个term的子句match_all&…

[Vulnhub靶机] DriftingBlues: 1

[Vulnhub靶机] DriftingBlues: 1靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues.ova 靶机地址&#xff1a;192.168.67.20 攻击机地址&#xff1a;192.168.67.3 一、信息收集 1.使…

mysql中按字段1去重,按字段2降序排序

数据举例 sql语句 按字段field4降序排序&#xff0c;按字段field1去重 SELECT tt1.name2,tt1.field1,tt1.field2,tt1.field4 from ( select tt2.name2,tt2.field1,tt2.field2,tt2.field4 from t2 tt2 ORDER BY tt2.field4 DESC ) tt1 GROUP BY tt1.field1执行结果

mysql的索引原理

目录 一、索引采用B树的优势二、为什么不使用其他数据结构2.1、哈希索引2.2平衡二叉树B树 参考 mysql索引采用B树 一、索引采用B树的优势 1可以进行范围查找&#xff0c;通过单向链表解决&#xff08;通过单向链表已经排好序&#xff09;。 2非叶子结点只存储key&#xff0c;不…

vue-vant组件库

组件库&#xff1a;第三方封装好了很多很多的组件&#xff0c;整合到一起就是一个组件库。 官网&#xff1a;Vant 2 - Mobile UI Components built on Vue vant支持vue2&#xff0c;也支持vue3&#xff1b;vant2支持vue2&#xff0c;vant3、vant4支持vue3 分类 vue的组件库…

老胡的周刊(第122期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 movie-web[2] 开源可自部署的简约在线电影搜…