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


  test_size:浮点数,整数,无,可选
  如果为float,则应在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为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%)。

因此,我丢失了什么,或者文档不过是错误的描述而已。

谢谢。

最佳答案

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

关于python - sklearn.model_selection.GroupShuffleSplit不会像应该产生的方式那样产生分割,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54950675/

10-12 23:27