单个/多个时间步长预测多行{1}

时间:2017-10-16 12:44:01

标签: python-3.x time-series keras lstm forecasting

我有250天的数据,72个训练样本的特征和一列目标变量。并希望预测未来30天的21351行每个具有72个功能。我将如何重塑输入和输出的数据。似乎我有点混乱,图书馆给我一个关于形状不兼容的错误。

我正在重塑:

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

trainY.reshape(1, len(trainX))

但是给我错误:

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

同样的错误:

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

trainY.reshape(len(trainX), )

和同样的错误:

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

trainY.reshape(len(trainX), 1)

目前,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]]])

trainY改编为:

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

array([[-0.7238661 ],

       [-0.43128777],

       [-0.31542821],

       [-0.35185375],

       ...,

       [-0.28319519],

       [-0.28740503],

       [-0.24209411],

       [-0.3202021 ]])

和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]]])

,错误是:

ValueError:检查时出错:预期lstm_25_input具有形状(无,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)
        

ValueError Traceback(最近一次调用   最后)in()        43 model.compile(loss =' mse',optimizer =' adam')        44   ---> 45 model.fit(exog,endog,epochs = 50,shuffle = False,verbose = 1)        46        47 start_date = endog_end + timedelta(days = 1)

     

D:\ AnacondaIDE \ lib \ site-packages \ keras \ models.py in fit(self,x,y,   batch_size,epochs,verbose,callbacks,validation_split,   validation_data,shuffle,class_weight,sample_weight,initial_epoch,   ** kwargs)       865 class_weight = class_weight,       866 sample_weight = sample_weight,    - > 867 initial_epoch = initial_epoch)       868       869 def evaluate(self,x,y,batch_size = 32,verbose = 1,

     

D:\ AnacondaIDE \ lib \ site-packages \ keras \ engine \ training.py in fit(self,   x,y,batch_size,epochs,verbose,callbacks,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 do_validation = False

     

D:\ AnacondaIDE \ lib \ site-packages \ keras \ engine \ training.py in   _standardize_user_data(self,x,y,sample_weight,class_weight,check_batch_axis,batch_size)1376
  self._feed_input_shapes,1377
  check_batch_axis =假    - > 1378 exception_prefix ='输入')1379 y = _standardize_input_data(y,self._feed_output_names,
  1380 output_shapes,

     

D:\ AnacondaIDE \ lib \ site-packages \ keras \ engine \ training.py in   _standardize_input_data(数据,名称,形状,check_batch_axis,exception_prefix)       142'有形状' + str(shapes [i])+       143'但得到了阵型' +    - > 144 str(array.shape))       145个返回数组       146

     

ValueError:检查输入时出错:预期lstm_31_input有   形状(无,250,72),但有阵列形状(21351,1,72)

编辑2:

从@Paddy尝试更新后的解决方案后,我在调用predict()时遇到了这个错误:

        

ValueError Traceback(最近一次调用   最后)in()         1个模型= load_model(' model_lstm.h5')         2   ----> 3预测= model.predict(exog_test,verbose = 0)         4#表示范围内的x(0,len(exog_test)):

     

D:\ AnacondaIDE \ lib \ site-packages \ keras \ models.py in predict(self,x,   batch_size,详细)       911如果不是self.built:       912 self.build()    - > 913返回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 in   预测(self,x,batch_size,verbose,steps)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 in   _standardize_input_data(数据,名称,形状,check_batch_axis,exception_prefix)       130'拥有' + str(len(shapes [i]))+       131'尺寸,但有形状阵列' +    - > 132 str(array.shape))       133中的j,(dim,ref_dim)枚举(zip(array.shape,shapes [i])):       134如果不是j而不是check_batch_axis:

     

ValueError:检查时出错:预期lstm_64_input为3   尺寸,但有形状的阵列(2895067,72)

2 个答案:

答案 0 :(得分:1)

尝试重塑:

cellItems

但是,一般来说,您有两种方法,可以重塑输入数据或更改模型参数。

请查看错误消息,它在这里说明了一切!

好的,这是您的代码的更新:

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

trainY.reshape(len(trainX), 1)

答案 1 :(得分: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])

你想:

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])

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