使用不同(合并)数据集的 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
?
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: 修复了代码中的拼写错误。
我有 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
?
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: 修复了代码中的拼写错误。