带有验证和测试集的 K 折交叉验证

数据挖掘 Python 交叉验证
2022-02-20 03:28:32

对于一个项目,我想执行分层 5 折交叉验证,其中每一折数据被分成测试集(20%)、验证集(20%)和训练集(60%)。我希望测试集和验证集不重叠(对于五折中的每一折)。

这或多或少在Wikipedia上是这样描述的:

单个 k 折交叉验证与验证集和测试集一起使用。整个数据集被分成 k 个集合。一个一个地选择一个集合作为测试集。然后,一个接一个地,将剩余的一组用作验证集,将其他 k-2 组用作训练集,直到评估完所有可能的组合。训练集用于模型拟合,验证集用于每个超参数集的模型评估。最后,对于选定的参数集,使用测试集来评估具有最佳参数集的模型。在这里,可能有两种变体:要么评估在训练集上训练的模型,要么评估适合训练集和验证集组合的新模型。

现在,我已经实现了如下所示的内容(在此处描述):

kf = KFold(n_splits = 5, shuffle = True, random_state = 2)

for train_index, test_index in kf.split(X):
    X_tr_va, X_test = X.iloc[train_index], X.iloc[test_index]
    y_tr_va, y_test = y[train_index], y[test_index]
    X_train, X_val, y_train, y_val = train_test_split(X_tr_va, y_tr_va, test_size=0.25)
    print("TRAIN:", list(X_train.index), "VALIDATION:", list(X_val.index), "TEST:", test_index)

尽管它确实很好地为我提供了 5 个折叠,其中对于每个折叠我都有一个验证集、测试集和训练集,验证集在五个折叠中的每一个之间都有重叠(因此折叠 1 中存在的一些实例也存在于折叠中2等)。对于测试集,情况并非如此(即它们在折叠之间没有重叠)。

有没有办法防止验证集发生折叠之间的这种重叠?

1个回答

您可以从一开始就将数据集的一部分作为最终模型验证的保留测试集,然后对其余数据继续执行 k 折交叉验证策略,如下所示:

在此处输入图像描述
来源:https ://scikit-learn.org/stable/modules/cross_validation.html

这样,您就没有提到的重叠,主要是,您确保模型最终使用从未见过的数据进行评估。