我需要对一些模型进行K折交叉验证,但我需要确保验证(测试)数据集按照组和t年聚类在一起。GroupKFold接近这个要求,但它仍然会分割验证集(见第二次折叠)。
例如,如果我有一个包含2000-2008年的数据集,并且我想将其K折成3组。适当的集合应该是:验证集:2000-2002,训练集:2003-2008;V:2003-2005,T:2000-2002和2006-2008;以及V:2006-2008,T:2000-2005。
是否有一种方法可以使用K-Fold CV对数据进行分组和聚类,使得验证集按照t年聚类?
例如,如果我有一个包含2000-2008年的数据集,并且我想将其K折成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