多变量时间序列预测模型(lstm多变量多类型预测)

朋友们多次建议我用大数据人工智能来研究金融股票,但由于我的技术有限,我从来没有想过。这两天突然想到LSTM是不是很适合做股票预测。通过在线学习还是有真实案例的。

适合多输入变量的神经网络模型一直是令开发者头疼的问题,但基于LSTM的循环神经网络几乎可以完美解决多输入变量的问题。基于LSTM的循环神经网络可以很好地应用于时间序列预测。

多变量时间序列预测模型(lstm多变量多类型预测)

长短期记忆递归神经网络几乎可以完美地模拟多输入变量的问题,这给时间序列预测带来了巨大的好处。本文介绍如何在Keras深度学习库中构建用于多元时间序列预测的LSTM模型。

因为市场上总会有黑天鹅事件发生,比如股市崩盘,这种非正常事件很难预测。本文仅适合学习人工智能技术练习。“当你进入股市时,趋势就会发生变化。”

Keras是一个高度封装的神经网络框架,提供参数化的API。Keras采用纯Python编写,基于Tensorflow、Theano和CNTK后端。Keras生来就是为了支持快速实验,能够快速将您的想法转化为结果。

关于LSTM

LSTM算法的全称是长短期记忆网络。由于LSTM算法是在RNN算法的基础上改进的,它是一种特殊的RNN网络,避免了标准RNN中梯度爆炸和梯度消失的问题,并且该网络旨在解决长期依赖问题。该网络由HochreiterSchmidhuber()提出,并被许多人改进和普及。他们的工作被用来解决各种问题,并且至今仍被广泛使用。

多层LSTM只是堆叠单个单元。为什么LSTM模型比CNN更难理解?因为它隐藏了细胞中神经元的数量。通过对比CNN,你对上图有什么感受吗?一个细胞实际上是一层神经元,但LSTM和CNN的区别在于,每一层在t时刻的输出与t-1时刻的状态相关。也就是说,当前cell的输出ht不仅影响下一个cell,还会影响下一时刻这个cell的状态和输出图片)。

明白了这一点,我们也自然明白xt可以是多维的。然后可以设置每个单元格的hidden_size。

数据来源来自这里。

LSTM多元时间序列股票预测"'创建于年4月5日@author:xiaoyw"'importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspdfromsklearn.preprocessingimportMinMaxScalerfromkeras.modelsimportSequential#Sequential用于初始化神经网络fromkeras.layersimportDense#Dense用于添加全连接神经网络层fromkeras.layersimportLSTM#LSTM用于添加长短期记忆层fromkeras.layersimportDropout#Dropout用于添加dropout防止过度拟合。Layer#构建训练数据deftrain_data():dataset_train=pd.read_csv('NSE-TATAGLOBAL.csv')training_set=dataset_train.iloc[:1:7].valuesdataset_train.head()sc=MinMaxScaler(feature_range=(0,1))Training_set_scaled=sc.fit_transform(training_set)X_train=[]y_train=[]foriinrange(60,):])X_train,y_train=np.array(X_train),np.array(y_train)X_train=np.reshape(X_train,(X_train.shape[0],X_train.shape[1],6))return,dataset_train,sc#构造测试数据deftest_data(dataset_train,sc):dataset_test=pd.read_csv('tatatest.csv')real_stock_price=dataset_test.iloc[:1:2].values#合并训练集和测试集dataset_total=pd.concat((dataset_train,dataset_test),axis=0)db_all=dataset_total.iloc[:1:7].values输入=db_all[len(dataset_total)len(dataset_test)60:]输入=input.reshape(-1,6)输入=sc.transform(inputs)X_test=[]foriin范围(60,76):)X_test=np.array(X_test)X_test=np.reshape(X_test,(X_test.shape[0],X_test.shape[1],6))return):回归器=Sequential()#LSTM的输入是[samples,timesteps,features],其中timesteps是步数,features是维度。我们这里的数据是一个6维regressor.add(LSTM(units=50,return_sequences=True,input_shape=(X_train.shape[1],6)))regressor.add(Dropout(0.2))regressor.add(LSTM)regressor.add)regressor.add)regressor.add)regressor.add=50))regressor.add(Dropout(0.2))#全连接,输出6regressor.add(Dense(units=6))regressor.compile(optimizer='adam',loss='mean_squared_error')regressor.fit(X_train,y_train,epochs=100,batch_size=32)returnregressordefmain():X_train,y_train,dataset_train,sc=train_data()回归器=stock_model(X_train,y_train)color='black',label='TATA股票价格')#显示开盘价plt.plot(predicted_stock_price[:0],color='green',label='预测TATA股票价格')plt.title('TATA股票价格预测')plt.xlabel('时间')plt.ylabel('塔塔股票价格')plt.legend()plt.show()if__name__=='__main__':main()

参考源码是单变量预测,效果如下左图。转化为文本代码,是多变量输入,多维度输出。预测效果如下右图所示。

关于本文的技术和代码解析,请关注后续内容分享。

如何用Keras调试LSTM超参数解决时间序列预测问题

只需使用abcd作为示例。abcd的每一步都会计算loss,所以拆开是没有用的。另外,你的不是序列标签,因为你想要预测下一个,而不是给出最好的整体结果。顺序

如何在Python中用LSTM网络进行时间序列预测

时间序列模型

时间序列预测分析是利用过去一段时间事件的时间特征来预测未来一段时间事件的特征。这是一个相对复杂的预测建模问题。与回归分析模型的预测不同,时间序列模型取决于事件发生的顺序。当输入模型改变时,相同大小的值改变顺序会产生不同的结果。

例如:根据某只股票近两年的每日股价数据,预测未来一周的股价变化;根据过去两年每周想要到某家商店购物的人数,预测下周会来该商店的人数等。

RNN和LSTM模型

时间序列模型最常用和最强大的工具是循环神经网络。与普通神经网络计算结果独立的特点相比,RNN的每个隐含层计算结果都与当前输入和前一个隐含层结果相关。通过这种方法,RNN的计算结果具有记忆先前结果的特点。

典型的RNN网络结构如下:

右侧是为了便于计算时理解和记忆而创建的结构。简单来说,x为输入层,o为输出层,s为隐藏层,t为计算次数;V、W、U为权重,其中第t个隐藏层状态的计算为St=f(U*Xt+W*St-1),达到将当前输入结果与之前计算联系起来的目的。如果你想了解更多关于RNN的信息,可以点击这里。

RNN的局限性:

如果RNN模型需要实现长期记忆,则需要将当前隐藏状态的计算与之前的n次计算联系起来,即St=f(U*Xt+W1*St-1+W2*St-2+…+Wn*St-n),这种情况下计算量会呈指数级增长,导致模型训练时间显着增加。因此,RNN模型一般直接用于长期记忆计算。

LSTM模型

LSTM模型是RNN的一种变体,由JuergenSchmidhuber首先提出。经典LSTM模型的结构如下:

LSTM的特点是在RNN结构中添加了各层的阀节点。阀有三种类型:遗忘门、输入门和输出门。这些阀门可以打开或关闭,用于判断该层输出中模型网络的记忆状态是否达到阈值,从而添加到当前层的计算中。如图所示,阀门节点使用sigmoid函数计算网络的记忆状态作为输入;如果输出结果达到阈值,则将阀门输出与当前层的计算结果相乘,作为下一层的输入;如果未达到阈值,则输出结果被遗忘。每层的权重在每个模型反向传播训练过程中都会更新。更具体的LSTM判断计算流程如下图所示:

LSTM模型的记忆功能就是由这些阀门节点来实现的。当阀门打开时,之前模型的训练结果会与当前模型计算相关联,而当阀门关闭时,之前的计算结果将不再影响当前计算。因此,通过调节阀门的开闭,我们可以认识到早期顺序对最终结果的影响。而当你不希望之前的结果对未来产生影响时,比如开始分析自然语言处理中的新段落或新章节,那么只需关闭阀门即可。

下图具体展示了阀门的工作原理:通过阀门控制,序列1中的输入变量影响序列4和6中变量的计算结果。

实心黑圈表示该节点的计算结果输出到下一层或下一次计算;空心圆圈表示该节点的计算结果没有输入到网络中或者没有收到前一次的信号。

用Python实现LSTM模型构建

Python中有很多包可以直接调用构建LSTM模型,比如pybrain、kears、tensorflow、cikit-neuralnetwork等。这里我们选择keras。

由于LSTM神经网络模型的训练可以通过调整很多参数来优化,如激活函数、LSTM层数、输入输出变量维度等,因此调整过程相当复杂。这里仅举一个最简单的应用例子来描述LSTM的构建过程。

应用领域

根据顾客在某店铺的历史消费时间,预估顾客下次光临该店铺的时间。具体数据如下:

消费时间

-05-:03:-05-:32:-06-:00:-07-:27:-07-:04:-09-:59:56.

.

具体操作:

1.原始数据转换

首先,时间点数据需要数字化。常见的方法是将具体时间转换为时间段来表示用户连续两次购买之间的时间间隔,然后导入模型进行训练。转换后的数据如下:

消费区间.

.

2.生成模型训练数据集

这里的窗口是指需要多少个消费区间才能预测下一个消费区间。这里我们首先使用窗口长度为3,即使用t-2、t-1、t个消耗区间来训练模型,然后使用t+1个区间来验证结果。数据集的格式如下:X是训练数据,Y是验证数据。

PS:这里说“确定”不太合适,因为窗口长度需要根据模型验证结果进行调整。

X1X2X3Y.

.

注:一般情况下,直接预测的准确性会较差。最好将预测值Y按照数值分到几类,然后转换成one-hotlabels进行训练。例如,如果将Y按照数值范围分为五类,则上式可以转化为:

X1X2X3Y…

Y转为one-hot后

3、网络模型结构的确定与调整

这里我们使用python的keras库。。网络的训练过程旨在调整很多参数:比如

需要确定LSTM模块的激活函数;

确定接收LSTM输出的全连接人工神经网络的激活函数;

确定每层网络节点的丢弃率,这里我们设置默认值为0.2;

确定如何计算误差。这里我们使用均方误差;

确定权重参数的迭代更新方法。这里我们使用RMSprop算法,该算法通常在RNN网络中使用。

确定模型训练的epoch和batchsize

一般来说,LSTM模块的层数越多,对于高层时间表示的学习能力越强;同时最后还会添加一层普通的神经网络。网络层用于降低输出结果的维度。典型的结构如下:

如果需要在同一个模型上训练多个序列,可以将序列输入到独立的LSTM模块,并将输出结果组合起来输入到普通层。结构如下:

4.模型训练和结果预测

将上述数据集以4:1的比例随机分为训练集和验证集,以防止过拟合。训练模型。然后将数据的X列作为参数导入到模型中,得到预测值,与实际的Y值进行比较,得到模型的好坏。

实现代码

将时间间隔序列格式化为所需的训练集格式

将pandas导入为pdimportnumpyasnpdefcreate_interval_dataset:

''':paramdataset:输入时间间隔数组:paramLook_back:每个训练集特征长度:return:将值数组转换为数据集矩阵。'''

dataX,dataY=[],[]foriinrange(len(dataset)Look_back):

dataX.append(数据集[i:i+look_back])

dataY.append(dataset[i+look_back])返回np.asarray(dataX),np.asarray(dataY)

df=pd.read_csv('时间间隔文件路径')

dataset_init=np.asarray(df)#如果只有1列dataX,dataY=create_interval_dataset(dataset,Lookback=3)#回溯是否训练集序列长度

这里的输入数据源是csv文件。如果输入数据来自数据库,可以参考这里。

LSTM网络结构搭建

导入pandas作为pd导入numpy作为np导入随机从keras.models导入顺序,model_from_json从keras.layers导入密集,LSTM,DropoutclassNeuralNetwork:

def__init__(self,**kwargs):

''':param**kwargs:output_dim=4:LSTM层的输出维度;activation_lstm=tanh:LSTM层的激活函数;activation_dense=relu:Dense层的激活函数;activation_last=sigmoid:最后一层的激活函数;drop_out=0.2:要删除的输入单位的分数;np_epoch=10,训练模型的纪元数。epoch是所有训练样例的一次前向传播和一次反向传播;batch_size=32:每次梯度更新的样本数。批量大小越大,需要的内存空间就越大;loss=mean_square_error:损失函数;优化器=rmsprop'''

self.output_dim=kwargs.get(output_dim,8)self.activation_lstm=kwargs.get(activation_lstm,relu)self.activation_dense=kwargs.get(activation_dense,relu)self.activation_last=kwargs.get(activation_last,softmax)#softmax用于多个输出

self.dense_layer=kwargs.get(dense_layer,2)#至少2层

self.lstm_layer=kwargs.get(lstm_layer,2)self.drop_out=kwargs.get(drop_out,0.2)self.nb_epoch=kwargs.get(nb_epoch,10)self.batch_size=kwargs.get(batch_size,100)self.损失=kwargs.getself.optimizer=kwargs.getdefNN_model:

''':paramtrainX:训练数据集:paramtrainY:训练数据的期望值:paramtestX:测试数据集:paramtestY:测试数据的期望值:return:训练后的模型'''

print'训练模型是LSTM网络!'

input_dim=trainX[1].shape[1]

output_dim=trainY.shape[1]#独热标签

#打印当前型号:的预定义参数

model=Sequential()#应用具有x暗淡输出和y暗淡输入的LSTM层。使用dropout参数避免过拟合

model.add(LSTM(output_dim=self.output_dim,

input_dim=input_dim,

激活=self.activation_lstm,

dropout_U=self.drop_out,

return_sequences=True))对于范围内的i(self.lstm_layer-2):

model.add(LSTM(output_dim=self.output_dim,

input_dim=self.output_dim,

激活=self.activation_lstm,

dropout_U=self.drop_out,

return_sequences=True))#最后一个lstm层中的参数return_sequences应该为false,以避免输入维度与密集层不兼容

model.add(LSTM(output_dim=self.output_dim,

input_dim=self.output_dim,

激活=self.activation_lstm,

dropout_U=self.drop_out))对于范围内的i(self.dense_layer-1):

model.add(密集(output_dim=self.output_dim,

激活=self.activation_last))

model.add(密集(output_dim=output_dim,

input_dim=self.output_dim,

activation=self.activation_last))#配置学习过程

model.compile(loss=self.loss,optimizationr=self.optimizer,metrics=[accuracy])#用固定的epoch数训练模型

model.fit(x=trainX,y=trainY,nb_epoch=self.nb_epoch,batch_size=self.batch_size,validation_data=(testX,testY))#将模型存储到json文件

model_json=model.to_json()withopen(model_path,'w')asjson_file:

json_file.write(model_json)#将模型权重存储到hdf5文件

如果model_weight_path:如果os.path.exists(model_weight_path):

os.remove(model_weight_path)

model.save_weights(model_weight_path)#eg:model_weight.h5

返回模型

这里写的只涉及LSTM网络的结构搭建。至于如何将数据处理归一化为网络所需的结构,并将模型预测结果与实际值的统计比较可视化,则需要根据实际情况进行调整。

上一篇: 亚速钢铁股票行情最新消息,亚速钢铁股票行情最新消息新闻
下一篇: 神经病药股票行情最新消息,神经病药股票行情最新消息新闻

相关资讯