PyTorch搭建LSTM实现多变量多步长时间序列预测(一):直接多输出

39 篇文章 204 订阅
36 篇文章 147 订阅

I. 前言

在前面的两篇文章PyTorch搭建LSTM实现时间序列预测(负荷预测)PyTorch搭建LSTM实现多变量时间序列预测(负荷预测)中,我们利用LSTM分别实现了单变量单步长时间序列预测和多变量单步长时间序列预测。

本篇文章主要考虑用PyTorch搭建LSTM实现多变量多步长时间序列预测。

系列文章:

  1. 深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)
  2. PyTorch搭建LSTM实现时间序列预测(负荷预测)
  3. PyTorch中利用LSTMCell搭建多层LSTM实现时间序列预测
  4. PyTorch搭建LSTM实现多变量时间序列预测(负荷预测)
  5. PyTorch搭建双向LSTM实现时间序列预测(负荷预测)
  6. PyTorch搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
  7. PyTorch搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
  8. PyTorch搭建LSTM实现多变量多步长时间序列预测(三):多模型单步预测
  9. PyTorch搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
  10. PyTorch搭建LSTM实现多变量多步长时间序列预测(五):seq2seq
  11. PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)
  12. PyTorch-LSTM时间序列预测中如何预测真正的未来值
  13. PyTorch搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
  14. PyTorch搭建ANN实现时间序列预测(风速预测)
  15. PyTorch搭建CNN实现时间序列预测(风速预测)
  16. PyTorch搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
  17. PyTorch搭建Transformer实现多变量多步长时间序列预测(负荷预测)
  18. PyTorch时间序列预测系列文章总结(代码使用方法)
  19. TensorFlow搭建LSTM实现时间序列预测(负荷预测)
  20. TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
  21. TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)
  22. TensorFlow搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
  23. TensorFlow搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
  24. TensorFlow搭建LSTM实现多变量多步长时间序列预测(三):多模型单步预测
  25. TensorFlow搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
  26. TensorFlow搭建LSTM实现多变量多步长时间序列预测(五):seq2seq
  27. TensorFlow搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
  28. TensorFlow搭建ANN实现时间序列预测(风速预测)
  29. TensorFlow搭建CNN实现时间序列预测(风速预测)
  30. TensorFlow搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
  31. PyG搭建图神经网络实现多变量输入多变量输出时间序列预测
  32. PyTorch搭建GNN-LSTM和LSTM-GNN模型实现多变量输入多变量输出时间序列预测
  33. PyG Temporal搭建STGCN实现多变量输入多变量输出时间序列预测
  34. 时序预测中Attention机制是否真的有效?盘点LSTM/RNN中24种Attention机制+效果对比
  35. 详解Transformer在时序预测中的Encoder和Decoder过程:以负荷预测为例
  36. (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  37. PyTorch搭建Informer实现长序列时间序列预测
  38. PyTorch搭建Autoformer实现长序列时间序列预测

II. 数据处理

数据集为某个地区某段时间内的电力负荷数据,除了负荷以外,还包括温度、湿度等信息。

本文中,我们根据前24个时刻的负荷以及该时刻的环境变量来预测接下来4个时刻的负荷(步长可调)。

任意输出其中一条数据:

(tensor([[0.5830, 1.0000, 0.9091, 0.6957, 0.8333, 0.4884, 0.5122],
        [0.6215, 1.0000, 0.9091, 0.7391, 0.8333, 0.4884, 0.5122],
        [0.5954, 1.0000, 0.9091, 0.7826, 0.8333, 0.4884, 0.5122],
        [0.5391, 1.0000, 0.9091, 0.8261, 0.8333, 0.4884, 0.5122],
        [0.5351, 1.0000, 0.9091, 0.8696, 0.8333, 0.4884, 0.5122],
        [0.5169, 1.0000, 0.9091, 0.9130, 0.8333, 0.4884, 0.5122],
        [0.4694, 1.0000, 0.9091, 0.9565, 0.8333, 0.4884, 0.5122],
        [0.4489, 1.0000, 0.9091, 1.0000, 0.8333, 0.4884, 0.5122],
        [0.4885, 1.0000, 0.9091, 0.0000, 1.0000, 0.3256, 0.3902],
        [0.4612, 1.0000, 0.9091, 0.0435, 1.0000, 0.3256, 0.3902],
        [0.4229, 1.0000, 0.9091, 0.0870, 1.0000, 0.3256, 0.3902],
        [0.4173, 1.0000, 0.9091, 0.1304, 1.0000, 0.3256, 0.3902],
        [0.4503, 1.0000, 0.9091, 0.1739, 1.0000, 0.3256, 0.3902],
        [0.4502, 1.0000, 0.9091, 0.2174, 1.0000, 0.3256, 0.3902],
        [0.5426, 1.0000, 0.9091, 0.2609, 1.0000, 0.3256, 0.3902],
        [0.5579, 1.0000, 0.9091, 0.3043, 1.0000, 0.3256, 0.3902],
        [0.6035, 1.0000, 0.9091, 0.3478, 1.0000, 0.3256, 0.3902],
        [0.6540, 1.0000, 0.9091, 0.3913, 1.0000, 0.3256, 0.3902],
        [0.6181, 1.0000, 0.9091, 0.4348, 1.0000, 0.3256, 0.3902],
        [0.6334, 1.0000, 0.9091, 0.4783, 1.0000, 0.3256, 0.3902],
        [0.6297, 1.0000, 0.9091, 0.5217, 1.0000, 0.3256, 0.3902],
        [0.5610, 1.0000, 0.9091, 0.5652, 1.0000, 0.3256, 0.3902],
        [0.5957, 1.0000, 0.9091, 0.6087, 1.0000, 0.3256, 0.3902],
        [0.6427, 1.0000, 0.9091, 0.6522, 1.0000, 0.3256, 0.3902]]), tensor([0.6360, 0.6996, 0.6889, 0.6434]))

数据格式为(X, Y)。其中X一共24行,表示前24个时刻的负荷值和该时刻的环境变量。Y一共四个值,表示需要预测的四个负荷值。需要注意的是,此时input_size=7,output_size=4

III. LSTM模型

这里采用了深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)中的模型:

class LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size, batch_size):
        super().__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.output_size = output_size
        self.num_directions = 1 # 单向LSTM
        self.batch_size = batch_size
        self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True)
        self.linear = nn.Linear(self.hidden_size, self.output_size)

    def forward(self, input_seq):
        batch_size, seq_len = input_seq.shape[0], input_seq.shape[1]
        h_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
        c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
        # output(batch_size, seq_len, num_directions * hidden_size)
        output, _ = self.lstm(input_seq, (h_0, c_0)) # output(5, 30, 64)
        pred = self.linear(output)  # (5, 30, 1)
        pred = pred[:, -1, :]  # (5, 1)
        return pred

IV. 训练和预测

训练和预测代码和前几篇都差不多,只是需要注意input_size和output_size的大小。

训练了50轮,预测接下来4个时刻的负荷值,MAPE为7.62%:
在这里插入图片描述

V. 源码及数据

后面将陆续公开~

  • 44
    点赞
  • 254
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 67
    评论
LSTM(长短期记忆网络)是一种循环神经网络(RNN)的变体,它在序列数据建模中表现出色。在电力负荷预测中,LSTM可以用于根据历史负荷数据来预测未来一段时间的负荷情况。 以下是使用Python进行LSTM电力负荷预测的示例代码: ```python import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler from keras.models import Sequential from keras.layers import LSTM, Dense # 读取负荷数据 data = pd.read_csv('load_data.csv') # 数据预处理 scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(data['load'].values.reshape(-1, 1)) # 划分训练集和测试集 train_size = int(len(scaled_data) * 0.8) train_data = scaled_data[:train_size, :] test_data = scaled_data[train_size:, :] # 创建训练集和测试集 def create_dataset(dataset, look_back=1): X, Y = [], [] for i in range(len(dataset) - look_back): X.append(dataset[i:(i + look_back), 0]) Y.append(dataset[i + look_back, 0]) return np.array(X), np.array(Y) look_back = 7 # 使用过去7天的负荷数据作为输入特征 train_X, train_Y = create_dataset(train_data, look_back) test_X, test_Y = create_dataset(test_data, look_back) # 调整输入数据的形状 train_X = np.reshape(train_X, (train_X.shape[0], train_X.shape[1], 1)) test_X = np.reshape(test_X, (test_X.shape[0], test_X.shape[1], 1)) # 构建LSTM模型 model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(look_back, 1))) model.add(LSTM(units=50)) model.add(Dense(units=1)) model.compile(optimizer='adam', loss='mean_squared_error') # 训练模型 model.fit(train_X, train_Y, epochs=100, batch_size=32) # 预测未来负荷 predicted_data = model.predict(test_X) predicted_data = scaler.inverse_transform(predicted_data) # 可视化预测结果 import matplotlib.pyplot as plt plt.plot(data['date'][train_size + look_back:], data['load'][train_size + look_back:], label='Actual') plt.plot(data['date'][train_size + look_back:], predicted_data, label='Predicted') plt.xlabel('Date') plt.ylabel('Load') plt.legend() plt.show() ``` 请注意,上述代码中的`load_data.csv`是包含日期和负荷数据的CSV文件。你需要将其替换为你自己的负荷数据文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值