如何整形多元数据以输入到LSTM

时间:2018-12-11 14:35:54

标签: python lstm

我要实现的目标。

我试图通过下表的多个输入参数来预测天然气的开盘价(“ NG开盘价”)。我遵循了一些教程,但是没有解释特定格式背后的原因。代码在经过多次试验和错误后仍然有效,但是需要对重新格式化数据有一定的了解。

数据集-仅几行。

Contract    NGLast   NGOpen NGHigh NGLow NGVolumes COOpen COHigh COLow
2018-12-01  4.487    4.50   4.60   4.03  100,000   56.00  58.00  50.00
2019-01-01  4.450    4.52   4.61   4.11  93000     51.00  53.00  45.00

代码

  import pandas as pd
  import numpy as np
  import matplotlib.pyplot as plt

  from keras.layers import Dense
  from keras.models import Sequential
  from keras.layers import LSTM
  import date time

  from keras import metrics
  from sklearn.preprocessing import MinMaxScaler

  data = pd.read_excel("C:\Futures\Futures.xls")

  data['Contract'] = pd.to_datetime(data['Contract'],unit='s').dt.date
  data['NG Last'] = data['NG Last'].str.rstrip('s')
  data['CO Last'] = data['CO Last'].str.rstrip('s')

  COHigh =  np.array([data.iloc[:,8]])
  COLow  =  np.array([data.iloc[:,9]])
  NGLast =  np.array([data.iloc[:,1]])
  NGOpen =  np.array([data.iloc[:,2]])
  NGHigh =  np.array([data.iloc[:,3]])

  X = np.concatenate([COHigh,COLow, NGLast,NGOpen], axis =0)
  X = np.transpose(X)
  Y = NGHigh
  Y = np.transpose(Y)
  scaler = MinMaxScaler()
  scaler.fit(X)
  X = scaler.transform(X)
  scaler.fit(Y)
  Y = scaler.transform(Y)

  **X = np.reshape(X,(X.shape[0],1,X.shape[1]))**
  print(X.shape)

  model = Sequential()
  **model.add(LSTM(100,activation='tanh',input_shape=(1,4),** recurrent_activation='hard_sigmoid'))
  model.add(Dense(1))

 model.compile(loss='mean_squared_error', optimizer='rmsprop', metrics = [metrics.mae])
 model.fit(X,Y,epochs = 10,batch_size=1,verbose=2)

 Predict = model.predict(X,verbose=1)

问题

上面astrix标记的代码背后的原因是什么?

1>我有四列作为输入,因此不应该是 X = np.reshape(X,(X.shape [0],1,X.shape [1],X.Shape [2 ],X.shape [3]))?对于所有视为输入的列,依此类推?

2>我需要在下面的这一行中解释参数。 model.add(LSTM(100,activation ='tanh',input_shape =(1,4), recurrent_activation ='hard_Sigmoid'))

1 个答案:

答案 0 :(得分:0)

  1. 您的数据当前是形状为(x,4)的数组,其中x是行数。因此,在您提供的玩具数据中,X.shape应该返回(2,4)。如果稍后再看LSTM行,您会注意到它正在寻找形状(1,4)的张量-这是input_shape参数。 np.reshape行是什么使您到达那里。它将2维数组转换为3维数组。同样,以您的示例为例,X.shape在重塑形状后将返回(2,1,4)。基本上,您现在有了一个长度为2的(1,4)数组的列表,该列表与LSTM层所需的匹配。

  2. 我建议您看一下Keras documentation on the LSTM,但是基本上这就是正在发生的事情。 100是此层将具有的单位(或神经元)数。输入形状已在上面注明。激活是将用于计算每个神经元输出的函数。 tanh功能在此基本设置中是非常标准的,但其他功能也是可能的。看看Keras开箱即用提供的activations列表。