1

我正在同时对多个数据集执行 k 折验证。我正在使用KFoldfromsklearn进行 10 倍验证。基本上,这将数据集划分为 10 个部分,并在其中 9 个部分上训练分类器,然后在剩余的第 10 个部分测试结果,然后执行相同的例程,但将测试集切换为新的第 10 个分区,现在包含旧测试集在训练集中。我可以使用以下代码为单个数据集编写一个 for 循环:

for train, test in kfold.split(data):
    print(train)
    print(test)

其输出如下:

[1 2 3 4 5 6 7 8 9]
[0]
[0 2 3 4 5 6 7 8 9]
[1]
[0 1 3 4 5 6 7 8 9]
[2]
[0 1 2 4 5 6 7 8 9]
[3]
[0 1 2 3 5 6 7 8 9]
[4]
[0 1 2 3 4 6 7 8 9]
[5]
[0 1 2 3 4 5 7 8 9]
[6]
[0 1 2 3 4 5 6 8 9]
[7]
[0 1 2 3 4 5 6 7 9]
[8]
[0 1 2 3 4 5 6 7 8]
[9]

其中第一个数组是要从数组的初始数据集数组中使用的训练集的索引,第二个数组是测试集的索引。我可以让它正确地迭代一个数据集。但是,我将如何同时为多个数据集执行此操作?例如,如果我想使用来自多个集合的特定折叠创建一个分类器。我尝试了以下方法:

for train0, test0, train1, test1 in kfold.split(data0), kfold.split(data1):
    # code

但我收到以下错误:ValueError: too many values to unpack (expected 4)

4

1 回答 1

3

您可以使用并行迭代zip

for kfold0, kfold1 in zip(kfold.split(data0), kfold.split(data1)):
   train0, test0 = kfold0
   train1, test1 = kfold1
   ...

您甚至可以直接在循环中解压缩元组,尽管我个人觉得这不太可读:

for (train0, test0), (train1, test1) in zip(kfold.split(data0), kfold.split(data1)):
   ...
于 2019-10-12T08:54:55.630 回答