目录
2.1 划分数据集,按照8:2划分训练集和测试集, 然后再按照前7后4划分分量数据
3 基于CEEMADN的BiLSTM-Attention模型预测
3.2 定义CEEMDAN-BiLSTM-Attention预测模型
4.1 数据加载,训练数据、测试数据分组,四个分量,划分四个数据集
时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客
风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客
风速预测(三)EMD-LSTM-Attention模型-CSDN博客
风速预测(四)基于Pytorch的EMD-Transformer模型-CSDN博客
风速预测(五)基于Pytorch的EMD-CNN-LSTM模型-CSDN博客
风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型-CSDN博客
本文基于前期介绍的风速数据(文末附数据集),介绍一种综合应用完备集合经验模态分解CEEMDAN与混合预测模型(BiLSTM-Attention +?ARIMA)的方法,以提高时间序列数据的预测性能。该方法的核心是使用CEEMDAN算法对时间序列进行分解,接着利用BiLSTM-Attention模型和ARIMA模型对分解后的数据进行建模,最终通过集成方法结合两者的预测结果。
风速数据集的详细介绍可以参考下文:
根据分解结果看,CEEMDAN一共分解出11个分量,我们大致把前7个高频分量作为BiLSTM-Attention模型的输入进行预测,后4个低频分量作为ARIMA模型的输入进行预测
# 定义滑动窗口大小
window_size = 7
# 分量划分分界
imf_no = 7
# 第一步,划分数据集
dataset1, dataset2 = make_wind_dataset(wind_emd_imfs, imf_no)
# 第二步,制作数据集标签 滑动窗口
# BiLSTM-Attention 模型数据
train_set1, train_label1 = data_window_maker(dataset1[0], window_size)
test_set1, test_label1 = data_window_maker(dataset1[1], window_size)
# ARIMA 模型数据
train_data_arima = dataset2[0]
test_data_arima = dataset2[1]
# 保存数据
dump(train_set1, 'train_set1')
dump(train_label1, 'train_label1')
dump(test_set1, 'test_set1')
dump(test_label1, 'test_label1')
dump(train_data_arima, 'train_data_arima')
dump(test_data_arima, 'test_data_arima')
分批保存数据,用于不同模型的预测
# 加载数据
import torch
from joblib import dump, load
import torch.utils.data as Data
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
# 参数与配置
torch.manual_seed(100) # 设置随机种子,以使实验结果具有可重复性
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 加载数据集
def dataloader(batch_size, workers=2):
# 训练集
train_set = load('train_set1')
train_label = load('train_label1')
# 测试集
test_set = load('test_set1')
test_label = load('test_label1')
# 加载数据
train_loader = Data.DataLoader(dataset=Data.TensorDataset(train_set, train_label),
batch_size=batch_size, num_workers=workers, drop_last=True)
test_loader = Data.DataLoader(dataset=Data.TensorDataset(test_set, test_label),
batch_size=batch_size, num_workers=workers, drop_last=True)
return train_loader, test_loader
batch_size = 64
# 加载数据
train_loader, test_loader = dataloader(batch_size)
注意:输入风速数据形状为 [64, 7, 7], batch_size=64,? 维度7维代表7个分量,7代表序列长度(滑动窗口取值)。
# 定义模型参数
batch_size = 64
input_len = 48 # 输入序列长度为96 (窗口值)
input_dim = 7 # 输入维度为7个分量
hidden_layer_sizes = [32, 64] # LSTM 层 结构 隐藏层神经元个数
attention_dim = hidden_layer_sizes[-1] # 注意力层维度 默认为 LSTM输出层维度
output_size = 1 # 单步输出
model = BiLSTMAttentionModel(batch_size, input_len, input_dim, attention_dim, hidden_layer_sizes, output_size=1)
# 定义损失函数和优化函数
model = model.to(device)
loss_function = nn.MSELoss() # loss
learn_rate = 0.003
optimizer = torch.optim.Adam(model.parameters(), learn_rate) # 优化器
训练结果
100个epoch,MSE 为0.00559,BiLSTM-Attention预测效果良好,适当调整模型参数,还可以进一步提高模型预测表现。
注意调整参数:
可以适当增加BiLSTM层数和隐藏层的维度,微调学习率;
调整注意力维度数,增加更多的 epoch (注意防止过拟合)
可以改变滑动窗口长度(设置合适的窗口长度)
保存训练结果和预测数据,以便和后面ARIMA模型的结果相组合。
传统时序模型(ARIMA等模型)教程如下:
时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客
# 加载数据
from joblib import dump, load
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')
# 训练集
train_set = load('train_data_arima')
# 测试集
test_set = load('test_data_arima')
# IMF1-Model1
model1_train = train_set[0, :]
model1_test = test_set[0, :]
# IMF2-Model2
model2_train = train_set[1, :]
model2_test = test_set[1, :]
# IMF3-Model3
model3_train = train_set[2, :]
model3_test = test_set[2, :]
# IMF4-Model4
model4_train = train_set[3, :]
model4_test = test_set[3, :]
第一步,单位根检验和差分处理
ADF检验P值远小于0.05,故拒绝原假设,即数据是平稳的时间序列数据,也确定了d=0
第二步,模型识别,采用AIC指标进行参数选择
采用AIC指标进行参数选择,得到最小的AIC值的组合为p=2,q=0,选择其作为模型进行拟合,因此针对原数据可知最终确定模型为ARIMA(2,0,0)(结合代码指标结果来看)
第三步,模型预测
第四步,模型评估
保存预测的数据,其他分量预测与上述过程一致,保留最后模型结果即可。
# 训练集
arima_train_set = load('train_data_arima')
# 测试集
arima_test_set = load('test_data_arima')
# IMF1-Model1
model1_imf_arima_pre = load('model1_imf_arima_pre')
# IMF2-Model2
model2_imf_arima_pre = load('model2_imf_arima_pre')
# IMF3-Model3
model3_imf_arima_pre = load('model3_imf_arima_pre')
# IMF4-Model4
model4_imf_arima_pre = load('model4_imf_arima_pre')
# BiLSTM-Attention
original_label_bilstmatt = load('original_label_bilstmatt')
pre_data_bilstmatt = load('pre_data_bilstmatt')
由分量预测结果可见,前7个分量在BiLSTM-Attention预测模型下拟合效果良好,分量9在ARIMA模型的预测下,拟合程度比较好,其他低频分量拟合效果弱一点,调整参数可增强拟合效果。