交叉验证 Vs。训练验证测试

数据挖掘 机器学习 交叉验证
2021-09-20 02:23:46

我对交叉验证方法和训练验证测试方法有疑问。

有人告诉我,我可以将数据集分成 3 个部分:

  1. 训练:我们训练模型。
  2. 验证:我们验证和调整模型参数。
  3. 测试:从未见过的数据。我们得到一个无偏的最终估计。

到目前为止,我们已经分为三个子集。直到这里一切都好。附上一张图片:

在此处输入图像描述

然后我遇到了 K-fold 交叉验证方法,我不明白的是如何将测试子集与上述方法联系起来。意思是,在 5 折交叉验证中,我们将数据分成 5 份,在每次迭代中,非验证子集用作训练子集,验证用作测试集。但是,就上述示例而言,k-fold 交叉验证中的验证部分在哪里?我们要么有验证,要么有测试子集。

当我提到自己训练/验证/测试时,“测试”就是得分:

模型开发通常是一个两阶段的过程。第一阶段是训练和验证,在此期间,您将算法应用于您知道结果的数据,以揭示其特征和目标变量之间的模式。第二阶段是评分,在此阶段您将训练好的模型应用于新数据集。然后,它以分类问题的概率分数和回归问题的估计平均值的形式返回结果。最后,您将经过训练的模型部署到生产应用程序中,或使用它发现的见解来改进业务流程。

例如,我找到了 Sci-Kit 学习交叉验证版本,如下图所示:

在此处输入图像描述

在进行拆分时,您可以看到他们给您的算法只处理原始数据集的训练部分。因此,最终,我们无法执行最终评估过程,如您在附图中所见。

谢谢!

scikitpage

3个回答

如果使用 k 折交叉验证来优化模型参数,则将训练集拆分为 k 个部分。训练发生 k 次,每次都忽略训练集的不同部分。通常,这些 k 模型的误差是平均的。这是针对每个要测试的模型参数完成的,并选择具有最低误差的模型。测试集到目前为止还没有使用过。

只有在最后,测试集才用于测试(优化)模型的性能。

# example: k-fold cross validation for hyperparameter optimization (k=3)

original data split into training and test set:

|---------------- train ---------------------|         |--- test ---|

cross-validation: test set is not used, error is calculated from
validation set (k-times) and averaged:

|---- train ------------------|- validation -|         |--- test ---|
|---- train ---|- validation -|---- train ---|         |--- test ---|
|- validation -|----------- train -----------|         |--- test ---|

final measure of model performance: model is trained on all training data
and the error is calculated from test set:

|---------------- train ---------------------|--- test ---|

在某些情况下,如果不需要参数优化,则对整个数据集使用 k 折交叉验证(这种情况很少见,但确实会发生)。在这种情况下,将没有验证集,并且将 k 个部分一个一个用作测试集。这些 k 测试中的每一个的误差通常是平均的。

# example: k-fold cross validation

|----- test -----|------------ train --------------|
|----- train ----|----- test -----|----- train ----|
|------------ train --------------|----- test -----|

@louic 的回答是正确的:您将数据分为两部分:训练和测试,然后在训练数据集上使用 k 折交叉验证来调整参数。如果您的训练数据很少,这很有用,因为您不必从训练数据集中排除验证数据。

但我发现这条评论令人困惑:“在某些情况下,对整个数据集使用 k 折交叉验证......如果不需要参数优化”。正确的是,如果您在第一次运行模型后不需要对模型进行任何优化,那么来自您的 k 折交叉验证运行的验证数据的性能可以为您提供对模型性能的无偏估计。但这确实是一个奇怪的案例。在整个数据集上使用 k-fold 交叉验证并调整您的算法的评论要多得多。这意味着您失去了对模型性能的无偏估计,但这并不总是需要的。

好问题!

我发现这种训练/测试/验证令人困惑(我从事 ML 已有 5 年了)。

谁说你的形象是正确的?让我们去一个机器学习权威(Sk-Learn)

一般来说,我们在训练/测试上进行 k-Fold(参见下面的 Sk-Learn 图像)。

从技术上讲,您可以更进一步,对所有内容(训练/测试/验证)进行交叉验证。虽然我从来没有做过...

祝你好运!

在此处输入图像描述