我目前正在尝试使用交叉验证来训练神经网络,但我不确定我是否正在进行交叉验证。我理解这个概念,但我还不能完全看到这个概念如何转化为代码实现。以下是对我实施的内容的描述,这或多或少是猜测。
我将整个数据集拆分为K-folds,其中1倍是验证集,1倍是测试集,剩余折叠中的数据被转储到训练集中。
然后,我循环K次,每次将验证和测试集重新分配给其他折叠。在每个循环中,我仅使用训练集连续训练网络(更新权重),直到网络产生的错误达到某个阈值。 但是,用于决定何时停止训练的错误是使用验证集而不是训练集生成的。训练完成后,再次产生错误,但这次使用测试组。记录测试集中的此错误。 最后,重新初始化所有权重(使用用于最初初始化它们的相同随机数生成器)或以某种方式重置以撤消在进入下一组验证,培训和之前已完成的学习测试集。
一旦所有K循环完成,K循环的每次迭代中记录的错误都被平均。
我把那些我最困惑的部分加粗了。如果我犯了任何错误,请告诉我!
答案 0 :(得分:2)
我相信您的交叉验证实施通常是正确的。回答你的问题:
但是,用于决定何时停止训练的错误是使用验证集而不是训练集产生的。
您希望在验证集上使用错误,因为它会减少overfitting。这就是您总是希望拥有验证集的原因。如果您按照建议进行操作,则可能具有较低的阈值,您的算法将获得比验证准确性更高的训练准确度。但是,这会对现实世界中看不见的示例(即您的验证集应该建模的示例)进行概括。
最后,重新初始化所有权重(使用用于初始化它们的相同随机数生成器)或以某种方式重置以撤消在进入下一组验证,培训和之前已完成的学习测试集。
交叉验证背后的想法是每次迭代就像从头开始训练算法。这是可取的,因为通过平均验证分数,您可以获得更强大的价值。它可以防止出现有偏见的验证集。
我唯一的建议是不要在交叉验证方案中使用测试集,因为您的验证集已经模拟了看不见的示例,交叉验证期间的单独测试集是多余的。在开始交叉验证之前,我会将数据拆分为训练和测试集。在您想要获得算法的客观分数之前,我不会触摸测试集。
您可以使用交叉验证分数作为未见示例的性能指标,但我假设您将在此分数上选择参数,优化训练集的模型。同样,可能出现这种情况并不能很好地概括为看不见的例子,这就是为什么保持一个单独的看不见的测试集是一个好习惯。只有在优化算法后才能使用。