为什么我的时间序列数据框限制了我想在我的 LSTM 中使用的时间步数?

Why does my time series data frame restrict the number of time steps I'd like to use in my LSTM?

我需要帮助来了解我被允许为我的 LSTM 重塑输入数据的确切程度。首先,我的时间序列数据是 Pandas 数据框的形式:

它具有以下形状:(36356, 9)。我将我的数据框分成训练集和测试集,如下所示:X_train.shape = (29084, 7)X_test.shape = (7272, 7)y_train.shape = (29084,)y_test.shape = (7272,).

问题 1:我知道我必须将 2D X 数据重塑为 3D,如 (samples/rows, timesteps, features)。但是我是否也必须将 y 数据重塑为 3D?

问题2:对于X数据和Y数据,我知道它们的2D形状的数组值必须与它们的3D形状的数组值匹配。因此,假设我将 X_train 数据重塑为 (29084, 1, 7),将 X_test 数据重塑为 (7272, 1, 7)X_train.shape[0] 的因数是 1, 2, 4, 7271, 14542, and X_train.shape[0]X_test.shape[0] 的因子是 1, 2, 4, 6, 8, 12, 18, 24, ..., 3636, and X_test.shape[0]。公因数是1, 2, and 4。所以我的数据集只允许我有可能的时间步长 1、2 和 4,对吗?也就是说,我必须重塑 X_train.shape[0] 和 X_test.shape[0] 以除以相同的时间步数,正确。对于 y_train.shape[0] 和 y_test.shape[0]?

也是如此

问题 3:如果我可以有更大的时间步长,我还能如何重塑 X 数据和 y 数据?

如果有帮助,我的LSTM构造如下:

batch_size = X_train.shape[0]
model = Sequential()
model.add(Bidirectional(LSTM(32, return_sequences = True, stateful = False), 
                                        input_shape = (X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(Bidirectional(LSTM(16, return_sequences = True)))
model.add(Dropout(0.2))
model.add(Dense(1, activation = 'sigmoid'))
es = EarlyStopping(monitor = 'val_loss', patience = 3)
                  
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['Recall'])
                  
model.fit(X_train, y_train, batch_size = batch_size, epochs = 360, verbose = 0, 
                          callbacks = [es], validation_data = (X_test, y_test), shuffle = True)

感谢您的帮助。

Keras LSTM 输入形状(Doc):

inputs: A 3D tensor with shape [batch, timesteps, feature]

答案一:

不,您不必重塑 y-data,因为它代表整个模型的输出形状,而不是 LSTM 层的输出。然而, y-data 的形状应该对应于模型最后一层的输出,从你的代码中它已经做到了。但是,如果您将数据分成较小的批次,您的 y-data 应该反映出来。

答案二:

您的数据似乎是第一个维度,即 36356 是您的时间步长维度。这意味着您有 1 个输入时间序列数据,其中包含 36356 个时间步记录,每个记录具有 7 个特征。所以要输入 RNN,你的形状应该是 (1, 36356, 7).

此外,您可以将 36356 行分解成更小的部分,这样您就可以增加批号 - 例如,64 批 568 行,即形状变为 (64, 568, 7)。然而,这也需要您将 y-data 分成更小的批次。

答案3:

您可以将当前的 2D 数组包裹在另一个数组中,使其成为 3D,即 (1, 36356, 7)。