StratifiedGroupKFold解释和代码实现

这篇具有很好参考价值的文章主要介绍了StratifiedGroupKFold解释和代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

StratifiedGroupKFold解释和代码实现


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

0,1,2,3:每一行表示测试集和训练集的划分的一种方式。
class:表示类别的个数(下图显示的是3类),有些交叉验证根据类别的比例划分测试集和训练集(例三)。
group:表示从不同的组采集到的样本,颜色的个数表示组的个数(有些时候我们关注在一组特定组上训练的模型是否能很好地泛化到看不见的组)。举个例子(解释“组”的意思):我们有10个人,我们想要希望训练集上所用的数据来自(1,2,3,4,5,6,7,8),测试集上的数据来自(9,10),也就是说我们不希望测试集上的数据和训练集上的数据来自同一个人(如果来自同一个人的话,训练集上的信息泄漏到测试集上了,模型的泛化性能会降低,测试结果会偏好)。
StratifiedGroupKFold解释和代码实现,新手常见错误,机器学习,sklearn
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 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——这没办法做测试。文章来源地址https://www.toymoban.com/news/detail-775438.html

到了这里,关于StratifiedGroupKFold解释和代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MODBUS RTU通讯常见错误代码

    错误代码 MB_MASTER 报错8200(端口正忙于处理传送请求),如何处理? 此情况是由于MB_MASTER的DONE或ERROR均

    2024年02月13日
    浏览(55)
  • Vue.js常见错误处理包含代码

    语法错误 错误信息: Error: [vm] \\\"name\\\" is not defined 解决方法:确保组件的 data 中定义了相同的属性。 示例代码: 类型错误 错误信息: Error: [vm] \\\"name\\\" is not a function 解决方法:确保组件的 data 中定义的是一个函数。 示例代码: 模板语法错误 错误信息: Error: [vm] \\\"message\\\" is not d

    2024年02月14日
    浏览(43)
  • Python中使用execjs执行JavaScript代码:方法与常见错误解决方案

     简介和背景:          execjs 库的作用和重要性是在Python中执行JavaScript代码。它允许开发者在Python环境下调用JavaScript逻辑和功能,从而实现Python与JavaScript之间的交互。通过 execjs ,Python开发者可以利用JavaScript的强大功能和现有库,拓展Python应用的能力,实现跨语言的灵

    2024年02月10日
    浏览(34)
  • ChatGPT实现代码解释

    新手程序员在入门之初,最好的学习路径就是直接阅读其他人的代码,从中学会别人是怎么写的,为什么这么写。过去,这个学习过程可能需要广泛阅读官方文档,在 GitHub issue 上提问,上 Stack Overflow 网站查询,见缝插针找同部门的老同事帮忙……现在,我们可以试试让 Ch

    2024年02月02日
    浏览(31)
  • Python新手入门必须学会的技巧:pycharm中配置Python解释器(2022最新)

    有很多小伙伴,在安装模块时成功了,但是在pycharm导入模块的时候报错了,或者运行没有结果,基本上都是这个问题。 我下午在群里刚解决了一个这样的问题,她说不管什么代码都运行没结果,hello world 都打印不出来结果,也不报错,在群里问了半天,还好我看到了,不然

    2024年02月09日
    浏览(70)
  • 评价模型(二)主成分分析、因子分析、二者对比及其对应 PYTHON 实现代码和例题解释

    数学建模系列文章: 以下是个人在准备数模国赛时候的一些模型算法和代码整理,有空会不断更新内容: 评价模型(一)层次分析法(AHP),熵权法,TOPSIS分析 及其对应 PYTHON 实现代码和例题解释 评价模型(二)主成分分析、因子分析、二者对比及其对应 PYTHON 实现代码和例

    2024年02月04日
    浏览(40)
  • Python中常见的一个问题是“ModuleNotFoundError: No module named ‘yaml‘”,这个错误提示通常表示你的代码中缺少了名

    Python中常见的一个问题是“ModuleNotFoundError: No module named ‘yaml’”,这个错误提示通常表示你的代码中缺少了名为yaml的python模块。如果你的项目中需要使用到yaml模块,那么你需要确保已经安装了这个模块。接下来,我们将介绍如何解决这个问题。 第一步:确定错误的原因 在

    2024年02月16日
    浏览(41)
  • 解答腾讯会议的常见新手问题

    腾讯会议(Tencent Meeting)为企业打造专属的会议能力,卓越的音视频性能,丰富的会议协作能力,坚实的会议安全保障,提升协作效率,满足大中小会议全场景需求。您可以使用腾讯会议进行远程音视频会议、在线协作、会管会控、会议录制、指定邀请、布局管理、同声传译

    2023年04月19日
    浏览(68)
  • 常见通信名词的解释

    在通信接口的介绍中,难免见到全双工/半双工/单工、同步/异步等这些名词。今天就专门来介绍一下这些名词。 数据通信中,数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。 单工通信:是指消息只能单方向传输的工作方式。例如遥控、遥测(某

    2024年02月06日
    浏览(52)
  • 评价模型(一) 层次分析法(AHP),熵权法,TOPSIS分析 及其对应 PYTHON 实现代码和例题解释

    数学建模系列文章: 以下是个人在准备数模国赛时候的一些模型算法和代码整理,有空会不断更新内容: 评价模型(一)层次分析法(AHP),熵权法,TOPSIS分析 及其对应 PYTHON 实现代码和例题解释 评价模型(二)主成分分析、因子分析、二者对比及其对应 PYTHON 实现代码和例

    2024年02月08日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包