时间序列预测16:Encoder 您所在的位置:网站首页 多变量时间序列预测 时间序列预测16:Encoder

时间序列预测16:Encoder

2024-01-26 23:04| 来源: 网络整理| 查看: 265

【时间序列预测/分类】 全系列60篇由浅入深的博文汇总:传送门

文章目录 1. 单变量序列输入数据向量输出预测模型1.1 数据处理1.2 LSTM 模型1.3 完整代码 2. 单变量输入 Encoder-Decoder LSTM2.1 编码器解码器 LSTM 模型2.2 完整代码 3. 多变量输入 Encoder-Decoder LSTM3.1 模型定义3.2 完整代码

递归神经网络(RNN)是专门为预测序列数据而设计的,可用于多步时间序列预测。

两篇相关文章介绍 LSTM 模型及其变种处理多步时间序列预测问题。主要包括:

Vector-Output Vanilla LSTM 模型用于单变量输入数据的多步预测;Encoder-Decoder LSTM 模型用于单变量输入数据的多步预测;Encoder-Decoder LSTM 模型用于多变量输入数据进行多步预测;CNN-LSTM Encoder-Decoder 模型用于单变量输入数据进行多步预测;ConvLSTM Encoder-Decoder 模型单变量输入数据的多步预测模型;

本文没有在调整超参数上下功夫,这些内容会在以后的文章介绍。考虑到模型的随机性,应该对给定模型进行多次评估并在测试数据集上统计平均性能。对于给定的多步预测问题,不能确定哪种模型是最有效的。应该进行分析验证,以找到最适合实际业务需求中数据集的方法。

1. 单变量序列输入数据向量输出预测模型

在本节,开发一个普通的LSTM模型(Vanilla LSTM),该模型按日总耗电量的顺序读取数据,并预测下一个标准周每日的总耗电量,预测结果以向量的形式输出。这将为后续章节中开发的更精细的模型提供基础。

1.1 数据处理

使用前七天的数据预测下一周七天的耗电情况。LSTM 模型要求输入数据的shape为:[示例、时间步、功能]([samples, timesteps, features])。一个样本包含七个时间步的采样值,样本特征数为1,即单变量,预测日总有功功率。训练数据集有159周的数据,因此训练数据集的shape为:[159,7,1]。

只有159个样本来训练LSTM模型显然是不够的,我们需要扩充数据,即把滑动步长7变为1,如果不明白,请参考之前的文章:传送门。已经讲的很明白,此处不再赘述。

转换完成之后,样本数由原来的159个变为1099个,转换后的数据集的shape为:X=[1099,7,1] 和 y=[1099,7] 。接下来,我们可以在训练数据上定义并拟合LSTM模型。

1.2 LSTM 模型

定义一个具有200个units的单隐层LSTM模型,隐藏层中的units与输入序列中的时间步数无关。 LSTM层之后是有200个节点的全连接层,该层将解释LSTM层学习的特征。最后,输出层将直接预测一个包含七个元素的向量,即一周内每天的总有功功率估计。使用均方误差(mse)损失函数,因为它与RMSE误差度量非常匹配。使用随机梯度下降Adam,训练70个epoch,batch_size设置为16。

1.3 完整代码

其实,中间很多处理过程,在之前的文章中已经介绍过了,此处不再赘述。

import numpy as np import pandas as pd import matplotlib.pyplot as plt # 设置中文显示 plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei'] plt.rcParams['axes.unicode_minus'] = False import math import sklearn.metrics as skm from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense def split_dataset(data): ''' 该函数实现以周为单位切分训练数据和测试数据 ''' # data为按天的耗电量统计数据,shape为(1442, 8) # 测试集取最后一年的46周(322天)数据,剩下的159周(1113天)数据为训练集,以下的切片实现此功能。 train, test = data[1:-328], data[-328:-6] train = np.array(np.split(train, len(train)/7)) # 将数据划分为按周为单位的数据 test = np.array(np.split(test, len(test)/7)) return train, test def evaluate_forecasts(actual, predicted): ''' 该函数实现根据预期值评估一个或多个周预测损失 思路:统计所有单日预测的 RMSE ''' scores = list() for i in range(actual.shape[1]): mse = skm.mean_squared_error(actual[:, i], predicted[:, i]) rmse = math.sqrt(mse) scores.append(rmse) s = 0 # 计算总的 RMSE for row in range(actual.shape[0]): for col in range(actual.shape[1]): s += (actual[row, col] - predicted[row, col]) ** 2 score = math.sqrt(s / (actual.shape[0] * actual.shape[1])) print('actual.shape[0]:{}, actual.shape[1]:{}'.format(actual.shape[0], actual.shape[1])) return score, scores def summarize_scores(name, score, scores): s_scores = ', '.join(['%.1f' % s for s in scores]) print('%s: [%.3f] %s\n' % (name, score, s_scores)) def sliding_window(train, sw_width=7, n_out=7, in_start=0): ''' 该函数实现窗口宽度为7、滑动步长为1的滑动窗口截取序列数据 ''' data = train.reshape((train.shape[0] * train.shape[1], train.shape[2])) # 将以周为单位的样本展平为以天为单位的序列 X, y = [], [] for _ in range(len(data)): in_end = in_start + sw_width out_end = in_end + n_out # 保证截取样本完整,最大元素索引不超过原序列索引,则截取数据;否则丢弃该样本 if out_end


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有