风速预测(四)基于Pytorch的EMD-Transformer模型

目录

前言

[1 风速数据EMD分解与可视化](#1 风速数据EMD分解与可视化)

[1.1 导入数据](#1.1 导入数据)

[1.2 EMD分解](#1.2 EMD分解)

[2 数据集制作与预处理](#2 数据集制作与预处理)

[2.1 先划分数据集,按照8:2划分训练集和测试集](#2.1 先划分数据集,按照8:2划分训练集和测试集)

[2.2 设置滑动窗口大小为7,制作数据集](#2.2 设置滑动窗口大小为7,制作数据集)

[3 基于Pytorch的EMD-Transformer模型预测](#3 基于Pytorch的EMD-Transformer模型预测)

[3.1 数据加载,训练数据、测试数据分组,数据分batch](#3.1 数据加载,训练数据、测试数据分组,数据分batch)

[3.2 定义EMD-Transformer预测模型](#3.2 定义EMD-Transformer预测模型)

[3.3 定义模型参数](#3.3 定义模型参数)

[3.4 模型训练](#3.4 模型训练)

[3.5 结果可视化](#3.5 结果可视化)


往期精彩内容:

风速预测(一)数据集介绍和预处理

风速预测(二)基于Pytorch的EMD-LSTM模型

风速预测(三)EMD-LSTM-Attention模型

前言

本文基于前期介绍的风速数据(文末附数据集),先经过经验模态EMD分解,然后通过数据预处理,制作和加载数据集与标签,最后通过Pytorch实现EMD-Transformer模型对风速数据的预测。风速数据集的详细介绍可以参考下文:

风速预测(一)数据集介绍和预处理-CSDN博客

1 风速数据EMD分解与可视化

1.1 导入数据

python 复制代码
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()

1.2 EMD分解

python 复制代码
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()

2 数据集制作与预处理

2.1 先划分数据集,按照8:2划分训练集和测试集

2.2 设置滑动窗口大小为7,制作数据集

3 基于Pytorch的EMD-Transformer模型预测

3.1 数据加载,训练数据、测试数据分组,数据分batch

python 复制代码
# 加载数据
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)

3.2 定义EMD-Transformer预测模型

注意:输入风速数据形状为 [64, 10, 7], batch_size=64, 维度10维代表10个分量,7代表序列长度(滑动窗口取值)。

3.3 定义模型参数

python 复制代码
# 定义模型参数
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)  # 优化器

3.4 模型训练

训练结果

采用两个评价指标:MSE 与 MAE 对模型训练进行评价,100个epoch,MSE 为0.01627,MAE 为 0.0005549,EMD-Transformer预测效果良好,适当调整模型参数,还可以进一步提高模型预测表现。EMD-Transformer参数量不到LSTM模型的十分之一,效果相近,可见EMD-Transformer性能的优越性。

注意调整参数:

  • 可以适当增加Transformer堆叠编码器层数和隐藏层的维度,微调学习率;

  • 调整多头注意力头数,增加更多的 epoch (注意防止过拟合)

  • 可以改变滑动窗口长度(设置合适的窗口长度)

3.5 结果可视化

相关推荐
西安同步高经理5 小时前
秒表实现自动化测量助力时频测量行业发展、秒表检定仪、毫秒表测量仪
人工智能·算法
非著名架构师5 小时前
超级工程的“数字风洞”:高精度AI气象如何在数字孪生中预演台风、暴雪,确保重大基础设施全生命周期安全?
人工智能·智慧农业·灾害预警·galeweather.cn·ai气象模型·高精度农业气象
延凡科技5 小时前
延凡智慧水库系统:数字孪生+AI驱动水库安全与智能调度
人工智能·安全
magic_ll5 小时前
【yolo系列】yolov10的结构解析、一致性双重分配
人工智能
Christo35 小时前
2024《Three-way clustering: Foundations, survey and challenges》
人工智能·算法·机器学习·数据挖掘
言之。6 小时前
Claude Code IDE 集成工作原理详解
ide·人工智能
肥猪猪爸6 小时前
计算机视觉中的Mask是干啥的
图像处理·人工智能·深度学习·神经网络·目标检测·计算机视觉·视觉检测
yiersansiwu123d6 小时前
工程化破局,2025年AI大模型的价值兑现之路
人工智能
_codemonster6 小时前
自然语言处理容易混淆知识点(六)SentenceTransformer的训练参数
人工智能·自然语言处理
All The Way North-6 小时前
PyTorch ExponentialLR:按指数学习率衰减原理、API、参数详解、实战
pytorch·深度学习·学习率优化算法·按指数学习率衰减