Python 多变量时间序列的正确LSTM输入形状是什么?

Python 多变量时间序列的正确LSTM输入形状是什么?,python,keras,lstm,Python,Keras,Lstm,我有一个具有5个特性的多变量时间序列(5个独立的时间序列)。有了这5个特性,我想预测一个目标y,它也是一个时间序列。我在数据中有大约50000次观察 data # pandas dataframe >>> x1 x2 x3 x4 x5 y time 18:20:00 0.462 -0.248 -0.873 0.892 0.012 0.938

我有一个具有5个特性的多变量时间序列(5个独立的时间序列)。有了这5个特性,我想预测一个目标
y
,它也是一个时间序列。我在数据中有大约50000次观察

data  # pandas dataframe
>>>
            x1        x2        x3        x4        x5        y
time
18:20:00    0.462     -0.248   -0.873    0.892      0.012     0.938
18:21:00    0.621     -0.399   -0.772    0.891      0.008     0.922
18:22:00    0.726     -0.401   -0.771    0.899      0.009     0.910
... # 50,000 rows
我看到过多个不同的来源、博客和论文,它们在构建LSTM[]时使用的设置和体系结构都略有不同

我知道输入的形状必须是
[n\u样本、n\u时间步、n\u特征]
。我相信三个维度中的两个已经从我的数据中得到了回答<代码>n_样本=50000和
n_特征=5
,因为我有50k个样本和5个特征。维度
n_timesteps
是令人困惑的维度

如果我重塑数据,使输入LSTM的每个“样本”都具有重叠的时间观测值

import numpy as np

def reshape_data(data, n_steps):
    out = np.empty((data.shape[0] - n_steps + 1, n_steps, data.shape[1]))
    for i in range(data.shape[0] - n_steps + 1):
        out[i] = data[i: i + n_steps, :]
    return out

n_step = 10
reshaped_data = (data[["x1", "x2", "x3", "x4", "x5"]].values, n_step)
reshaped_data.shape
>>> (49991, 10, 5)

# target variable also needs to be truncated
# to match the shape and time index of `reshaped_data`
target = data["y"].values
target = target[n_step - 1:]
target.shape
>>> (49991,)
数据现在基本上是一个“3d张量”,或矩阵矩阵,其中每个矩阵包含10个时间观测值。矩阵1包含从时间
t0
到时间
t9
的观察值,然后矩阵2包含从时间
t1
到时间
t10
的观察值,依此类推,因此我们可以看到每个样本与最后一个样本有9个重叠的观察值。这些矩阵中的每一个都是给LSTM的样本-这些矩阵中有
n个样本
(在我们的示例中为49991个)现在
[n_样本、n_时间步、n_功能]=(49991、10、5)

我现在可以将上述数据输入LSTM

model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(reshaped_data.shape[1], reshaped_data.shape[2])))
model.add(Dropout(0.4))
model.add(LSTM(50, return_sequences=False))
model.add(Dropout(0.4))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(reshaped_data, target, epochs=50, batch_size=32, verbose=1, shuffle=False)
或者,我可以只取原始数据,并按如下方式对其进行处理,其中每个样本的观察结果在时间上没有重叠

reshaped_data = data[["x1", "x2", "x3", "x4", "x5"]].values
reshaped_data = reshaped_data.reshape((reshaped_data.shape[0], 1, reshaped_data[1]))
reshaped_data.shape
(50000, 1, 5)
现在我也可以把这些数据交给LSTM。在这种情况下,
[n_样本,n_时间步,n_特征]=(50000,1,5)
,因此每个样本在时间上只有一个观察值

这是我的困惑

  • 从以上两种重塑数据的方法中,哪一种是正确的?哪一个应该导致更好的结果(更高的准确性)?使用两种重塑方法训练LSTM时有什么区别
  • batch\u size
    如何使用上述任一数据重新存储方法进行培训

  • 当你说50000个样本时,你是指
    time
    列中的50000个条目吗?或者您是指50000个序列,每个序列在
    时间
    中具有不同的条目数?@SusmitAgrawal是时间列中的50000个条目/行。在这种情况下,
    n_timesteps
    是50000,因为您只有一个序列
    n_samples
    因此是1。数据的形状将是
    (1,50000,5)
    当您说50000个样本时,您是指
    时间
    列中的50000个条目吗?或者您是指50000个序列,每个序列在
    时间
    中具有不同的条目数?@SusmitAgrawal是时间列中的50000个条目/行。在这种情况下,
    n_timesteps
    是50000,因为您只有一个序列<因此,code>n_samples是1。数据的形状将是
    (1,50000,5)