预测单个/多个时间步长的多行 lstm

Faw*_*lil 5 time-series forecasting python-3.x lstm keras

我有 250 天的数据、72 个训练样本特征和一列目标变量。并希望预测 21351 行中每一行的未来 30 天的情况,其中包含 72 个特征。我将如何重塑我的数据输入和输出。看来我有点困惑,图书馆给了我关于形状不兼容的错误。

我正在重塑为:

trainX.reshape(1, len(trainX), trainX.shape[1])

trainY.reshape(1, len(trainX))
Run Code Online (Sandbox Code Playgroud)

但给我错误:

ValueError:输入数组应具有与目标数组相同数量的样本。找到 1 个输入样本和 250 个目标样本。

同样的错误:

trainX.reshape(1, len(trainX), trainX.shape[1])

trainY.reshape(len(trainX), )
Run Code Online (Sandbox Code Playgroud)

和同样的错误:

trainX.reshape(1, len(trainX), trainX.shape[1])

trainY.reshape(len(trainX), 1)
Run Code Online (Sandbox Code Playgroud)

目前,trainX 被重塑为:

trainX.reshape(trainX.shape[0], 1, trainX.shape[1])

array([[[  4.49027601e+00,  -3.71848297e-01,  -3.71848297e-01, ...,
           1.06175239e+17,   1.24734085e+06,   5.16668131e+00]],

       [[  2.05921386e+00,  -3.71848297e-01,  -3.71848297e-01, ...,
           8.44426594e+17,   1.39098642e+06,   4.01803817e+00]],

       [[  9.25515792e+00,  -3.71848297e-01,  -3.71848297e-01, ...,
           4.08800518e+17,   1.24441013e+06,   3.69129399e+00]],

       ..., 
       [[  3.80037999e+00,  -3.71848297e-01,  -3.71848297e-01, ...,
           1.35414902e+18,   1.23823291e+06,   3.54601899e+00]],

       [[  3.73994822e+00,  -3.71848297e-01,   8.40698741e+00, ...,
           3.93863169e+17,   1.25693299e+06,   3.29993440e+00]],

       [[  3.56843035e+00,  -3.71848297e-01,   1.53710656e+00, ...,
           3.28306336e+17,   1.22667253e+06,   3.36569960e+00]]])
Run Code Online (Sandbox Code Playgroud)

trainY 重塑为:

trainY.reshape(trainY.shape[0], )

array([[-0.7238661 ],

       [-0.43128777],

       [-0.31542821],

       [-0.35185375],

       ...,

       [-0.28319519],

       [-0.28740503],

       [-0.24209411],

       [-0.3202021 ]])
Run Code Online (Sandbox Code Playgroud)

并将 testX 重塑为:

testX.reshape(1, testX.shape[0], testX.shape[1])

array([[[ -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01, ...,
          -3.71848297e-01,   2.73982042e+06,  -3.71848297e-01],

        [ -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01, ...,
          -3.71848297e-01,   2.73982042e+06,  -3.71848297e-01],

        [ -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01, ...,
           2.00988794e+18,   1.05992636e+06,   2.49920150e+01],

       ..., 

        [ -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01, ...,
          -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01],

        [ -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01, ...,
          -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01],

        [ -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01, ...,
          -3.71848297e-01,  -3.71848297e-01,  -3.71848297e-01]]])
Run Code Online (Sandbox Code Playgroud)

错误是:

ValueError:检查时出错:预期 lstm_25_input 具有形状 (None, 1, 72),但得到的数组具有形状 (1, 2895067, 72)

编辑1:

这是我的模型的代码:

trainX = trainX.reshape(trainX.shape[0], 1, trainX.shape[1])
trainY = trainY.reshape(trainY.shape[0], )
testX = testX.reshape(1, testX.shape[0], testX.shape[1])

model = Sequential()

model.add(LSTM(100, return_sequences=True, input_shape = trainX.shape[0], trainX.shape[2])))
model.add(LSTM(100))
model.add(Dense(1, activation='linear'))

model.compile(loss='mse', optimizer='adam')

model.fit(trainX, trainY, epochs=500, shuffle=False, verbose=1)

model.save('model_lstm.h5')

model = load_model('model_lstm.h5')

prediction = model.predict(testX, verbose=0)
Run Code Online (Sandbox Code Playgroud)

() 中的 ValueError Traceback (最近一次调用最后) 43 model.compile(loss='mse', optimizationr='adam') 44 ---> 45 model.fit(exog, endog, epochs=50, shuffle=False,详细 = 1) 46 47 start_date = endog_end + timedelta(天 = 1)

D:\ AnacondaIDE \ lib \ site-packages \ keras \ models.py in fit(self,x,y,batch_size,纪元,详细,回调,validation_split,validation_data,shuffle,class_weight,sample_weight,initial_epoch,** kwargs)865 class_weight=class_weight,866sample_weight=sample_weight,-->867initial_epoch=initial_epoch)868869def评估(自我,x,y,batch_size=32,verbose=1,

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py 中的 fit(self, x, y, batch_size, epochs, verbose, 回调,validation_split,validation_data,shuffle,class_weight,sample_weight,initial_epoch,steps_per_epoch,validation_steps , **kwargs) 1520
class_weight=class_weight, 1521 check_batch_axis=False, -> 1522 batch_size=batch_size) 1523 # 准备验证数据。第1524章

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py 在 _standardize_user_data(self, x, y, Sample_weight, class_weight, check_batch_axis, batch_size) 1376
self._feed_input_shapes, 1377
check_batch_axis=False, -> 1378 exception_prefix=第1379章 1380、第
1380章

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py in _standardize_input_data(data, names, Shapes, check_batch_axis, exception_prefix) 142 ' 具有形状 ' + str(shapes[i]) + 143 ' 但得到形状为 ' + --> 144 str(array.shape)) 145 返回数组 146

ValueError:检查输入时出错:预期 lstm_31_input 具有形状 (None, 250, 72),但得到的数组具有形状 (21351, 1, 72)

编辑2:

在尝试了 @Paddy 的更新解决方案后,我在调用 Predict() 时收到此错误:


ValueError Traceback (最近一次调用最后一次) in () 1 model = load_model('model_lstm.h5') 2 ----> 3 Prediction = model.predict(exog_test, verbose=0) 4 # for x in range(0,长度(exog_test)):

D:\AnacondaIDE\lib\site-packages\keras\models.py in Predict(self, x, batch_size, verbose) 911 如果不是 self.built: 912 self.build() --> 913 return self.model.predict (x,batch_size=batch_size,verbose=verbose) 914 915 def Predict_on_batch(self, x):

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py 在预测(自我,x,batch_size,详细,步骤)1693 x = _standardize_input_data(x,self._feed_input_names,1694 self._feed_input_shapes, - > 1695 check_batch_axis = False)1696如果self.stateful:1697如果x [0] .shape [0]>batch_size并且x [0] .shape [0]%batch_size!= 0:

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py 中 _standardize_input_data(data、names、shapes、check_batch_axis、Exception_prefix) 130 ' 具有 ' + str(len(shapes[i])) + 131 '尺寸,但得到形状为 ' + --> 132 str(array.shape)) 133 for j, (dim, ref_dim) in enumerate(zip(array.shape, Shapes[i])): 134 if not j and不是 check_batch_axis:

ValueError:检查时出错:预期 lstm_64_input 有 3 个维度,但得到的数组具有形状 (2895067, 72)

Jun*_*ter 2

你有:

trainX = trainX.reshape(trainX.shape[0], 1, trainX.shape[1])
trainY = trainY.reshape(trainY.shape[0], )
testX = testX.reshape(1, testX.shape[0], testX.shape[1])
Run Code Online (Sandbox Code Playgroud)

你要:

trainX = trainX.reshape(trainX.shape[0], 1, trainX.shape[1])
trainY = trainY.reshape(trainY.shape[0], )
testX = testX.reshape(testX.shape[0],1, testX.shape[1])
Run Code Online (Sandbox Code Playgroud)

您在 testX 中混淆了样本和时间步长维度