首页 > 解决方案 > 不同时间步长的数据形状和 LSTM 输入

问题描述

对于我的硕士论文,我想使用 LSTM 模型预测未来一小时的股票价格。我的 X 数据包含 30.000 行,有 6 个维度(= 6 个特征),我的 Y 数据包含 30.000 行,只有 1 个维度(=目标变量)。对于我的第一个 LSTM 模型,我将 X 数据重新整形为 (30.000x1x6),将 Y 数据重新整形为 (30.000x1),并确定输入如下: input_nn = Input(shape=(1, 6))

如果我想增加时间步长,我不确定如何重塑数据并确定模型的输入形状。我仍然想预测下一小时的股价,但要包括更多以前的时间步长。我是否必须在第二维的 X 数据中添加以前时间步长的数据?

你能解释一下 LSTM 的单位数到底指的是什么吗?在我的情况下,它应该与时间步数相同吗?

标签: pythontensorflowkerasneural-networklstm

解决方案


您走在正确的轨道上,但将单位数与时间步长混淆了。是控制 LSTM 输出维度的units超参数。它是 LSTM 输出向量的维度,所以如果输入是(1,6)32 个单位,你将得到(32,),因为 LSTM 将遍历单个时间步并生成大小为 32 的向量。

时间步长是指您可以在 LSTM 中考虑的历史大小。所以它与单位完全不同。Keras 没有自己处理数据,而是有一个方便的TimeseriesGenerator,它将像您一样获取 2D 数据,并使用某个时间步长大小的滑动窗口来生成时间序列数据。从文档中:

from keras.preprocessing.sequence import TimeseriesGenerator
import numpy as np

data = np.array([[i] for i in range(50)])
targets = np.array([[i] for i in range(50)])

data_gen = TimeseriesGenerator(data, targets,
                               length=10, sampling_rate=2,
                               batch_size=2)
assert len(data_gen) == 20

batch_0 = data_gen[0]
x, y = batch_0
assert np.array_equal(x,
                      np.array([[[0], [2], [4], [6], [8]],
                                [[1], [3], [5], [7], [9]]]))
assert np.array_equal(y,
                      np.array([[10], [11]]))

您可以使用目录来model.fit_generator(data_gen,...)选择尝试不同的采样率、时间步长等。您可能应该研究这些参数以及它们如何影响论文中的结果。


推荐阅读