报告神经网络交叉验证的测试结果

数据挖掘 机器学习 Python 神经网络 深度学习 喀拉斯
2022-03-04 12:28:11

我有一个小数据集,所以我必须使用交叉验证来报告测试结果,以便更好地估计分类结果。出于某种原因,我必须使用神经网络来做到这一点。

因为神经网络有其独特的怪癖,例如寻找超参数,我正在使用嵌套交叉验证。我将我的数据集分成 10 折进行交叉验证。然后我将用于训练的 9 折分成 10 折。从这 10 折中,我使用 9 折来训练不同的超参数(在我的情况下是隐藏单元的数量和辍学率),并使用另一折来获得不同超参数的准确性(有点就像深度学习文献中的验证集)。

然后我再次使用我找到的最佳超参数在第一部分数据的所有 9 折上训练我的模型。因为我错过了最初 9 折中的一些数据用作验证集。现在,当我报告测试结果时,我将训练数据的 epoch 数设置为固定次数,当我的网络在测试集上表现最好时,我停止训练,保存该模型以备将来使用,并报告该结果。我的问题是关于最后一部分。我在报告这个结果时做错了什么?为了清楚起见,我在这个阶段没有调整任何超参数。我只是将网络设置为在达到最佳测试结果时停止对训练数据的训练。我认为这是一个非常微妙的问题,如果它是一个问题的话。这就是为什么我很困惑。

对于不同的数据部门,我用不同的种子做这整件事 5-6 次,我只报告所有这些运行的平均值。

1个回答

现在,当我报告测试结果时,我将训练数据的 epoch 数设置为固定次数,当我的网络在测试集上表现最好时,我停止训练,保存该模型以备将来使用,并报告该结果。我的问题是关于最后一部分。我在报告这个结果时做错了什么?

从技术上讲,是的,这是报告无偏见测试指标的错误过程。如果 cv 结果是嘈杂的并且每个时期随机变化,这可能是对性能的严重高估。理论上,您应该将提前停止的 epoch 数视为与其他超参数相同,从较低级别的交叉验证中发现一个好的值并坚持下去。

不过我的建议有一个问题——早期停止的时期数对训练数据集的大小很敏感,当你从较低级别的交叉验证更改为较高级别的交叉验证时,你只是增加了大小。因此,您可能会以明显更差的结果为代价获得公正的衡量标准。

首先,看看你的学习曲线。cv 结果对纪元数有多敏感?如果它们不敏感——在合理的时期数范围内没有明显的过度拟合——那么只需选择适用于所有折叠的中等固定时期数。这样,您将获得公正的估计,并且可能不会影响模型质量。

或者,您可能只需要很高兴知道您的测试估计有偏差,但是您通过使用 10 倍 CV 显着降低了方差,并且只在顶层搜索了一个超参数(不是全部三个)。它可能只是略有偏差,但仍然是一个很好的估计。学习曲线越平滑、越不紧张,你就越能摆脱这种情况——但遗憾的是,你无法衡量偏差,所以你永远不会 100% 确定。