StratifiedGroupKFold解释和代码实现

StratifiedGroupKFold解释和代码实现

文章目录

  • 一、StratifiedGroupKFold解释和代码实现是什么?
  • 二、 实验数据设置
    • 2.1 实验数据生成代码
    • 2.2 代码结果
  • 三、实验代码
    • 3.1 实验代码
    • 3.2 实验结果
    • 3.3 结果解释
  • 四、样本类别类别不平衡


一、StratifiedGroupKFold解释和代码实现是什么?

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

二、 实验数据设置

2.1 实验数据生成代码

X, y = np.arange(0, 60).reshape((30, 2)), np.hstack(([0] * 9, [1] * 9, [2] * 12))
groups = np.hstack((["a"] * 4, ["b"] * 3, ["c"] * 5, ["d"] * 4, ["e"] * 5, ["f"] * 4, ["g"] * 5))
print("数据:", end=" ")
for l in X:print(l, end=' ')
print("")
print("标签:", y)
print("组别:", groups)

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 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]
组别: ['a' 'a' 'a' 'a' 'b' 'b' 'b' 'c' 'c' 'c' 'c' 'c' 'd' 'd' 'd' 'd' 'e' 'e''e' 'e' 'e' 'f' 'f' 'f' 'f' 'g' 'g' 'g' 'g' 'g']

数据个数、标签个数:30个
类别个数:3个(分别是0,1,2,比例是0.3:0.3:0.4和class每类对应)
组别(group):9个(分别是a-g,个数是4,3,5,4,5,4,5)

三、实验代码

3.1 实验代码

代码如下:

# Group k-fold
import numpy as np
from sklearn.model_selection import GroupKFold
from sklearn.model_selection import StratifiedGroupKFoldX, y = np.arange(0, 60).reshape((30, 2)), np.hstack(([0] * 9, [1] * 9, [2] * 12))
groups = np.hstack((["a"] * 4, ["b"] * 3, ["c"] * 5, ["d"] * 4, ["e"] * 5, ["f"] * 4, ["g"] * 5))
print("数据:", end=" ")
for l in X:print(l, end=' ')
print("")
print("标签:", y)
print("组别:", groups)
sgkf = StratifiedGroupKFold(n_splits=3)
# for train, test in sgkf.split(X, y, groups=groups):
#     print("%s %s" % (train, test))
for i, (train, test) in enumerate(sgkf.split(X, y, groups=groups)):print("=================StratifiedGroupKFold 第%d折叠 ====================" % (i + 1))# print('train -  {}'.format(np.bincount(y[train])))print("  训练集索引:%s" % train)print("  训练集标签:", y[train])print("  训练集组别标签", groups[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("  测试集组别标签", groups[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 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]
组别: ['a' 'a' 'a' 'a' 'b' 'b' 'b' 'c' 'c' 'c' 'c' 'c' 'd' 'd' 'd' 'd' 'e' 'e''e' 'e' 'e' 'f' 'f' 'f' 'f' 'g' 'g' 'g' 'g' 'g']
=================StratifiedGroupKFold 第1折叠 ====================训练集索引:[ 0  1  2  3  4  5  6 12 13 14 15 16 17 18 19 20 21 22 23 24]训练集标签: [0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 2]训练集组别标签 ['a' 'a' 'a' 'a' 'b' 'b' 'b' 'd' 'd' 'd' 'd' 'e' 'e' 'e' 'e' 'e' 'f' 'f''f' 'f']训练集数据: [0 1] [2 3] [4 5] [6 7] [8 9] [10 11] [12 13] [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] 测试集索引:[ 7  8  9 10 11 25 26 27 28 29]测试集标签: [0 0 1 1 1 2 2 2 2 2]测试集组别标签 ['c' 'c' 'c' 'c' 'c' 'g' 'g' 'g' 'g' 'g']测试集数据: [14 15] [16 17] [18 19] [20 21] [22 23] [50 51] [52 53] [54 55] [56 57] [58 59] 
=============================================================
=================StratifiedGroupKFold 第2折叠 ====================训练集索引:[ 4  5  6  7  8  9 10 11 12 13 14 15 25 26 27 28 29]训练集标签: [0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2]训练集组别标签 ['b' 'b' 'b' 'c' 'c' 'c' 'c' 'c' 'd' 'd' 'd' 'd' 'g' 'g' 'g' 'g' 'g']训练集数据: [8 9] [10 11] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [50 51] [52 53] [54 55] [56 57] [58 59] 测试集索引:[ 0  1  2  3 16 17 18 19 20 21 22 23 24]测试集标签: [0 0 0 0 1 1 2 2 2 2 2 2 2]测试集组别标签 ['a' 'a' 'a' 'a' 'e' 'e' 'e' 'e' 'e' 'f' 'f' 'f' 'f']测试集数据: [0 1] [2 3] [4 5] [6 7] [32 33] [34 35] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] [48 49] 
=============================================================
=================StratifiedGroupKFold 第3折叠 ====================训练集索引:[ 0  1  2  3  7  8  9 10 11 16 17 18 19 20 21 22 23 24 25 26 27 28 29]训练集标签: [0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]训练集组别标签 ['a' 'a' 'a' 'a' 'c' 'c' 'c' 'c' 'c' 'e' 'e' 'e' 'e' 'e' 'f' 'f' 'f' 'f''g' 'g' 'g' 'g' 'g']训练集数据: [0 1] [2 3] [4 5] [6 7] [14 15] [16 17] [18 19] [20 21] [22 23] [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] 测试集索引:[ 4  5  6 12 13 14 15]测试集标签: [0 0 0 1 1 1 1]测试集组别标签 ['b' 'b' 'b' 'd' 'd' 'd' 'd']测试集数据: [8 9] [10 11] [12 13] [24 25] [26 27] [28 29] [30 31] 
=============================================================进程已结束,退出代码 0

3.3 结果解释

  • 可以看到每一折叠的测试集都有所有类别的样本,但是训练集可能只有部分类别的样本(如第3折叠)
  • 这种交叉验证只适用于类别相对不平衡的样本,但是当样本类别极不平衡时,这种交叉验证将会不具有参考价值。
  • 该种交叉验证即考虑到样本的组别(group),又考虑到样本的标签比例,是一个相对较好的交叉验证。

四、样本类别类别不平衡

X, y = np.arange(0, 60).reshape((30, 2)), np.hstack(([0] * 9, [1] * 9, [2] * 12))
改为下面的
X, y = np.arange(0, 60).reshape((30, 2)), np.hstack(([0] * 3, [1] * 6, [2] * 21))

类别个数:3个(分别是0,1,2,比例是0.1:0.3:0.7和class每类对应)

=================StratifiedGroupKFold 第2折叠 ====================训练集索引:[ 4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]训练集标签: [1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]训练集组别标签 ['b' 'b' 'b' 'c' 'c' 'c' 'c' 'c' 'd' 'd' 'd' 'd' 'e' 'e' 'e' 'e' 'e' 'f''f' 'f' 'f']训练集数据: [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] 测试集索引:[ 0  1  2  3 25 26 27 28 29]测试集标签: [0 0 0 1 2 2 2 2 2]测试集组别标签 ['a' 'a' 'a' 'a' 'g' 'g' 'g' 'g' 'g']测试集数据: [0 1] [2 3] [4 5] [6 7] [50 51] [52 53] [54 55] [56 57] [58 59] 
=============================================================

可以看到测试集标签里面有0,但是训练集标签里没有0——这没办法做测试。

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

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

相关文章

Redis:原理速成+项目实战——初识Redis、Redis的安装及启动、Redis客户端

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:首期文章 📚订阅专栏:Redis速成 希望文章对你们有所帮助 在此之前,我做过的项目里面也用到了…

利用深度学习图像识别技术实现教室人数识别

引言 在现代教育环境中,高效管理和监控教室成为了一个重要议题。随着人工智能技术的迅猛发展,特别是深度学习和图像识别领域的突破,我们现在可以通过智能系统来自动识别教室内的人数,从而实现更加智能化的教室管理。 深度学习与图…

LeetCode 84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释…

Spring-IOC综述

文章迁移自语雀。 怎么查看spring的文档 ioc综述 说到spring的ioc,其实就是控制反转,为啥需要控制反转呢,其实是为了功能的增强,如果不用spring, 我们直接使用工厂方法,静态工厂方法, 都是是可以获取到对象的,但是如果需求变了,我们在类的生成时,添加了很多信息,使用工厂就不…

【INTEL(ALTERA)】Arria V FPGA GPIO 引脚上的内部箝位二极管是否始终处于活动状态?

说明 当设备未通电或未配置设备时,英特尔 Arria V FPGA GPIO 引脚上的内部箝位二极管是否处于活动状态? 解决方法 根据 Arria V 器件手册:第 1 卷:设备接口和集成,片上钳位二极管功能通过 英特尔 Quartus Prime 软件…

【鸿蒙杂谈①】——鸿蒙基础介绍及应用领域

1.前言 小伙伴们大家好,最近被复习整的痛苦无比,所以今天咱们了解 一点轻松的东西,至于高并发就先放放吧。好了,废话不多说,咱们进入正题。 相信小伙伴们都已经看到了最近鸿蒙的势头了,那鸿蒙究竟是怎么发…

《Linux C编程实战》笔记:实现自己的myshell

ok,考完试成功复活 这次是自己的shell命令程序的示例 流程图: 关键函数 1.void print_prompt() 函数说明:这个函数打印myshell提示符,即“myshell$$”. 2.void get_input(char *buf) 函数说明:获得一条指令&#…

阿里云免费SSL证书有效期只有3个月?

阿里云免费SSL证书签发有效期从12个月缩短至3个月:尊敬的用户,根据供应商变更要求,免费证书(默认证书)的签发有效期将由12个月缩短至3个月。 免费证书(升级证书)的有效期不会改变。 没错&#…

Vue3-32-路由-重定向路由

什么是重定向 路由的重定向 :将匹配到的路由 【替换】 为另一个路由。 redirect : 重定向的关键字。 重定向的特点 1、重定向是路由的直接替换,路由的地址是直接改变的; 2、在没有子路由配置的情况下,重定向的路由可以省略 component 属性的配…

Langchain访问OpenAI ChatGPT API Account deactivated的另类方法,访问跳板机API

笔者曾经写过 ChatGPT OpenAI API请求限制 尝试解决 Account deactivated. Please contact us through our help center at help.openai.com if you need assistance. 结果如何? 没有啥用。目前发现一条曲线救国的方案。 1. 在官方 openai 库中使用 此处为最新Op…

【IC覆盖率】

覆盖率分享 1 覆盖率提高策略2 覆盖率类型2.1 代码覆盖率2.2 功能覆盖率2.3 Waive提高覆盖率 覆盖率是用于衡量设计的完备性,进行指导分析发现没覆盖到的盲区,通过修改约束或者追加定向case来提到覆盖率; 1 覆盖率提高策略 1.首先最先的是每…

全国计算机等级考试| 二级Python | 真题及解析(10)

一、选择题 1.要实现将实数型变量a的值保留三位小数,以下python可以实现的是( ) A.a%0.001 B.a//0.001 C.round(a,3) D.round(3,a) 2.在Python中要交换变量a和b中的值,应使用的语句组是( )。 A…

基于SpringBoot的医院档案管理系统设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的医院档案管理系统设计与…

思科校园网搭建及配置综合小型实验

思科校园网搭建及配置综合小型实验 实验拓扑配置步骤配置聚合链路配置VTP,vlan域模板第一步 配置二层VLAN第二步 配置生成树第三步 配置相关IP地址第四步 配置DHCP及DHCP中继第五步 配置三层的网关冗余协议 双机热备及OSPF第六步 配置静态路由,NAT地址转换及其他配置…

[Verilog语言入门教程] Verilog 减法器 (半减器, 全减器, 加减共用)

依公知及经验整理,原创保护,禁止转载。 专栏 《元带你学Verilog》 <<<< 返回总目录 <<<< “逻辑设计是一门艺术,它需要创造力和想象力。” - 马克张伯伦(Mark Zwolinski) 减法器是数字电路中常见的组件,用于减去两个二进制数的和。 在Verilog中…

总结2023,展望2024

2023年是一个充满挑战和机遇的一年。全球范围内&#xff0c;人们继续努力应对新冠疫情的影响&#xff0c;各行各业都面临着巨大的变革和调整。在这个动荡的环境下&#xff0c;技术行业也经历了许多重要的发展和变革。 首先&#xff0c;人工智能在2023年取得了巨大的突破和应用…

面试经典150题(62-64)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第三十天&#xff09;完成了3道(62-64)150&#xff1a; 62.&#xff08;226. 翻转二叉树&#xff09;题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其…

麒麟云增加计算节点

一、安装基座系统并配置好各项设置 追加的计算节点服务器&#xff0c;安装好系统&#xff0c;把主机名、网络网线&#xff08;网线要和其他网线插的位置一样&#xff09;、hosts这些配置好&#xff0c;在所有节点的/etc/hosts里面添加信息 在控制节点添加/kylincloud/multinod…

人工智能趋势报告解读:ai野蛮式生长的背后是机遇还是危机?

近期&#xff0c;Enterprise WordPress发布了生成式人工智能在营销中的应用程度的报告&#xff0c;这是一个人工智能迅猛发展的时代&#xff0c;目前人工智能已经广泛运用到内容创作等领域&#xff0c;可以预见的是人工智能及其扩展应用还将延伸到我们工作与生活中的方方面面。…

springboot自动配置原理

第一步启动类注解 第二步可以看到启动类注解组合了自动配置这个注解&#xff08;enableAutoConfiguration&#xff09; 第三步进入这个注解 可以看到里面导入了一个impotSelector这个自动配置的字节码 第四步点进去 可以看到实现了deferredImportSelector这个接口 并且在这个类…