Python 3.x 如何在Tensorflow中分割LSTM的训练数据和测试数据进行时间序列预测

Python 3.x 如何在Tensorflow中分割LSTM的训练数据和测试数据进行时间序列预测,python-3.x,tensorflow,time-series,lstm,cross-validation,Python 3.x,Tensorflow,Time Series,Lstm,Cross Validation,我最近学习了时间序列预测的LSTM 在他的教程中,他说:我们将使用以下函数创建一批从训练数据中随机选取的较短子序列,而不是在几乎300k观测值的完整序列上训练递归神经网络 def batch_generator(batch_size, sequence_length): """ Generator function for creating random batches of training-data. """ # Infinite loop. while True: # Allo

我最近学习了时间序列预测的LSTM

在他的教程中,他说:我们将使用以下函数创建一批从训练数据中随机选取的较短子序列,而不是在几乎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)
他试图创建几个bacth样本用于训练

我的问题是,我们是否可以首先随机穿梭
x\u序列缩放
y\u序列缩放
,然后开始使用以下
批量生成器对多个批量进行采样

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

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

x_batch[i] = x_train_scaled[idx:idx+sequence_length]
y_batch[i] = y_train_scaled[idx:idx+sequence_length]
我们可以选择不连续的
x\u批次
y\u批次
吗。例如,
x\u批次[0]
10:00am
拾取,
x\u批次[1]
9:00am
当天拾取

总结:以下两个问题是:

(1) 我们是否可以首先随机穿梭
x\u序列缩放
y\u序列缩放
,然后开始使用以下
批次生成器对多个批次大小进行采样

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


谢谢

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

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

最后,问题是:“时间序列”实际上是一个时间序列(即,记录确实依赖于它们的邻居),或者有某种转换可以打破这种依赖关系,但保留问题的结构?对于这个问题,只有一种方法可以找到答案:探索数据集

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

(1)我们不能。想象一下,试图预测明天的天气。您是想要过去10小时的温度值序列,还是想要过去5年的随机温度值

您的数据集是一个以1小时为间隔的长值序列。您的LSTM按时间顺序采集一系列样本。例如,使用
sequence_length=10
可以将2018-03-01 09:00:00到2018-03-01 19:00:00的数据作为输入。如果在生成由这些序列组成的批之前对数据集进行洗牌,您将训练LSTM基于整个数据集的随机样本序列进行预测


(2)是的,我们需要考虑时间序列的时间排序。您可以在此处找到用python测试时间序列LSTM的方法:

列车/测试数据必须以尊重时间顺序的方式进行分割,并且模型从不在未来的数据上进行训练,只在未来的数据上进行测试