使用 RNN 进行 k 折交叉验证

数据挖掘 机器学习 Python 时间序列 rnn 过拟合
2021-10-10 03:09:10

在递归神经网络 (RNN) 中使用 k 折交叉验证来缓解过度拟合是个好主意吗?

  • 一个潜在的解决方案可能是L2 / Dropout Regularization,但它可能会破坏 RNN 的性能,如此所述。这种解决方案会影响 RNN 更长时间地学习和保留信息的能力。
  • 我的数据集严格基于时间序列,即auto-correlated with time and depends on the order of events. 使用标准的 k 折交叉验证,它会遗漏部分数据,在其余部分上训练模型,同时恶化时间序列顺序。什么可以是替代解决方案?
2个回答

TL;博士

使用堆叠交叉验证而不是传统的 K 折交叉验证。

堆叠交叉验证

在 Sckit-learn 中,这称为TimeSeriesSplit( docs )。

这些想法不是像您建议的那样随机打乱所有数据点并丢失它们的顺序,而是按顺序(或分批)拆分它们。

下面是一张传统 K-Fold 与 Stacked K-Fold 的对比图。他们都有K=4(四次迭代)。但是在传统的 K-Fold 中,所有数据一直都在使用,而在 Stacked K-Fold 中,只有过去的数据用于训练,现在的数据用于测试。

在此处输入图像描述 在此处输入图像描述

战略

  1. 以 Stacked K-Fold 方式拆分您的数据。
  2. 在每次迭代中,存储您的模型并根据测试集测量其性能。
  3. 在所有迭代结束后,选择性能最高的存储模型(甚至可能不是最后一个)。

注意:这是训练神经网络(使用验证集进行批处理)的常用方法。

除了如 BrunoGL 解释的堆叠交叉验证/TimeSeriesSplit/multi-train-test split ,您还可以使用前向验证。这个想法是沿着时间轴移动并以与在真实环境中“实时”或“在线”应用模型时类似的方式预测下一个时间点的数据。

用于预测的过去数据量可以变化(即,您可以使用完整的过去数据集或仅使用一些示例)。

据我所知,目前 SkLearn 中没有实现,但它很简单:

### Walk Forward Validation with full history starting at starting_point
starting_point = 100
for i in range(starting_point, len(X)):
    X_train = X[0:i]
    X_test = X[i:i+1]
    ### apply model here

由于您要进行大量拆分,因此计算成本很高。在某种程度上可以将其视为时间序列遗漏验证,因为您的测试数据只是一个数据点。

一个很好的阅读是如何回测时间序列预测的机器学习模型