原文链接:http://tecdat.cn?p=26519
一个简单的编码器-解码器LSTM神经网络应用于时间序列预测问题:预测天然气价格,预测范围为 10 天。“进入”时间步长也设置为 10 天。) 只需要 10 天来推断接下来的 10 天。可以使用 10 天的历史数据集以在线学习的方式重新训练网络。
数据集是天然气价格(查看文末了解数据获取方式) ,具有以下特征:
- 日期(从 1997 年到 2020 年)- 为 每天数据
- 以元计的天然气价格
相关视频:LSTM神经网络架构和工作原理及其在Python中的预测应用
读取数据并将日期作为索引处理
# 固定日期时间并设置为索引 dftet.index = pd.DatetimeIndex # 用NaN来填补缺失的日期(以后再补) dargt = f\_arget.reindex(ales, fill\_value=np.nan) # 检查 print(d_tret.dtypes) df_aget.head(10)
处理缺失的日期
# 数据归纳(使用 "向前填充"--根据之前的值进行填充)。 dfaet.fillna(method='ffill', inplace=True)
特征工程
因为我们正在使用深度学习,所以特征工程将是最小的。
- One-hot 编码“is_weekend”和星期几
- 添加行的最小值和最大值(可选)
通过设置固定的上限(例如 30 倍中位数)修复异常高的值
# 在df_agg中修复任何非常高的值 - 归一化为中值 for col in co\_to\_fi_ies: dgt\[col\] = fixnaes(dftget\[col\])
添加滞后
# 增加每周的滞后性 df\_tret = addag(d\_aget, tare\_arble='Price', step\_ak=7) # 增加30天的滞后性 df\_get = ad\_ag(df\_ret, tagt\_able='Price', sep_bck=30)
# 合并后删除任何有NA值的列 d_gt.dropna(inplace=True) print(dfget.shape) tie\_nx = df\_art.index
归一化
- 归一化或最小-最大尺度(需要减小较宽的数值范围,以便 LSTM 收敛)。
# 标准化训练数据\[0, 1\]
sclr = prcsing.Maxcaer((0,1))
准备训练数据集
- 时间步数 = 1
- 时间步数 = nsteout小时数(预测范围)
在这里,我们将数据集从 [samples, features] 转换为 [samples, steps, features] - 与算法 LSTM 一起使用的维度。下面的序列拆分使用“walk-forward”方法来创建训练数据集。
# 多变量多步骤编码器-解码器 lstm 示例 # 选择一个时间步骤的数量 # 维度变成\[样本数、步骤、特征\] X, y = splices(datasformed, n\_ep\_in, n\_ep\_out) # 分成训练/测试 et_ut = int(0.05*X.shpe\[0\]) X\_tain, X\_est, ytrain, y\_tst = X\[:-tetaont\], X\[-tes\_ont:\], y\[:-tstmunt\], y\[-es_unt:\]
训练模型
这利用了长期短期记忆算法。
# 实例化和训练模型
model = cre\_odel(n\_tps\_in, n\_tep\_out, n\_feures, lerig_rate=0.0001)
探索预测
%%time #加载特定的模型 model = lod\_id\_del( n_stepin, n\_sep\_out, X_tan.shape\[2\])
# 展示对一个样本的预测
testle_ix = 0 yat = mdel.predict(X\_tet\[est\_amle\_ix\].reshape((1,n\_sep_in, nfatues)),erbose=Tue)
# 计算这一个测试样本的均方根误差 rmse = math.sqrt
plot\_result(yhat\[0\], scaler, saved\_columns)
点击标题查阅往期内容
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
01
02
03
04
平均 RMSE
# 收集所有的测试RMSE值 rmesores = \[\] for i in range: yhat = oel.predict(Xtet\[i\].reshape((1, \_stes\_in, _faues)), verbose=False) # 计算这一个测试样本的均方根误差 rmse = math.sqrt(mensqaerror(yhat\[0\], y_test\[i\]))
训练整个数据集
#在所有数据上实例化和训练模型 modl\_l = cret\_mel(nsep\_in, steps\_ou, n_etures,learnnrate=0.0001) mde\_all, ru\_ime, weighfie = trin(md_all, X, y, batcsie=16, neohs=15)
样本内预测
注意:模型已经“看到”或训练了这些样本,但我们希望确保它与预测一致。如果它做得不好,模型可能会欠拟合或过拟合。要尝试的事情:
- 增加或减少批量大小
- 增加或减少学习率
- 更改网络中 LSTM 的隐藏层数
# 获得10个步 da\_cent = dfret.iloc\[-(ntes\_in*2):-nsps_in\] # 标准化 dta_ectormed = sclr.rasfrm(daareent) # 维度变成\[样本数、步骤、特征\] n_res = dtcentorm.shape\[1\] X\_st = data\_recn\_trsrd.reshape((1, n\_tps\_n, n\_feares)) # 预测 foecst = mlll.predict(X_past) # 扩大规模并转换为DF forcast = forast.resape(n_eaturs)) foect = saer.inese_transform(forecast) fuure\_dtes df\_targe.ide\[-n\_steps\_out:\] # 绘图 histrcl = d_aet.ioc\[-100:, :1\] # 获得历史数据的X步回溯 for i in ane(oisae\[1\]): fig = plt.igre(fgze=(10,5)) # 绘制df_agg历史数据 plt.plot(.iloc\[:,i\] # 绘制预测图 plt.plot(frc.iloc\[:,i\]) # 标签和图例 plt.xlabel
预测样本外
# 获取最后10步 dtareent = dfargt.iloc\[-nstpsin:\]。 # 标准化 dta\_ecntranfomed = scaler.trasorm(data\_recent) # 预测 forct = meall.rict(_past) # 扩大规模并转换为DF foreast = foecs.eshape(\_seps\_ut, n_eatures)) foreast = sclerinvers_tranorm(focast) futur\_daes = pd.daternge(df\_argetinex\[-1\], priods=step_out, freq='D') # 绘图 htrical = df_taet.iloc\[-100:, :1\] # 获得历史数据的X步回溯 # 绘制预测图 plt.plot(fectoc\[:,i\])