当前位置:   article > 正文

风速预测(四)基于Pytorch的EMD-Transformer模型_风力预测数据集

风力预测数据集

目录

前言

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

1.1 导入数据

1.2 EMD分解

2 数据集制作与预处理

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

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

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

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

3.2 定义EMD-Transformer预测模型

3.3 定义模型参数

3.4 模型训练

3.5 结果可视化


往期精彩内容:

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

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

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

前言

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

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

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

1.1 导入数据

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import matplotlib
  5. matplotlib.rc("font", family='Microsoft YaHei')
  6. # 读取已处理的 CSV 文件
  7. df = pd.read_csv('wind_speed.csv' )
  8. # 取风速数据
  9. winddata = df['Wind Speed (km/h)'].tolist()
  10. winddata = np.array(winddata) # 转换为numpy
  11. # 可视化
  12. plt.figure(figsize=(15,5), dpi=100)
  13. plt.grid(True)
  14. plt.plot(winddata, color='green')
  15. plt.show()

1.2 EMD分解

  1. from PyEMD import EMD
  2. # 创建 EMD 对象
  3. emd = EMD()
  4. # 对信号进行经验模态分解
  5. IMFs = emd(winddata)
  6. # 可视化
  7. plt.figure(figsize=(20,15))
  8. plt.subplot(len(IMFs)+1, 1, 1)
  9. plt.plot(winddata, 'r')
  10. plt.title("原始信号")
  11. for num, imf in enumerate(IMFs):
  12. plt.subplot(len(IMFs)+1, 1, num+2)
  13. plt.plot(imf)
  14. plt.title("IMF "+str(num+1), fontsize=10)
  15. # 增加第一排图和第二排图之间的垂直间距
  16. plt.subplots_adjust(hspace=0.8, wspace=0.2)
  17. plt.show()

2 数据集制作与预处理

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

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

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

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

  1. # 加载数据
  2. import torch
  3. from joblib import dump, load
  4. import torch.utils.data as Data
  5. import numpy as np
  6. import pandas as pd
  7. import torch
  8. import torch.nn as nn
  9. # 参数与配置
  10. torch.manual_seed(100) # 设置随机种子,以使实验结果具有可重复性
  11. device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  12. # 加载数据集
  13. def dataloader(batch_size, workers=2):
  14. # 训练集
  15. train_set = load('train_set')
  16. train_label = load('train_label')
  17. # 测试集
  18. test_set = load('test_set')
  19. test_label = load('test_label')
  20. # 加载数据
  21. train_loader = Data.DataLoader(dataset=Data.TensorDataset(train_set, train_label),
  22. batch_size=batch_size, num_workers=workers, drop_last=True)
  23. test_loader = Data.DataLoader(dataset=Data.TensorDataset(test_set, test_label),
  24. batch_size=batch_size, num_workers=workers, drop_last=True)
  25. return train_loader, test_loader
  26. batch_size = 64
  27. # 加载数据
  28. train_loader, test_loader = dataloader(batch_size)

3.2 定义EMD-Transformer预测模型

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

3.3 定义模型参数

  1. # 定义模型参数
  2. batch_size = 64
  3. input_len = 7 # 输入序列长度为7 (窗口值)
  4. input_dim = 10 # 输入维度为10个分量
  5. hidden_dim = 100 # Transformer隐层维度
  6. num_layers = 4 # 编码器层数
  7. num_heads = 2 # 多头注意力头数
  8. output_size = 1 # 单步输出
  9. model = EMDTransformerModel(batch_size, input_len, input_dim, hidden_dim, num_layers, num_heads, output_size=1)
  10. # 定义损失函数和优化函数
  11. model = model.to(device)
  12. loss_function = nn.MSELoss() # loss
  13. learn_rate = 0.0003
  14. 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 结果可视化

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/215034
推荐阅读
相关标签
  

闽ICP备14008679号