sklearn.model_selection.GroupShuffleSplit 不会像它应该产生的那样产生分裂

Posted

技术标签:

【中文标题】sklearn.model_selection.GroupShuffleSplit 不会像它应该产生的那样产生分裂【英文标题】:sklearn.model_selection.GroupShuffleSplit does not produce splits as how it supposed to produce 【发布时间】:2019-07-23 20:14:10 【问题描述】:

因此,我需要使用预定义的组生成测试/训练/验证拆分。我不想使用 LeavePGroupsOut,因为我需要根据我想要的百分比将数据分成训练和验证集。在 GroupShuffleSplit 的文档中,test_size 参数是这样说的:

test_size : 浮点数,整数,无,可选 如果是浮点数,则应介于 0.0 和 1.0 之间,表示要包含在测试拆分中的数据集的比例。 如果是int,表示测试样本的绝对数量。如果为 None,则将该值设置为火车大小的补码。默认情况下,该值设置为 0.2。默认值将在 0.21 版本中更改。仅当未指定 train_size 时,它​​将保持 0.2,否则它将补充指定的 train_size。

但是,确实不是这样,如下代码所示:

tr, ts = next(GroupShuffleSplit(n_splits=1, test_size=3).split(TR_set, groups=tr_groups))
print(tr)
print(ts)

例如打印出来:

[ 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 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 91 92 93 99 101 102 103 104 105 106 107] [ 26 27 89 90 94 95 96 97 98 100]

正如您在上面看到的,测试大小不是 3,而是大于 3。这几乎总是如此。我检查了指数组。显然,如果 test_size 是一个整数,它代表测试组的绝对数量,不是样本。我认为文档具有误导性。

另外,当 test_size 为浮点数时,它大多不考虑指定的比率。这可能是由于组中的样本大小不相等,但必须有一个注释/警告来指定它在不相等的组大小和 test_size 比率下遵循的行为。

tr, ts = next(GroupShuffleSplit(n_splits=1, test_size=0.1).split(TR_set, groups=tr_groups))
print(len(tr))
print(len(ts))

给出:

70
38

其中测试规模是整个集合的 35%(应该是 10%)。

所以,要么我遗漏了什么,要么文档只是错误的描述。

谢谢。

【问题讨论】:

【参考方案1】:

没有错误,但文档在某些方面不正确。我在scikit-learn's github page 中为此主题打开了一个问题。

【讨论】:

【参考方案2】:

我在 GroupShuffleSplit 文档中找到了这个:

注意:参数 test_size 和 train_size 指的是组,而不是 到样本,就像在 ShuffleSplit 中一样。

因此,test_size 应该是组数,这也是您在结果中发现的。

【讨论】:

文档更新,见github.com/scikit-learn/scikit-learn/issues/13369

以上是关于sklearn.model_selection.GroupShuffleSplit 不会像它应该产生的那样产生分裂的主要内容,如果未能解决你的问题,请参考以下文章