GroupSplitShuffle 和 GroupKFolds 的区别
Difference between GroupSplitShuffle and GroupKFolds
正如标题所说,我想知道sklearn的GroupKFold
和GroupShuffleSplit
的区别。
两者都为具有组 ID 的数据进行 train-test 拆分,因此组不会在拆分中分开。我检查了每个函数的一个 train/test 集,它们看起来都做了很好的分层,但如果有人可以确认所有拆分都这样做,那就太好了。
我对两者都进行了测试,分为 10 次:
gss = GroupShuffleSplit(n_splits=10, train_size=0.8, random_state=42)
for train_idx, test_idx in gss.split(X,y,groups):
print("train:", train_idx, "test:", test_idx)
train: [ 1 2 3 4 5 11 12 13 14 15 16 17 19 20] test: [ 0 6 7 8 9 10 18]
train: [ 1 2 3 4 5 6 7 8 9 10 12 13 14 18 19 20] test: [ 0 11 15 16 17]
train: [ 0 1 3 4 5 6 7 8 9 10 12 13 14 18 19 20] test: [ 2 11 15 16 17]
train: [ 0 2 3 4 11 12 13 14 15 16 17 18 19 20] test: [ 1 5 6 7 8 9 10]
train: [ 0 1 3 4 5 6 7 8 9 10 11 15 16 17 19 20] test: [ 2 12 13 14 18]
train: [ 1 2 3 4 5 6 7 8 9 10 11 15 16 17 18] test: [ 0 12 13 14 19 20]
train: [ 0 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17] test: [ 5 18 19 20]
train: [ 0 1 3 4 6 7 8 9 10 11 15 16 17 18 19 20] test: [ 2 5 12 13 14]
train: [ 0 1 3 4 5 12 13 14 15 16 17 18 19 20] test: [ 2 6 7 8 9 10 11]
train: [ 0 2 3 4 5 11 12 13 14 15 16 17 19 20] test: [ 1 6 7 8 9 10 18]
group_kfold = GroupKFold(n_splits=10)
for train_idx, test_idx in group_kfold.split(X,y,groups):
print("train:", train_idx, "test:", test_idx)
train: [ 0 1 2 3 4 5 11 12 13 14 15 16 17 18 19 20] test: [ 6 7 8 9 10]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 18 19 20] test: [15 16 17]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 15 16 17 18 19 20] test: [12 13 14]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] test: [19 20]
train: [ 0 1 2 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] test: [3 4]
train: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20] test: [ 0 18]
train: [ 0 1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20] test: [11]
train: [ 0 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] test: [5]
train: [ 0 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] test: [2]
train: [ 0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] test: [1]
un-Group 版本的文档使这一点更加清楚。 KFold 拆分为 k 次折叠,然后将它们合并为不同的 train/test 拆分,而 ShuffleSplit 重复直接进行 train/test 拆分。特别是,每个样本在 KFold 中只测试一次,但在 ShuffleSplit 中可以测试零次或多次。
关于 scikit learn here 的文档很好地概述了这两种方法的工作原理。
这里有一个插图,可以简化对同一文档的理解。
我也运行这个测试
X = array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
y = array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
Groups = array([1., 1., 1., 1., 1., 2., 2., 2., 2., 2., 0., 0., 0., 0., 0., 3., 3., 3., 3., 3.])
GSS 给了我这个结果:
train: [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] test: [0 1 2 3 4]
train: [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] test: [0 1 2 3 4]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] test: [15 16 17 18 19]
train: [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] test: [0 1 2 3 4]
train: [ 0 1 2 3 4 10 11 12 13 14 15 16 17 18 19] test: [5 6 7 8 9]
train: [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19] test: [10 11 12 13 14]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] test: [15 16 17 18 19]
train: [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19] test: [10 11 12 13 14]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] test: [15 16 17 18 19]
train: [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19] test: [10 11 12 13 14]
看起来群组已保留。始终具有相同的大小(与您的示例相反)并且组可以在不同的测试选择中多次出现。
GKF 成绩:
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] test: [15 16 17 18 19]
train: [ 0 1 2 3 4 10 11 12 13 14 15 16 17 18 19] test: [5 6 7 8 9]
train: [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] test: [0 1 2 3 4]
train: [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19] test: [10 11 12 13 14]
每个组在测试中只能出现一次,所以n_splits参数的最大值在这里被限制为4,因为我只有4个组。
正如标题所说,我想知道sklearn的GroupKFold
和GroupShuffleSplit
的区别。
两者都为具有组 ID 的数据进行 train-test 拆分,因此组不会在拆分中分开。我检查了每个函数的一个 train/test 集,它们看起来都做了很好的分层,但如果有人可以确认所有拆分都这样做,那就太好了。
我对两者都进行了测试,分为 10 次:
gss = GroupShuffleSplit(n_splits=10, train_size=0.8, random_state=42)
for train_idx, test_idx in gss.split(X,y,groups):
print("train:", train_idx, "test:", test_idx)
train: [ 1 2 3 4 5 11 12 13 14 15 16 17 19 20] test: [ 0 6 7 8 9 10 18]
train: [ 1 2 3 4 5 6 7 8 9 10 12 13 14 18 19 20] test: [ 0 11 15 16 17]
train: [ 0 1 3 4 5 6 7 8 9 10 12 13 14 18 19 20] test: [ 2 11 15 16 17]
train: [ 0 2 3 4 11 12 13 14 15 16 17 18 19 20] test: [ 1 5 6 7 8 9 10]
train: [ 0 1 3 4 5 6 7 8 9 10 11 15 16 17 19 20] test: [ 2 12 13 14 18]
train: [ 1 2 3 4 5 6 7 8 9 10 11 15 16 17 18] test: [ 0 12 13 14 19 20]
train: [ 0 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17] test: [ 5 18 19 20]
train: [ 0 1 3 4 6 7 8 9 10 11 15 16 17 18 19 20] test: [ 2 5 12 13 14]
train: [ 0 1 3 4 5 12 13 14 15 16 17 18 19 20] test: [ 2 6 7 8 9 10 11]
train: [ 0 2 3 4 5 11 12 13 14 15 16 17 19 20] test: [ 1 6 7 8 9 10 18]
group_kfold = GroupKFold(n_splits=10)
for train_idx, test_idx in group_kfold.split(X,y,groups):
print("train:", train_idx, "test:", test_idx)
train: [ 0 1 2 3 4 5 11 12 13 14 15 16 17 18 19 20] test: [ 6 7 8 9 10]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 18 19 20] test: [15 16 17]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 15 16 17 18 19 20] test: [12 13 14]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] test: [19 20]
train: [ 0 1 2 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] test: [3 4]
train: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20] test: [ 0 18]
train: [ 0 1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20] test: [11]
train: [ 0 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] test: [5]
train: [ 0 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] test: [2]
train: [ 0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] test: [1]
un-Group 版本的文档使这一点更加清楚。 KFold 拆分为 k 次折叠,然后将它们合并为不同的 train/test 拆分,而 ShuffleSplit 重复直接进行 train/test 拆分。特别是,每个样本在 KFold 中只测试一次,但在 ShuffleSplit 中可以测试零次或多次。
关于 scikit learn here 的文档很好地概述了这两种方法的工作原理。 这里有一个插图,可以简化对同一文档的理解。
我也运行这个测试
X = array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
y = array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
Groups = array([1., 1., 1., 1., 1., 2., 2., 2., 2., 2., 0., 0., 0., 0., 0., 3., 3., 3., 3., 3.])
GSS 给了我这个结果:
train: [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] test: [0 1 2 3 4]
train: [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] test: [0 1 2 3 4]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] test: [15 16 17 18 19]
train: [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] test: [0 1 2 3 4]
train: [ 0 1 2 3 4 10 11 12 13 14 15 16 17 18 19] test: [5 6 7 8 9]
train: [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19] test: [10 11 12 13 14]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] test: [15 16 17 18 19]
train: [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19] test: [10 11 12 13 14]
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] test: [15 16 17 18 19]
train: [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19] test: [10 11 12 13 14]
看起来群组已保留。始终具有相同的大小(与您的示例相反)并且组可以在不同的测试选择中多次出现。
GKF 成绩:
train: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] test: [15 16 17 18 19]
train: [ 0 1 2 3 4 10 11 12 13 14 15 16 17 18 19] test: [5 6 7 8 9]
train: [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] test: [0 1 2 3 4]
train: [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19] test: [10 11 12 13 14]
每个组在测试中只能出现一次,所以n_splits参数的最大值在这里被限制为4,因为我只有4个组。