
【keras】利用LSTM做简单的时间序列预测
将其可视化
如下,对数据进行归一化
LSTM的输入数据格式是:[batchsize,num_steps,feature_size],num_steps即我们每次用多少个观测值去预测下一个时刻的观测值,这些观测值在时间上是连续的,feature_size表示每个观测值的特征大小,这里我们是预测一个数,因此feature_size=1。我们需要定义一个函数将数据规范成这种格式。
发布日期:2021-05-07 22:36:30
浏览次数:10
分类:精选文章
本文共 2869 字,大约阅读时间需要 9 分钟。
转载自:https://blog.csdn.net/weixin_43486780/article/details/105344900
首先加载时间序列数据集,数据集
import pandas as pddata = pd.read_csv('SP500.csv')data.head()
数据集大概是这样的,这里我们选择’Close’这一列特征进行预测。

import matplotlib.pyplot as pltimport numpy as npdata_close = np.reshape(data['Close'].values,(-1,1))plt.plot(data_close)
可以看到数值变化较大,从0变化到2500,为了方便LSTM训练我们将其进行MinMax归一化,最后再将预测结果反归一化回来即可。

from sklearn.preprocessing import MinMaxScalerdata_scaler = MinMaxScaler(feature_range=(0, 1))scale_data = data_scaler.fit_transform(data_close)plt.plot(scale_data)
归一化后并不改变数据的趋势,此时数值大小被限制在(0,1)间。

将数据规范成[None,num_steps,feature_size]的形式,且根据test_ratio划分训练集和测试集。
def data_format(data, num_steps=4, test_ratio=0.2): # split into groups of num_steps X = np.array([data[i: i + num_steps] for i in range(len(data) - num_steps)]) y = np.array([data[i + num_steps] for i in range(len(data) - num_steps)]) train_size = int(len(X) * (1.0 - test_ratio)) train_X, test_X = X[:train_size], X[train_size:] train_y, test_y = y[:train_size], y[train_size:] return train_X, train_y, test_X, test_y
对归一化后的数据进行数据格式规范化
num_steps = 3test_ratio = 0.2train_X, train_y, test_X, test_y = data_format(scale_data, num_steps, test_ratio)print(train_X.shape, test_X.shape)>>> (13487, 3, 1) (3372, 3, 1)
接下来定义LSTM网络对进行预测
输入为[batchsize,num_steps,feature_size](定义Inputs时是不需要管batchsize大小的),LSTM的神经元个数为32,即LSTM层输出是一个大小为32的向量,后接一个全连接层将32维的向量映射成一个数字,采用MSE作为误差函数。
from keras.layers import LSTM, Dense, Inputfrom keras import Model inputs = Input(shape=[num_steps, 1])lstm = LSTM(32)(inputs)out = Dense(1)(lstm)model = Model(inputs, out)model.compile(loss='mean_squared_error', optimizer='adam')model.summary()
网络形状如下,关于LSTM的网络参数个数可以看我的另一篇
Layer (type) Output Shape Param # =================================================================input_2 (InputLayer) (None, 3, 1) 0 _________________________________________________________________lstm_2 (LSTM) (None, 32) 4352 _________________________________________________________________dense_2 (Dense) (None, 1) 33 =================================================================Total params: 4,385Trainable params: 4,385Non-trainable params: 0
接着对网络进行fit训练
model.fit(train_X, train_y, batch_size=1, epochs=30)
preds = model.predict(test_X)
将预测结果反归一化,并于真实值比较
preds = data_scaler.inverse_transform(preds)trues = data_scaler.inverse_transform(test_y)plt.plot(preds, c='r', label='predict')plt.plot(trues, c='b', label='true')plt.legend()
可以看到这个简单的网络已经基本拟合了测试集,表现不错,我们还可以搭建多层LSTM做更复杂的模型,搭建多层LSTM可见我的另一篇

发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月06日 13时19分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
用正则表达式过滤多余空格
2021-05-07
XML:采用XHTML和CSS设计可重用可换肤的WEB站点
2021-05-07
泳道图简介
2021-05-07
Tomcat6中web项目部署路径webapps和wtpwebapps的区别
2021-05-07
Java判断字符串是否为金额
2021-05-07
Kubernetes十三--Pod定义文件内容详解
2021-05-07
普歌- LRF-(简单易懂)笔记本电脑USB接口案例 接口多态(向下转型)
2021-05-07
Java中如何构建树结构
2021-05-07
解决eclipse字体背景变红或者变绿的问题
2021-05-07
软件架构-zookeeper快速入门
2021-05-07
「初级篇」跟我一起学docker(四)--容器的基本操作
2021-05-07
22 岁毕业做程序员的「普通」人,50 岁时的人生轨迹是怎样的?
2021-05-07
java稀疏数组
2021-05-07
全球数字货币加快研发
2021-05-07
数字化助力金融科技,实现产业良性循环
2021-05-07
angr学习笔记(7)(malloc地址单元符号化)
2021-05-07
windows环境利用start命令实现微信多开
2021-05-07
「CF149D」括号涂色 区间DP好题
2021-05-07
树状数组 模板总结
2021-05-07
「NOI2015」程序自动分析 并查集题解
2021-05-07