微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么我的时间序列数据帧会限制我想在LSTM中使用的时间步数?

我需要帮助来了解如何精确地重塑LSTM的输入数据。首先,我的时间序列数据是熊猫数据框的形式:

enter image description here

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

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

问题2:对于X数据和y数据,我知道它们2D形状的数组值必须与3D形状的数组值匹配。因此,假设我将X_train数据重塑为(29084,1,7),并将X_test数据重塑为(7272,7)X_train.shape[0]的因子为1,2,4,7271,14542,and X_train.shape[0]X_test.shape[0]的因子为1,6,8,12,18,24,...,3636,and X_test.shape[0]。共同因素是1,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]

答案1:

不,您不必重塑y数据,因为它代表了整个模型的输出形状,而不是LSTM层的输出。但是,y数据的形状应与模型最后一层的输出相对应,这已经在您的代码中完成了。但是,如果将数据分成较小的批次,则y数据应反映出这一点。

答案2:

似乎数据的第一个维度,即36356是您的时间步维度。这意味着您有1个输入时间序列数据,其中36356个timstep记录每个都有7个功能。因此,要馈入RNN,您的形状应为(1,36356,7)。

此外,您可以将36356行分成较小的部分,这样可以增加批号-例如,64批568行,即形状变为(64,568,7)。但是,这还需要将y数据也分成较小的批次。

答案3:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。