校园网站建设结论,12306网站 谁做的,什么是网络营销促销?网络营销促销有何作用?,搭建一个企业网站需要多少钱StratifiedGroupKFold解释和代码实现 文章目录 一、StratifiedGroupKFold解释和代码实现是什么#xff1f;二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、样本类别类别不平衡 一、StratifiedGroupKFold解释和代码… StratifiedGroupKFold解释和代码实现 文章目录 一、StratifiedGroupKFold解释和代码实现是什么二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、样本类别类别不平衡 一、StratifiedGroupKFold解释和代码实现是什么
0123每一行表示测试集和训练集的划分的一种方式。 class表示类别的个数下图显示的是3类有些交叉验证根据类别的比例划分测试集和训练集例三。 group表示从不同的组采集到的样本颜色的个数表示组的个数有些时候我们关注在一组特定组上训练的模型是否能很好地泛化到看不见的组。举个例子解释“组”的意思我们有10个人我们想要希望训练集上所用的数据来自12345678测试集上的数据来自910也就是说我们不希望测试集上的数据和训练集上的数据来自同一个人如果来自同一个人的话训练集上的信息泄漏到测试集上了模型的泛化性能会降低测试结果会偏好。 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 ee e e f f f f g g g g g]数据个数、标签个数30个 类别个数3个分别是012比例是0.30.30.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_splits3)
# for train, test in sgkf.split(X, y, groupsgroups):
# print(%s %s % (train, test))
for i, (train, test) in enumerate(sgkf.split(X, y, groupsgroups)):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 ee 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 ff 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 fg 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个分别是012比例是0.10.30.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 ff 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——这没办法做测试。