Timeseries LSTM:测试数据是否需要在训练数据之后?

数据挖掘 时间序列 lstm rnn 序列到序列
2022-02-25 13:22:57

我有一个很长的时间序列。我想训练一个 LSTM 来区分每个时间步长(序列到序列)的两种行为(A 或 B)。

因为时间序列很长,我计划提取较短的、部分重叠的子序列,并将它们中的每一个用作 LSTM 的一个训练输入。

在我的训练/验证/测试拆分中,我是否必须使用较旧的子序列进行训练并使用较新的子序列进行验证和测试?或者我可以将它们视为独立样本并随机打乱它们,因为无论如何 LSTM 将以空内存开始每个子序列?

我问的原因是因为我注意到,由于时间序列的收集方式,前半部分主要包含行为 A,而后半部分主要包含行为 B。这将导致训练主要在 A 上,而测试主要在 B 上,这确实不能反映这样一个事实,即在生产中,系统将同时看到主要 A 期和主要 B 期。

1个回答

[编辑] 如果你有很长的序列,你也可以尝试基于注意力的模型来防止梯度消失的问题。


如果我没听错,你可能有以下情况:

  • 每个日期时间索引带有标签 A 或 B 的标记样本,具有作为信息属性的当前 + 一些感兴趣的滞后值-->(这将是一种标准分类方法,无需时间排序)

  • 样本的滑动窗口(您所说的子序列)-> 在这里,您应该至少尊重验证集的时间顺序,因此您确保使用具有未来从未见过的序列的真实场景评估您的 LSTM 使用第二种方法,您确实可以对训练批次进行洗牌(例如通过 keras shuffle(BUFFER_SIZE).batch(BATCH_SIZE) 功能(此处为 info),但保留验证集而不进行洗牌,如下所示:

      BATCH_SIZE = 256
      BUFFER_SIZE = 10000
    
      train_data_multi = tf.data.Dataset.from_tensor_slices((x_train_multi,y_train_multi))
      train_data_multi = train_data_multi.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
    
      val_data_multi = tf.data.Dataset.from_tensor_slices((x_val_multi, y_val_multi))
      val_data_multi = val_data_multi.batch(BATCH_SIZE).repeat()
    

你可以在这里找到一个完整的例子

您还可以使用时间序列数据预处理助手,您可以在其中决定是否进行随机播放。