Kera LSTM输入与输出如何对应

时间:2019-01-14 12:16:21

标签: python-3.x keras lstm

我试图借助投资者的情绪和先前的股价来预测股价。

数据帧头如下:

time_p               close    sent_sum  output
2007-01-03 10:00:00  10.837820  0.4   10.6838
2007-01-03 11:00:00  10.849175  0.6   10.8062
2007-01-03 12:00:00  10.823942 -0.3   10.7898
2007-01-03 13:00:00  10.810063 -0.2   10.7747
2007-01-03 14:00:00  10.680111  0.1   10.7078

我如何预处理数据?

在df上方包含股票数据,其中time_p是每小时的日期时间(不包括在模型中),其对应于最低收盘价closesent_sum是发票人的情绪,output对于模型是labelsoutputdf.output.shitf(-8)进行了上移换字,换句话说,我想根据 -7小时来预测 +1小时。强劲> close(价格)加上 -7小时 sent_sum(投资者常识)。

  

我正在尝试拟合这样的模型:

import tensorflow as tf
from pandas_datareader import data
import urllib.request, json
from sklearn.preprocessing import MinMaxScaler
from sklearn import metrics
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.recurrent import LSTM
from keras import optimizers
import math
import keras as k
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv('AAPL_final.csv')
raw= data.iloc[:,[2,3]].values
raw2= data.iloc[:,[4]].values
#############scalling fo data######
scaler = MinMaxScaler(feature_range=(-1, 1))
scaler_y = MinMaxScaler(feature_range=(-1, 1))
scaled_x = scaler.fit_transform(raw)
scaled_y = scaler_y.fit_transform(raw2)
########tran test set##############

train= scaled_x[:14000].reshape(2000,7,2) # Train_X data
train_= scaled_y[:14000].reshape(2000,7,1) #train_Y
test_xdata= scaled_x[14000:17542].reshape(506,7,2)# Test_x
test_ydata= scaled_y[14000:17542].reshape(506,7,1)#Test_y 
train_x,train_y=  train, train_
test_x, test_y = test_xdata, test_ydata

print('shapes of tranx,teainy,testx and testy',train_x.shape, train_y.shape, test_x.shape, test_y.shape)
model = Sequential()
model.add(LSTM(100,input_shape=(7,2),return_sequences=True))
model.add(Dropout(0.1))
model.add(LSTM(100,return_sequences=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='sgd',metrics=['accuracy', 'mae', 'mape', 'cosine'])#sgd#rmsprop
  

我的问题:我怀疑,一旦我将标签数据在未来一段时间内以-7点四舍五入的方式将当前输入与+7小时相匹配,就可以写{{1 }}中的train_= scaled_y[:14000].reshape(2000,7,1) #train_Y中,或者我在做些狼吞虎咽。

     
      
  • 第二,我对keras_lstm如何将输入与标签匹配感到困惑,我的意思是input_shape实际如何工作?
  •   
  • 是否有任何适合此模型的好方法?请提出建议。   感谢您的帮助。
  •   

1 个答案:

答案 0 :(得分:1)

您可以在scaled_xscaled_y

上执行以下操作

我使用玩具数据集演示了一个示例,这里的数据和标签最初是使用((150,4),(150,))形状的,使用以下脚本:

seq_length = 10
dataX = []
dataY = []
for i in range(0, 150 - seq_length, 1):
    dataX.append(data[i:i+seq_length])
    dataY.append(labels[i+seq_length-1])
import numpy as np
dataX = np.reshape(dataX, (-1, seq_length, 4))
dataY = np.reshape(dataY, (-1, 1))
# dataX.shape, dataY.shape

Output: ((140, 10, 4), (140, 1))

像本示例一样,您可以使用7天数据创建序列,并以第二天为目标。

Keras LSTM层期望输入为3暗(batch_size,seq_length,input_dims),

input_dims = # an integer
seq_length = #an integer
model = Sequential()
model.add(LSTM(128, activation='relu', input_shape=(seq_length, input_dims), return_sequences=True))

注意:batch_size未用于定义图层,模型将在fit时填充自身。