我有一个几百行的数据帧,可以按如下方式分组为id:
df = Val1 Val2 Val3 Id
2 2 8 b
1 2 3 a
5 7 8 z
5 1 4 a
0 9 0 c
3 1 3 b
2 7 5 z
7 2 8 c
6 5 5 d
...
5 1 8 a
4 9 0 z
1 8 2 z
我想使用GridSearchCV,但使用自定义CV可以确保来自同一ID的所有行始终位于同一集合上。因此,如果a在测试集中,要么所有的行都在训练集中——对于所有不同的ID也是如此。
我想要5次折叠,所以80%的id将用于火车,20%用于测试。我知道它不能保证所有折叠都有完全相同的行数,因为一个ID可能比另一个ID有更多的行。
最好的方法是什么?
如前所述,GroupShuffleSplit()
基于组标签拆分数据。然而,测试集并不一定是不相交的(即,进行多次拆分时,一个ID可能会出现在多个测试集中(。如果您希望每个ID只出现在一个测试折叠中,则可以使用GroupKFold()
。这在Sklearn.model_selection
中也可用,并直接扩展KFold
以考虑组标签。
如上所述,您可以为cv
提供迭代器。您可以使用GroupShuffleSplit((。例如,一旦使用它来分割数据集,就可以将结果放在cv
参数的GridSearchCV()
中。
正如sklearn文档中提到的,有一个名为"cv"的参数,您可以在其中提供"作为索引数组的可迭代收益(训练、测试(拆分。">
以后一定要先查看文档。