Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的时间序列数据框会限制时间步数I';我想在我的LSTM中使用?_Python_Pandas_Keras_Lstm_Reshape - Fatal编程技术网

Python 为什么我的时间序列数据框会限制时间步数I';我想在我的LSTM中使用?

Python 为什么我的时间序列数据框会限制时间步数I';我想在我的LSTM中使用?,python,pandas,keras,lstm,reshape,Python,Pandas,Keras,Lstm,Reshape,我需要帮助了解如何准确地允许我为我的LSTM重塑输入数据。首先,我的时间序列数据采用熊猫数据框的形式: 它的形状如下:(36356,9)。我将我的数据帧分割成如下列的训练集和测试集:X_train.shape=(29084,7),X_test.shape=(7272,7),y_train.shape=(29084,)和y_test.shape=(7272,) 问题1:我知道我必须按照(样本/行、时间步、特征)将2D X数据重新塑造为3D。但我是否也必须将y数据重塑为3D 问题2:对于X数据和y

我需要帮助了解如何准确地允许我为我的LSTM重塑输入数据。首先,我的时间序列数据采用熊猫数据框的形式:

它的形状如下:
(36356,9)
。我将我的数据帧分割成如下列的训练集和测试集:
X_train.shape=(29084,7)
X_test.shape=(7272,7)
y_train.shape=(29084,)
y_test.shape=(7272,)

问题1:我知道我必须按照
(样本/行、时间步、特征)
将2D X数据重新塑造为3D。但我是否也必须将y数据重塑为3D

问题2:对于X数据和y数据,我知道其2D形状的数组值必须与其3D形状的数组值匹配。因此,假设我将我的X_序列数据重塑为
(29084,1,7)
,将我的X_测试数据重塑为
(7272,1,7)
X\u-train.shape[0]
的系数为
1、2、4、7271、14542和X\u-train.shape[0]
X_检验形状[0]
的因子为
1、2、4、6、8、12、18、24、…、3636和X_检验形状[0]
。共同因素是
1、2和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输入形状():

答案1:

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

答案2:


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


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

答案3:


您可以将当前的二维数组包装到另一个数组中,使其成为三维数组,即(136356,7)。

数据中的时间步长是多少?将x_列重塑为(批次,1,7)意味着时间步长=1,这对RNN没有用处。我建议查看数据并了解随时间变化的值是什么?我的时间序列数据是按分钟索引的,这意味着数据帧中的每一行都以分钟分隔。此外,这是一个二元分类问题,在这个问题中,我使用数据来预测设备每分钟是开着还是关着。我现在已经在上面添加了原始数据帧。它似乎是数据的第一个维度,即36356是您的时间步长维度。这意味着您有1个输入数据,其中36356个timstep记录,每个记录有7个特征。因此,要输入RNN,您的形状应该是(136356,7),此外,您可以将36356行分解为更小的部分,这样您可以增加批次号-例如,64批568行,即形状变成(64568,7)。谢谢!你帮了大忙。为了澄清我在最后一刻提出的一些问题:我的X_火车最初的形状是(29084,7);因此,我应该将其重塑为(129084,7);我的X_测试最初的形状是(7272,7);所以我应该改成(17272,7),对吗?同样,我的y_列应该保持其原始形状(29084,1),我的y_测试应该保持其原始形状(7272,1),因为我的输出层是稠密的(1),对吗?当然,如果我要包括批次,我必须相应地更改。是的,你所有的问题都是正确的。您可以使用
np.expand_dims()
method.Darn重塑数组的形状。我得到了以下错误:-------------------------------------------------------------ValueError Traceback(最近一次调用last)in 15#Fitting the model 16 history=model.fit(X_train,y_train,epochs=360,verbose=2,-->17次回调=[es],validation_data=(X_test,y_test),shuffle=True)ValueError:输入数组应具有与目标数组相同的样本数。找到1个输入样本和27932个目标样本。要跟进我之前对错误的评论,我的X_序列成形(127932,7),我的X_测试成形(16984,7),我的y_序列成形(27932,1),我的y_测试成形(6984,1)。但错误似乎指向了这样一个事实,即这些形状不正确。我的错。您还需要更改Y数据。对于模型,它得到1批数据作为输入,但对于输出,它认为它得到7272批数据。您还应该将Y数据包装到另一个数组中。对不起:(
inputs: A 3D tensor with shape [batch, timesteps, feature]