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

时间:2019-03-01 18:54:25

标签: python scikit-learn

因此,我需要使用预定义的组生成测试/训练/验证拆分。我不想使用LeavePGroupsOut,因为我需要根据期望的性能将数据分离为训练和验证集。在GroupShuffleSplit的文档中,对于test_size参数,它表示:

  

test_size:浮点数,整数,无,可选   如果为float,则应在0.0到1.0之间,并且代表要包括在测试拆分中的数据集的比例。 如果为整数,则表示测试样本的绝对数量。如果为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为float时,大多数情况下不考虑指定的比率。这可能是由于组中样本大小不相等引起的,但是必须有注释/警告来指定在不相等的组大小和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%)。

所以,我丢失了什么,或者文档不过是错误的说明而已。

谢谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我在GroupShuffleSplit文档中发现了这一点:

注意:参数test_size和train_size指向组,而不是组 采样,如ShuffleSplit。

因此,预计test_size为组数,这也是您在结果中找到的。