【问题标题】:How to split the training data and test data for LSTM for time series prediction in Tensorflow如何在 Tensorflow 中拆分 LSTM 的训练数据和测试数据以进行时间序列预测
【发布时间】:2019-02-28 15:32:54
【问题描述】:

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

在他的教程中,他说:我们将使用以下函数创建一批从训练数据中随机挑选的较短子序列,而不是在近 30 万个观察的完整序列上训练递归神经网络。

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_train_scaledy_train_scaled,然后使用follow batch_generator 开始抽样几个batch size?

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

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

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,然后使用follow batch_generator 开始采样几个batch size?

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    您的数据集是间隔为 1 小时的一长串值。您的 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/

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-01-14
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-05
        • 2019-03-15
        • 2019-08-04
        • 2022-06-25
        相关资源
        最近更新 更多