StratifiedGroupKFold解释和代码实现

news2024/12/24 20:12:06

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),也就是说我们不希望测试集上的数据和训练集上的数据来自同一个人(如果来自同一个人的话,训练集上的信息泄漏到测试集上了,模型的泛化性能会降低,测试结果会偏好)。
在这里插入图片描述

二、 实验数据设置

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 StratifiedGroupKFold

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)
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.coloradmin.cn/o/1353221.html

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

相关文章

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

一、选择题 1.有关循环结构的说法不正确的是( )。 A.循环结构是算法的基本结构之一 B.有的的程序设计中没有循环结构 C.循环结构在程序设计有可能会有嵌套出现 D.在PYTHON 程序设计语言中循环结构一般使用IF语句实现。 2.在Python中要交换变量a和b中的值,应使…

《数字图像处理-OpenCV/Python》连载:空间滤波之高斯滤波器

《数字图像处理-OpenCV/Python》连载:空间滤波之高斯滤波器 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第 10 章 图像卷积与空间滤波 图像滤波是指在尽可能保留图像细…

9.X形图案

题目 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处…

CCNP课程实验-04-BGP_CFG

目录 实验条件网络拓朴 基础配置需求实现IGP部分1. 按照图示配置OSPF区域,RID为Loopback 0地址。其中Area 146要配置为OSPF的特殊区域。2. 配置其它路由协议,重分布使得路由互相注入,实现全网互通。3. R1配置策略路由,使得R2经R1去…

react-hooks-kit v1 正式发布

evanpatchouli/react-hooks-kit - (npmjs.com) v1.0.0 正式发布! 下载安装 npm i evanpatchouli/react-hooks-it -S官方文档 在 Gitee 阅读在 Github 阅读 概览 这是一个无依赖的轻量级 React Hooks 库,总共有 60 hooks。 它包含了一系列易于使用…

linux 内核链表操作

操作系统内核, 如同其他程序, 常常需要维护数据结构的列表. 有时, Linux 内核已经同 时有几个列表实现. 为减少复制代码的数量, 内核开发者已经创建了一个标准环形的, 双 链表; 鼓励需要操作列表的人使用这个设施. 当使用链表接口时, 你应当一直记住列表函数不做加锁. 如果你的…

小妙招:教你如何查询获取企业工商数据

在行业互联网领域,工商数据的运用场景多种多样。无论是对产业链的上下游企业,还是为企业背景调查、客户获取、财税服务、知识产权服务,乃至于外贸企业,商品批发等业务,TO B服务型企业都离不开工商数据的支持。这些五花…

主动IRS(Active IRS)模型总结

文章目录 A Framework for Transmission Design for Active RIS-Aided Communication with Partial CSIHybrid active and passive IRS从已有passive IRS算法拓展到active IRS算法 active IRS 与 passive IRS模型的区别 A Framework for Transmission Design for Active RIS-Ai…

centos7 ping不通域名

如果ip能ping通,ping不通域名可以试试以下操作: 1.编辑resolv.conf文件 vi /etc/resolv.conf 添加 nameserver 8.8.8.8 2.编辑nsswitch.conf vi /etc/nsswitch.conf 改成下图所示: 3.编辑sysctl.conf vi /etc/sysctl.conf 加上两行内…

爬虫如何获取免费代理IP(二)

89ip代理爬取代码实现 一、代码实现 import requests import time import random from fake_useragent import UserAgent from lxml import etree import os import csv""" 89ip代理爬取 """class IPSipder(object):def __init__(self):self.u…

rime中州韵小狼毫 inputShow lua Translator 输入字符透传翻译器

在 rime中州韵小狼毫 help lua Translator 中我们分享了如何使用 lua 脚本定义一个 translator,并以 五笔・拼音 为例引用了该 translator,并且达到了预期的效果。 今天,我们继续通过 lua 脚本为 rime中州韵/小狼毫 输入法打造一个 translat…

【Linux Shell】1. Shell 简述

文章目录 【 1. Shell 解释器、Shell语言、Shell脚本 】【 2. Shell 环境 】【 3. 一个简单的 Shell 脚本 】3.1 Shell 脚本的编写3.2 Shell 脚本的运行3.2.1 作为可执行程序运行 Shell 脚本3.2.2 作为解释器参数运行 Shell 脚本 【 1. Shell 解释器、Shell语言、Shell脚本 】 …

C++学习(二)

我们是在学习过了C语言,基础上来看这篇文章的,如果你是直接学C,这篇文章不太适合你的,因为这里只讲C基础中与C语言不同之处。 一.main函数区别 在C语言中,我们写main函数是不是可以省略前面的int,但是在C中&#xff…

React(2): 使用 html2canvas 生成图片

使用 html2canvas 生成图片 需求 将所需的内容生成图片div 中包括 svg 等 前置准备 "react": "^18.2.0","react-dom": "^18.2.0","html2canvas": "^1.4.1",实现 <div ref{payRef}></div>const pa…

Character Controller Smooth

流畅的角色控制器 Unity的FPS解决方案&#xff01; 它是一种具有非常平滑运动和多种设置的解决方案&#xff1a; - 移动和跳跃 - 坐的能力 - 侧翻角度 - 不平整表面的处理 - 惯性守恒 - 重力 - 与物理物体的碰撞。 - 支持没有家长控制的平台 此解决方案适用于那些需要角色控制器…

Spring Boot 整合 MinIO自建对象存储服务

GitHub 地址&#xff1a;GitHub - minio/minio: The Object Store for AI Data Infrastructure 另外&#xff0c;MinIO 可以用来作为云原生应用的主要存储服务&#xff0c;因为云原生应用往往需要更高的吞吐量和更低的延迟&#xff0c;而这些都是 MinIO 的优势。安装过程跳过。…

(七)独立按键

文章目录 独立按键原理图三行代码法简单概述代码书写键码推算如何使用短按键长按键 状态机法简单概述代码书写键码推算如何使用短按键长按键 现象 独立按键原理图 三行代码法 简单概述 代码书写 u8 Trg 0x00;//短按键 u8 Cont 0x00;//长按键 void BtnThree(void) {u8 reada…

李沐机器学习系列2--- mlp

1 Introduction LP中有一个很强的假设&#xff0c;输入和输出是线性关系&#xff0c;这一般是不符合事实的。 通过几何的方式去对信息进行理解和压缩是比较高效的&#xff0c;MLP可以表示成下面的形式。 1.1 从线性到非线性 X ∈ R n d X \in R^{n \times d} X∈Rnd表示输入…

2023-12-26分割回文串和子集以及子集II

131. 分割回文串 思想&#xff1a;回溯三步骤&#xff01;① 传入参数 ② 回溯结束条件 ③ 单层搜索逻辑&#xff01;抽象成回溯树&#xff0c;树枝上是每次从头部穷举切分出的子串&#xff0c;节点上是待切分的剩余字符串【从头开始每次往后加一】 class Solution:def partiti…

基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码

基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于混合蛙跳优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…