【问题标题】:How is cross validation implemented?交叉验证是如何实现的?
【发布时间】:2017-05-04 04:09:45
【问题描述】:

我目前正在尝试使用交叉验证来训练神经网络,但我不确定我是否了解交叉验证的工作原理。我理解这个概念,但我还不能完全理解这个概念是如何转化为代码实现的。以下是对我实现的内容的描述,这或多或少是猜测。

我将整个数据集拆分为K-folds,其中1折为验证集,1折为测试集,其余折中的数据转储到训练集。

然后,我循环 K 次,每次都将验证集和测试集重新分配给其他折叠。在每个循环中,我只使用训练集持续训练网络(更新权重),直到网络产生的错误达到某个阈值。 但是,用于决定何时停止训练的错误是使用验证集产生的,而不是训练集。 训练完成后,错误再次产生,但这次使用的是测试放。记录测试集中的这个错误。 最后,所有权重都被重新初始化(使用最初用于初始化它们的相同随机数生成器)或以某种方式重置,以撤消在继续进行下一组验证、训练和测试集。

一旦所有 K 循环完成,K 循环的每次迭代中记录的错误都会被平均。

我已将我最困惑的部分加粗。如果我犯了任何错误,请告诉我!

【问题讨论】:

  • 这个问题更适合stats.stackexchange.com 而不是 SO,因为它不是关于编程的问题,而是关于统计的问题。

标签: validation machine-learning cross-validation


【解决方案1】:

我相信您的交叉验证实施通常是正确的。回答您的问题:

但是,用于决定何时停止训练的错误是使用验证集产生的,而不是训练集。

您想在验证集上使用错误,因为它减少了overfitting。这就是你总是想要一个验证集的原因。如果你按照你的建议去做,你可以有一个更低的阈值,你的算法将获得比验证准确度更高的训练准确度。但是,这将很难推广到现实世界中看不见的示例,即您的验证集应该建模的示例。

最后,重新初始化所有权重(使用最初用于初始化它们的相同随机数生成器)或以某种方式重置,以撤消在继续进行下一组验证、训练和测试集。

交叉验证背后的想法是,每次迭代都像是从头开始训练算法。这是可取的,因为通过平均您的验证分数,您可以获得更可靠的值。它可以防止出现有偏差的验证集。

我唯一的建议是不要在您的交叉验证方案中使用测试集,因为您的验证集已经对看不见的示例进行了建模,因此在交叉验证期间单独的测试集是多余的。在开始交叉验证之前,我会将数据拆分为训练和测试集。在你想为你的算法获得客观分数之前,我不会接触测试集。

您可以使用您的交叉验证分数作为未见示例的性能指标,但是我假设您将根据该分数选择参数,从而针对您的训练集优化您的模型。再次,出现这种可能性并不能很好地推广到看不见的例子,这就是为什么保留一个单独的看不见的测试集是一个很好的做法。仅在优化算法后使用。

【讨论】:

  • 我明白了。感谢您澄清同时拥有测试和验证集的冗余。如果您不介意,我现在还有一个问题:如果在每次迭代结束时重置权重,那么在交叉验证后如何确定这些权重的训练值?我是否应该在每次迭代结束时记录权重并最终将权重值设置为平均值(就像我对错误所做的那样?)或者我是否可以将权重设置为等于在最后一次迭代中训练后的最终值?
  • 交叉验证的目的是为您的参数获得最佳值。一旦您在交叉验证期间获得最大性能,您将使用这些参数在最终训练数据集上训练模型,假设您也使用提前停止,我将使用您应该在开始交叉验证之前拆分的测试集,保存模型在您用于交叉验证的整个数据集上训练时,测试集上的误差最低。
猜你喜欢
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2012-02-04
  • 2018-06-30
  • 2020-06-01
  • 2021-07-10
相关资源
最近更新 更多