如何在Tensorflow中为LSTM分割训练数据和测试数据以进行时间序列预测

时间:2019-02-28 15:32:55

标签: python-3.x tensorflow time-series lstm cross-validation

我最近从以下位置学习了LSTM以进行时间序列预测 https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/23_Time-Series-Prediction.ipynb

在他的教程中,他说:我们不是使用递归神经网络对将近300k观测值的完整序列进行训练,而是使用以下函数来创建从训练数据中随机抽取的一批较短的子序列。

def batch_generator(batch_size, sequence_length):
"""
Generator function for creating random batches of training-data.
"""

# Infinite loop.
while True:
    # Allocate a new array for the batch of input-signals.
    x_shape = (batch_size, sequence_length, num_x_signals)
    x_batch = np.zeros(shape=x_shape, dtype=np.float16)

    # Allocate a new array for the batch of output-signals.
    y_shape = (batch_size, sequence_length, num_y_signals)
    y_batch = np.zeros(shape=y_shape, dtype=np.float16)

    # Fill the batch with random sequences of data.
    for i in range(batch_size):
        # Get a random start-index.
        # This points somewhere into the training-data.
        idx = np.random.randint(num_train - sequence_length)

        # Copy the sequences of data starting at this index.
        x_batch[i] = x_train_scaled[idx:idx+sequence_length]
        y_batch[i] = y_train_scaled[idx:idx+sequence_length]

    yield (x_batch, y_batch)

他尝试创建一些训练样本。

我的问题是,我们是否可以首先随机穿梭x_train_scaledy_train_scaled,然后使用跟随的batch_generator开始抽样几个批次的样品?

我对这个问题的动机是,对于时间序列预测,我们希望训练过去并预测未来。因此,穿梭训练样本是否合法?

在本教程中,作者选择了一块连续的样本,例如

x_batch[i] = x_train_scaled[idx:idx+sequence_length]
y_batch[i] = y_train_scaled[idx:idx+sequence_length]

我们可以选择x_batchy_batch不是连续的吗?例如,x_batch[0]是在10:00am拾取的,而x_batch[1]是在9:00am是同一天拾取的?

总结:以下两个问题是

(1)我们能否首先随机穿梭x_train_scaledy_train_scaled,然后开始使用以下batch_generator采样几个批次的大小?

(2)在训练LSTM时,是否需要考虑时间顺序的影响?我们为LSTM学习哪些参数。

谢谢

2 个答案:

答案 0 :(得分:3)

(1)我们不能。想象一下如何预测明天的天气。您是否需要最近10个小时的温度值序列,还是最近5年的随机温度值?

您的数据集是一小时内间隔很长的值序列。您的LSTM会按时间顺序连接采样。例如,使用sequence_length = 10可以将2018-03-01 09:00:00到2018-03-01 19:00:00的数据作为输入。如果您在生成包含这些序列的批次之前先对数据集进行洗牌,那么您将根据整个数据集中的随机样本序列对LSTM进行预测训练。


(2)是的,我们需要考虑时间序列的时间顺序。您可以在这里找到在python中测试时间序列LSTM的方法:https://machinelearningmastery.com/backtest-machine-learning-models-time-series-forecasting/

  

训练/测试数据必须按照尊重时间顺序的方式进行拆分,并且永远不要对来自未来数据的模型进行训练,而只能对未来数据进行测试。

答案 1 :(得分:1)

这在很大程度上取决于数据集。例如,数据集中随机日期的天气与周围几天的天气高度相关。因此,在这种情况下,您应该尝试使用有状态的LSTM(即,使用先前记录作为下一个记录的输入的LSTM)并按顺序进行训练。

但是,如果您的记录(或它们的转换)彼此独立,但是依赖于一些时间概念,例如记录或这些记录的子集中项目的到达时间,使用改组时应该有明显的差异。在某些情况下,它将提高模型的鲁棒性;在其他情况下,它将不会泛化。注意这些差异是模型评估的一部分。

最后,问题是:“时间序列” 原样实际上是一个时间序列(即记录确实取决于其邻居),或者存在一些可以打破此时间序列的转换依赖性,但保留问题的结构?而且,对于这个问题,只有一种方法可以得到答案:探索数据集。

关于权威参考,我不得不让你失望。我从该领域经验丰富的研究人员那里学到了这一点,但是,据他介绍,他是通过大量实验和失败中学到的。正如他告诉我的那样:这些不是规则,它们是准则;尝试所有适合您预算的解决方案;改进最好的;再试一次。