拆分 python 中的数据,使每个主题保持一倍(m 倍交叉验证)

Splitting data in python such that each subject stays in one fold (m fold cross validation)

事情是这样的。 我正在为 5 名患者(P1、P2、... P5)应用二元分类器。每个患者有 100 个数据样本,输出为 0 或 1。

所以我把一个病人放在一边(比如 P5)作为测试数据,剩下的用于验证和训练。但我还想找到分类器(比如支持向量机)的最佳超参数数量,所以我也为此使用了 4 折交叉验证。

但是,我想确保将训练数据拆分为 cross_training 和 cross_testing,这样一名患者的所有样本都保持 cross_testing 倍。我不希望它被洗牌,因为我在测试和训练中都会有一个病人的数据,这不好。

我在 python 中使用 GridSearchCV 来拆分数据,但我不知道如何自定义它以便我们将拥有: 测试折叠中的 100 个 p1 样本和训练折叠中的所有 300 个 p2、p3、p4 样本....... 测试折叠中的 100 个 p4 样本和训练折叠中的所有 300 个 p1、p2、p3 样本.

换句话说,我想创建一个患者指标,以便 gridasearchCv 根据它拆分数据。

我们是否有关于它的软件包,或者我应该尝试在不使用 GridSearchCV 或任何类似性质的情况下手动编写它?

你应该使用 scikit-learn GroupKFold。它应该很容易解决你的问题。使用列表 patients 作为组,这样 patients[i] == "p2" 如果样本 i 属于患者 2。

这是 documentation