赞
踩
目录
3 基于Pytorch的EMD-Transformer模型预测
往期精彩内容:
本文基于前期介绍的风速数据(文末附数据集),先经过经验模态EMD分解,然后通过数据预处理,制作和加载数据集与标签,最后通过Pytorch实现EMD-Transformer模型对风速数据的预测。风速数据集的详细介绍可以参考下文:
- import pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- import matplotlib
- matplotlib.rc("font", family='Microsoft YaHei')
-
- # 读取已处理的 CSV 文件
- df = pd.read_csv('wind_speed.csv' )
- # 取风速数据
- winddata = df['Wind Speed (km/h)'].tolist()
- winddata = np.array(winddata) # 转换为numpy
- # 可视化
- plt.figure(figsize=(15,5), dpi=100)
- plt.grid(True)
- plt.plot(winddata, color='green')
- plt.show()
- from PyEMD import EMD
-
- # 创建 EMD 对象
- emd = EMD()
- # 对信号进行经验模态分解
- IMFs = emd(winddata)
-
- # 可视化
- plt.figure(figsize=(20,15))
- plt.subplot(len(IMFs)+1, 1, 1)
- plt.plot(winddata, 'r')
- plt.title("原始信号")
-
- for num, imf in enumerate(IMFs):
- plt.subplot(len(IMFs)+1, 1, num+2)
- plt.plot(imf)
- plt.title("IMF "+str(num+1), fontsize=10)
- # 增加第一排图和第二排图之间的垂直间距
- plt.subplots_adjust(hspace=0.8, wspace=0.2)
- plt.show()
- # 加载数据
- 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_set')
- train_label = load('train_label')
- # 测试集
- test_set = load('test_set')
- test_label = load('test_label')
-
- # 加载数据
- 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, 10, 7], batch_size=64, 维度10维代表10个分量,7代表序列长度(滑动窗口取值)。
- # 定义模型参数
- batch_size = 64
- input_len = 7 # 输入序列长度为7 (窗口值)
- input_dim = 10 # 输入维度为10个分量
- hidden_dim = 100 # Transformer隐层维度
- num_layers = 4 # 编码器层数
- num_heads = 2 # 多头注意力头数
- output_size = 1 # 单步输出
-
- model = EMDTransformerModel(batch_size, input_len, input_dim, hidden_dim, num_layers, num_heads, output_size=1)
-
- # 定义损失函数和优化函数
- model = model.to(device)
- loss_function = nn.MSELoss() # loss
- learn_rate = 0.0003
- optimizer = torch.optim.Adam(model.parameters(), learn_rate) # 优化器
训练结果
采用两个评价指标:MSE 与 MAE 对模型训练进行评价,100个epoch,MSE 为0.01627,MAE 为 0.0005549,EMD-Transformer预测效果良好,适当调整模型参数,还可以进一步提高模型预测表现。EMD-Transformer参数量不到LSTM模型的十分之一,效果相近,可见EMD-Transformer性能的优越性。
注意调整参数:
可以适当增加Transformer堆叠编码器层数和隐藏层的维度,微调学习率;
调整多头注意力头数,增加更多的 epoch (注意防止过拟合)
可以改变滑动窗口长度(设置合适的窗口长度)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。