pandas 基于特定列创建交叉验证

pandas create Cross-Validation based on specific columns

我有一个几百行的数据框,可以按如下方式分组到 ids:

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 的所有行始终位于同一组中。 因此,要么所有行都在测试集中,要么所有行都在训练集中 - 对于所有不同的 ID 也是如此。

我想要 5 折 - 所以 80% 的 id 将用于火车,20% 用于测试。 我知道它不能保证所有折叠都具有完全相同的行数 - 因为一个 ID 的行数可能比另一个多。

最好的方法是什么?

如 sklearn documentation 中所述,有一个名为 "cv" 的参数,您可以在其中提供 "An iterable yielding (train, test) splits as arrays of indices."

以后一定要先查看文档。

如前所述,您可以为 cv 提供一个迭代器。您可以使用 GroupShuffleSplit()。例如,一旦使用它来拆分数据集,就可以将结果放在 cv 参数的 GridSearchCV() 中。

如前所述,GroupShuffleSplit() 根据组标签拆分数据。但是,测试集不一定是不相交的(即进行多次拆分,一个 ID 可能出现在多个测试集中)。如果您希望每个 ID 恰好出现在一个测试折叠中,您可以使用 GroupKFold()。这在 Sklearn.model_selection 中也可用,并直接扩展 KFold 以考虑组标签。