原文链接:
在此示例中,使用神经网络使用 2011 年 4 月至 2013 年 2 月的数据来预测都柏林市议会公民办公室的能源消耗。
每日数据是通过每天提供的每 15 分钟的总消耗量来创建的。
LSTM 简介
LSTM(或长期短期记忆网络)允许分析具有长期依赖性的顺序或有序数据。当涉及到这项任务时,传统的神经网络就力不从心了,在这方面,LSTMs 将用于预测这种情况下的功耗模式。
LSTM 与 ARIMA 等模型相比的一个特别优势是,数据不一定需要是固定的(恒定的均值、方差和自相关)才能让 LSTM 对其进行分析——即使这样做可能会提高性能。
自相关图、Dickey-Fuller 检验和对数转换
要确定我们的模型中是否存在平稳性:生成自相关和偏自相关图
进行 Dickey-Fuller 测试
对时间序列进行对数变换并再次运行上述两个程序以确定平稳性的变化(如果有)
首先,这是时间序列图:
观察到波动性(或从一天到下一天的消费变化)非常高。在这方面,可以使用对数变换来尝试稍微平滑数据。在此之前,生成了 ACF 和 PACF 图并进行了 Dickey-Fuller 检验。
自相关图
偏自相关图
自相关图和偏自相关图都表现出显着的波动性,这意味着时间序列中的几个区间是相关的。
运行 Dickey-Fuller 测试时,会产生以下结果:
当 p 值高于 0.05 时,不能拒绝非平稳性的原假设。
性病1
954.7248
4043.4302
0.23611754
变异系数(或均值除以标准差)为 0.236,表明该系列存在显着波动。
现在,数据被转换为对数格式。
虽然时间序列仍然不稳定,但以对数格式表示时时间序列长期预测模型,偏差的幅度略有下降:
此外,变异系数已显着下降至 0.0319,这意味着与平均值相关的趋势的变异性明显低于以前。
STD2 = np.std(数据集)
mean2 = np.mean(数据集)
cv2 = std2 / mean2 #Variationsstd2 的系数
0.26462445mean2
8.272395cv2
0.031988855
再次,在对数数据上生成 ACF 和 PACF 图,并再次进行了 Dickey-Fuller 检验。
自相关图
偏自相关图
迪基-富勒检验
...print('\t%s:%.3f'%(key,value))
1%:-3.440
5%:- 2.866
10%: - 2.569
Dickey-Fuller 检验的 p 值降至 0.0576。虽然这在技术上并未进入拒绝零假设所需的 5% 显着性阈值,但基于 CV 度量的对数时间序列显示出较低的波动性,因此该时间序列用于 LSTM 的预测目的。
使用 LSTM 进行时间序列分析
现在,LSTM 模型本身用于预测目的。
数据处理
一、导入相关库并进行数据处理
LSTM 生成和预测
该模型经过 100 多个时期的训练并生成预测。
# 生成 LSTM 网络
模型=顺序()
model.add(LSTM(4, input_shape=(1, previous)))
model.fit(X_train,Y_train,epochs=100,batch_size=1,verbose=2)
# 生成预测
trainpred = model.predict(X_train)
# 将预测恢复正常
trainpred = scaler.inverse_transform(trainpred)
#calculateRMSE
trainScore = math.sqrt(mean_squared_error(Y_train[0], trainpred[:, 0]))
#训练预测
trainpredPlot = np.empty_like(数据集)
# 测试预测
# 绘制所有预测
逆变换,= plt.plot(scaler.inverse_transform(dataset))
准确性
该模型显示训练数据集的 RMSE 为 0.24,测试数据集的 RMSE 为 0.23。平均千瓦消耗量(以对数形式表示)为8.27,即0.23的误差小于平均消耗量的3%。
下图是预测消耗与实际消耗的关系图:
有趣的是,在对原始数据(未转换为对数格式)进行预测时,会产生以下训练和测试错误:
日均耗电量4043千瓦,测试成绩均方误差占日均总耗电量的近20%,与对数数据得出的结果相比非常高。
也就是说,重要的是要记住,预测是使用 1 天的先前数据进行的,即 Y 代表时间 t 的消耗,X 代表时间 t-1 的消耗,由前面代码中的前一个变量设置。让我们看看这如何增加到正好 10 天和 50 天。
10天
#
50天
我们可以看到测试误差在 10 天和 50 天期间显着降低,并且考虑到 LSTM 模型在进行预测时考虑了更多的历史数据,可以更好地捕捉到消费的波动性。
鉴于数据是对数格式,现在可以通过取数据的指数来获得预测的真实值。
例如,用 (1, -1) 重塑 testpred 变量:
testpred.reshape(1, -1)
数组([[7.7722197,8.277015,8.458941,8.455311,8.447589,8.445035,
……
8.425287、8.404881、8.457063、8.423954、7.98714、7.9003944、
8.240862、8.41654、8.423854、8.437414、8.397851、7.9047146]]、
dtype = float32)
综上所述
对于这个例子,LSTM 被证明在预测功耗波动方面非常准确。此外时间序列长期预测模型,以对数格式表示时间序列可以平滑数据的波动性并提高 LSTM 的预测准确性。
参考
1.在python中使用lstm和pytorch进行时间序列预测
2.在python中使用长短期记忆模型lstm进行时间序列预测分析
3.使用r语言进行时间序列(arima,指数平滑)分析
4. R语言多元copula-garch-model时间序列预测
5. R语言copula和金融时间序列案例
6.使用r语言随机波动模型sv处理时间序列的随机波动
7.r语言时间序列tar阈值自回归模型
8. R语言k-shape时间序列聚类方法对股价时间序列进行聚类
9. python3使用arima模型进行时间序列预测