【发布时间】:2019-01-23 19:26:34
【问题描述】:
我需要在某些模型上做 K 折 CV,但我需要确保验证(测试)数据集按组和 t 年数聚集在一起。 GroupKFold 很接近,但它仍然拆分了验证集(见第二折)。
例如,如果我有一组从 2000 年到 2008 年的数据,我想将 K-fold 分成 3 组。适当的集合是:验证:2000-2002,训练:2003-2008; V:2003-2005, T:2000-2002 & 2006-2008;和 V:2006-2008,T:2000-2005)。
有没有办法使用 K-Fold CV 对数据进行分组和聚类,其中验证集按 t 年聚类?
from sklearn.model_selection import GroupKFold
X = [0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10, 0.1, 0.2, 2.2]
y = ["a", "b", "b", "b", "c", "c", "c", "d", "d", "d", "a", "b", "b"]
groups = [1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4]
gkf = GroupKFold(n_splits=2)
for train_index, test_index in gkf.split(X, y, groups=groups):
print("Train:", train_index, "Validation:",test_index)
输出:
Train: [ 0 1 2 3 4 5 10 11 12] Validation: [6 7 8 9]
Train: [3 4 5 6 7 8 9] Validation: [ 0 1 2 10 11 12]
Train: [ 0 1 2 6 7 8 9 10 11 12] Validation: [3 4 5]
期望产出(假设每组 2 年):
Train: [ 7 8 9 10 11 12 ] Validation: [0 1 2 3 4 5 6]
Train: [0 1 2 10 11 12 ] Validation: [ 3 4 5 6 7 8 9 ]
Train: [ 0 1 2 3 4 5 ] Validation: [6 7 8 9 10 11 12]
虽然,测试和训练子集不是连续的,并且可以选择更多年份进行分组。
【问题讨论】:
-
我看不出您的
groups列表与您想要的输出有何关联,或者您想要的输出与您之前提到的 2000 年至 2008 年的 9 年有何关联。也许是我,但我不太明白输入和输出之间的关系以及您的目标是什么。 -
@Merlin1896 在所需的输出中,我选择组 1 & 2、2 & 3 和 3 &4 进行验证。然后我想使用剩余的组进行训练,因此第 3 组和第 4 组、第 1 组和第 4 组以及第 1 组和第 2 组。在您的答案中,您只选择一个组作为我想要两个组的验证集(或更大数据集中的更多组) .您的想法是对的,我只想选择集群的组,例如两年。
-
但是为什么索引 6 在测试集中是三倍,而在训练集中却从来没有呢?我假设这是一个错字?如果是这样,请查看我编辑的答案。
标签: python scikit-learn cross-validation