时序数据预测:LSTM
本文尝试应用长短期记忆(LSTM,Long Short-Term Memory)神经网络模型对月度时序数据进行预测,样本时序数据时间跨度2017年1月至今,同时对多个目标变量时序数据进行预测。本文主要参考了《python预测之美》部分章节内容,暂不做详尽的理论说明与代码解释,仅做个人积累记录使用,如有侵权或不合规请及时联系处理~
目录
1、样本数据获取
2、数据预处理
3、重构数据结构,划分训练集与测试集
4、LSTM模型构建与训练
5、预测结果还原
6、模型效果评估
1、样本数据获取
本例样本数据为多变量月度时序数据宽表,读取时序数据后将“年月”字段设置为索引。
import pandas as pd#加载数据
ts_data0 = pd.read_excel("C:/Users/admin/Desktop/data.xlsx",sheet_name='目标变量宽表')
ts_data0['年月']=ts_data0['年月'].astype(object)
ts_data0['年月'] = pd.to_datetime(ts_data0['年月'],format='%Y%m')
tmp =ts_data0.set_index('年月')
2、数据预处理
将目标变量时序数据进行z-score标准化处理,消除各变量间量纲差异可能带来的影响。
import numpy as np#数据预处理
vmean = tmp.apply(lambda x:np.mean(x))
vstd = tmp.apply(lambda x:np.std(x))
t0 = tmp.apply(lambda x:(x-np.mean(x))/np.std(x)).values #z-score标准化
3、重构数据结构,划分训练集与测试集
本例样本数据初始结构为二维表,索引为“年月”,共15列数据(目标变量),样本时序数据以12个月为一个波动周期。因此设置LSTM模型输入输出变量数dim=15,设置LSTM模型往前依赖的时序数据期数SEQLEN=15(稍大于周期月数12);
用于LSTM建模的输入数据需要整理成3维结构(数据块个数×SEQLEN个数据记录×dim个变量),输出仍为2维数据集。用前15(SEQLEN)条时序数据预测第16条数据;单个样本数据块为相邻15条15(dim)列,用以对第16条15(dim)列数据进行预测;验证集为5(test_len)个数据块,据此推导训练集大小;下期待预测的输入为最后15条15列数据。
#参数
dim= 15#预测变量数
SEQLEN = 15#依赖前期数据期数
test_len=5#划分训练集与验证集
X_train = np.zeros((t0.shape[0]-SEQLEN-test_len, SEQLEN, dim))#三维
Y_train = np.zeros((t0.shape[0]-SEQLEN-test_len, dim),)#二维
for i in range(SEQLEN, t0.shape[0]-test_len):Y_train[i-SEQLEN] = t0[i]X_train[i-SEQLEN] = t0[(i-SEQLEN):i]X_test = np.zeros((test_len, SEQLEN, dim))
Y_test = np.zeros((test_len, dim),)
for i in range(t0.shape[0]-test_len,t0.shape[0]):Y_test[i-t0.shape[0]+test_len] = t0[i]X_test[i-t0.shape[0]+test_len] = t0[(i-SEQLEN):i]#下期数据预测输入
X_pred = np.zeros((1, SEQLEN, dim))
X_pred[0]=t0[t0.shape[0]-SEQLEN:t0.shape[0]]print(X_pred)
样本数据块预览,输入LSTM模型的其中一个样本数据块为15条相邻记录×15个变量。
4、LSTM模型构建与训练
在训练集上完成模型训练,设置隐含层神经元数量为45,初始迭代次数为2000次,每批次处理5个样本数据块。
from keras.layers import LSTM, Dense
from keras.models import Sequential#训练LSTM模型
model = Sequential()
model.add(LSTM(45, input_shape=(SEQLEN, dim),activation='relu',recurrent_dropout=0.01))
model.add(Dense(dim,activation='linear'))
model.compile(loss = 'mean_squared_error', optimizer = 'rmsprop')
history = model.fit(X_train, Y_train, epochs=2000, batch_size=5, validation_split=0)
迭代过程示例,损失函数loss逐渐下降,越往后降得越慢,直至收敛。
绘图直观观察损失函数loss下降、收敛过程
import matplotlib.pyplot as plt#绘制损失函数
plt.figure(figsize=(15,5))
plt.plot(history.history['loss'], label='train')
plt.legend()
plt.show()
如图所示,本例损失函数loss值在迭代次数达到500以后已趋收敛,可将模型迭代次数调整为稍高于500,提高性能。
5、预测结果还原
输出测试集预测结果,需对结果进行z-score标准化还原。
#模型预测结果标准化还原
pred_test=model.predict(X_test)*vstd.values+vmean.values
preddf=model.predict(X_pred)*vstd.values+vmean.values
pred = np.vstack((pred_test,preddf))
6、模型效果评估
依次输出15个目标变量在各自测试集上的模型预测准确率,绘制15个目标变量实际值与预测值的曲线对比图(画布形状:15行1列)。
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)#模型预测结果评估
ts_data=tmp.copy()
cols = ts_data.columns
m = SEQLEN+1
xts = tmp.index[-m::1]fig, axes = plt.subplots(15,1,figsize=(15,80))
index = 0
for ax in axes.flatten():ax.plot(range(m),ts_data[cols].iloc[-m:,index],'-',c='lightgray',linewidth=2,label="real")ax.plot(range(m-test_len-1,m),pred[:,index],'o--',c='black',linewidth=2,label="predict")ax.set_xticks(np.arange(0, m, step=1))ax.set_xticklabels(xts,rotation=50)ax.set_ylabel(cols[index],fontproperties=font)ax.legend()result_ts=ts_data[cols].iloc[-(m-10):,index]result_pred=pd.Series(pred[:,index],index=ts_data[cols].iloc[-(m-10):,index].index,name='pred')result = pd.concat([result_ts, result_pred], axis=1)result['accur']=100-abs((result['pred']-result[cols[index]])*100/result[cols[index]])print(result)index = index + 1
plt.tight_layout()
plt.show()
结果预览,其中一个目标变量的预测准确率。
该变量相应实际值与预测值曲线对比图。
时序数据预测:LSTM相关推荐
- MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测
MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测 摘要 近些年,随着计算机技术的不断发展,神 ...
- 基于机器学习的时序数据预测方法
预测模型建模 时序数据的预测通常建模为利用历史数据值预测未来的数据走势. 简单的数学表示: x => S => x^' 其中: x = {x_1,x_2,-,x_t} 表示历史数据, S ...
- 时序数据预测:ROCKET vs Time Series Forest vs TCN vs XGBoost
机器学习小项目:从NIFTY指数的当日股价预测股票收盘价格,对比各种模型在时序数据预测的效果 如果你像我一样涉足股票交易,你可能想知道如何在收盘时判断股票的走势--它会在收盘价上方收盘,还是不会?因为 ...
- 时序数据预测:Holt-Winters
本文尝试应用三次指数平滑法(Holt-Winters)对同时含有趋势和季节规律的月度时序数据进行预测,样本时序数据时间跨度2017年1月至今.对时序数据进行异常值判别并修正处理后,应用Holt-Win ...
- 一种基于多维时序数据预测综合判定的方法(内存告警)
很多情境下,我们都会遇到收集的多维度的时序性的数据,比如运维中的主机各项指标数据,网页中的各项埋点数据等等.通常情况下通过某一指标上的时序预测结果与真实值的比较来判断这一指标是否稳定,这个常用方法的缺 ...
- 时序数据预测-Arima模型篇
ARIMA模型详解 基本概念 ARIMA(p, d, q)预测模型 ARIMA差分整合移动平均自回归模型,用于时间序列数据分析与预测,相比ARMA模型在AR和MA之间多了差分步骤,目的是把非平稳序列转 ...
- 时序数据预测-SARIMA篇
一.概念 1. 定义:SARIMA模型具有处理季节趋势的时间序列数据的特点. 2. 参数介绍:SARIMA(p, d, q) (P, D, Q)s ,分为两部分,非季节模型与参数p.d.q,季节性模型 ...
- 【SVM时序预测】基于matlab鲸鱼算法优化支持向量机SVM时序数据预测【含Matlab源码 2250期】
⛄一.鲸鱼算法优化支持向量机SVM 1 鲸鱼优化算法 WOA是由Mirjalili和Lewis在2016年提出的一种较为新颖的元启发式群体智能优化算法,该算法模仿座头鲸的"螺旋气泡网&quo ...
- 智能优化与机器学习结合算法实现时序数据预测matlab代码清单
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
最新文章
- 【php】php编译pcntl以支持多进程
- 拷贝的Android源码不能单独编译mmm命令提示找不到
- 在ThoughtWorks工作两个多月的总结
- 项目研发流程及管理之我见
- 【numpy】numpy.ones()函数
- Windows Azure VM Role (2) 创建VHDVHD
- Git不断询问我ssh密钥密码
- 洛谷P1792 [国家集训队]种树 题解
- 解决许可证的相关问题
- MCU】可怕,别人把我MCU固件给反汇编了!(逆向)J-FLASH通过下面的选项路径,即可读取所选Flash区域或者所有Flash区域(Entire Chip)安装IDA Pro逆向工具
- MATLAB-蒙特卡罗方法
- java set方法无法使用_Java setBounds无法与JPanel一起使用
- 佛法在世间不离世间觉离世求佛法犹如觅兔角
- 如何提高推荐量?新手必知 头条号推荐机制
- 股票账户各权限开通条件总结【干活总结】
- 阿里技术人才能力模型(深度解读系列之一)
- 软件安全实验——lab7(缓冲区溢出3:返回导向编程技术ROP)
- PHP画好看的图,HTML5画一个简单呢好看的电路图
- python 配置 mitmproxy 证书
- python:彩色照转黑白照