拆分 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。
事情是这样的。 我正在为 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。