我有一个包含 6 个变量的多元时间序列数据集。鉴于下一个时间步的其他五个变量的预期值,我必须在下一个时间步预测第六个变量。我正在使用 LSTM 进行预测。数据集很小(170*6),有 170 个观测值。在这种情况下,将数据集拆分为三个,即训练/测试/拆分似乎不是一个可能的选择。
据我所知,假设 LSTM 学习的输入序列(固定长度)是独立的。所以我的问题是,是否可以像在横截面数据问题的情况下一样忽略一个序列进行验证。
我有一个包含 6 个变量的多元时间序列数据集。鉴于下一个时间步的其他五个变量的预期值,我必须在下一个时间步预测第六个变量。我正在使用 LSTM 进行预测。数据集很小(170*6),有 170 个观测值。在这种情况下,将数据集拆分为三个,即训练/测试/拆分似乎不是一个可能的选择。
据我所知,假设 LSTM 学习的输入序列(固定长度)是独立的。所以我的问题是,是否可以像在横截面数据问题的情况下一样忽略一个序列进行验证。
为 LSTM 或任何其他时间序列模型留下一个交叉验证并没有多大意义,因为它会在序列中引入缺失值并从未来泄漏信息。
时间序列模型从历史值中学习,以预测未来。在遗漏交叉验证中,您会从系列中删除观察结果,包括过去的观察结果,这会导致数据丢失。接下来,sch 交叉验证策略需要模型能够以某种方式处理缺失数据,或者需要一些外部策略来处理它们,并且基本上会测试模型处理缺失数据的能力。仅当可以假设样本是独立的时才可以使用简单的交叉验证,而时间序列绝不是这种情况(除非您假设它是随机噪声)。
对于时间序列数据,如Hyndman 和 Athanasopoulos (2018)所述,我们提前一步进行交叉验证,我们使用样本来预测值(或者值),其中我们使用不同的值,如下图所示(也由Hyndman 和 Athanasopoulos,2018 年)。
这种策略测试您要测试的内容,即您的模型从过去预测未来的能力如何。此外,它还测试了模型处理不断变化的数据的能力,这种情况在这种情况下很常见,因为您通常不会使用静态训练样本进行单一预测,而是想要一个可以重新训练的模型新数据并且会适应。
评论 LSTM 网络
既然你明确询问了 LSTM,
假设 LSTM 学习的输入序列(固定长度)是独立的。所以我的问题是,是否可以像在横截面数据问题的情况下一样忽略一个序列进行验证。
让我对此发表评论。上述答案也适用于 LSTM 网络。LSTM 网络通过使用滑动 LSTM 窗口来学习数据中的时间依赖性,因此不假定序列是独立的,因为“长期记忆”的概念是依赖性假设。通常,序列是按照这个Keras 代码示例生成的(另请参阅本教程以获取带有描述的代码):
sentences = []
next_chars = []
for i in range(0, len(text) - maxlen, step):
sentences.append(text[i: i + maxlen])
next_chars.append(text[i + maxlen])
如您所见,循环用于遍历您的数据并创建一个滑动窗口,该窗口会产生step大小跳跃,其中step小于maxlen. 所以序列是依赖的。即使您使用stepequal to maxlen,您仍然会通过选择模型来假设时间依赖性。
接下来,删除其中一个序列会导致引入缺失数据。使用简单的交叉验证会引入偏差,因为您将衡量您的模型在缺失数据情况下的工作方式,而不是它对未来的预测效果如何。对于时间序列,您应该使用提前一步交叉验证。