使用不同(合并)数据集的 K 折交叉验证

K-Fold Cross validation with different (merged) datasets

我有 15 个不同的数据集(15 个 pandas.DataFrame 的列表),我想从单个分类器做 K-Fold CV 的角度来研究同一个问题。目前,我正在运行一些具有以下结构的实验:

# Manual 15-Fold CV
for i in range(len(datasets)):
   train_sets = [datasets[j] for j in range(len(datasets)) if j != i]
   test_set = datasets[i]

   train = pd.concat(train_sets)
   clf = ...
   clf.fit(...)
   ...

如您所见,我需要将每个数据集视为 K-Fold 的折叠,而不是简单地将所有数据集合并为一个数据集和 运行 默认 cross_val_score() 或类似的东西。

这在 运行 单一实验时效果很好,但我想使用 GridSearchCV 来更好地探索我的模型。所以,问题是:是否有任何方法可以创建自定义 KFold 预定义每次折叠的内容并将其传递给 GridSearchCV

来自 documentation

cv: int, cross-validation generator or an iterable, default=None

An iterable yielding (train, test) splits as arrays of indices.

所以你可以创建一个元组列表,并将所有数据合并到一个数据集中,同时维护它们的索引,你可以在这些元组中使用,

所以如果你在一个名为 indicies 的 numpy 数组列表中有索引。

编辑:这是未经测试的,但应该可以。

indicies = []
train_test_set = []
last_element = 0
for j in range(len(datasets)):
    train_test_set.append(datasets[j])
    indicies.append(np.arange(last_element,last_element+len(datasets[j])))
    last_element += len(datasets[j])

cv_list = []
for i in range(15):
    cv_train = np.hstack([indicies[x] for x in range(15) if x != i])
    cv_list.append((cv_train,indicies[i]))

然后将 cv_list 传递给函数。

Edit2: 修复了代码中的拼写错误。