TensorFlow搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)

I. 前言

前面已经写了很多关于时间序列预测的文章:

  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实现长序列时间序列预测

上面所有文章都是“单变量输出”,虽然某些文章中提到了“多变量”,但这个多变量只是输入多变量,而不是输出多变量。比如我们利用前24个时刻的[负荷、温度、湿度、压强]预测接下来12个时刻的负荷,此时输入为多变量,虽然有多个输出(多步长),但输出的都是同一变量。

那么有没有办法一次性输出多个变量呢?当然是可以的,在前几篇文章的评论中也有人提到了这个问题,当时我给出的回答是:“这样做效果很不好,不建议这么做”。

II. 多变量输入多变量输出

多变量输入自不必说,不了解的可以去看一下前面几篇文章。

多变量输出是指:我们一次性输出多个变量的预测值。比如我们利用前24小时的[负荷、温度、湿度、压强]预测接下来12个时刻的[负荷、温度、湿度、压强]。实际上,我们可以将多个变量的输出分解开来,看成多个任务,也就是多任务学习,其中每一个任务都是前面提到的多变量输入单变量输出

具体来讲,假设需要预测四个变量,输出在经过LSTM后得到output,我们将output分别通过四个全连接层,就能得到四个输出。得到四个输出后,我们就可以计算出四个损失函数,对这四个损失函数,本文将其简单求平均以得到最终的损失函数。关于如何组合多任务学习中的损失,已经有很多文献探讨过,感兴趣的可以自行了解。

III. 代码实现

3.1 数据处理

本次实验的数据集中包含三个地区的负荷值。

数据集:
在这里插入图片描述

依旧使用前24个时刻的三个变量预测后12个时刻的三个变量,数据处理同前面文章一致。

3.2 模型搭建

多输入多输出LSTM模型搭建如下:

class MTL_LSTM(keras.Model):
    def __init__(self, args):
        super().__init__()
        self.args = args
        self.lstm = layers.LSTM(units=args.hidden_size, input_shape=(args.seq_len, args.input_size),
                                activation='tanh', return_sequences=True)
        self.fc = layers.Dense(64, activation='relu')
        self.fc1 = layers.Dense(args.output_size)
        self.fc2 = layers.Dense(args.output_size)
        self.fc3 = layers.Dense(args.output_size)

    def call(self, input_seq):
        output = self.lstm(input_seq)
        output = self.fc(output)
        pred1, pred2, pred3 = self.fc1(output), self.fc2(output), self.fc3(output)
        pred1, pred2, pred3 = pred1[:, -1, :], pred2[:, -1, :], pred3[:, -1, :]
        
        return [pred1, pred2, pred3]

可以看到,由于需要预测三个变量,所以我们在模型中定义了三个全连接层。在得到LSTM的输出后,分别利用三个全连接层得到三个变量的输出,再将三个输出进行拼接,得到最后的pred,pred的shape为:

predict(n_outputs, batch_size, output_size)

其中n_outputs=3,表示一次性预测三个变量,output_size=12表示这里采用了PyTorch搭建LSTM实现多变量多步长时间序列预测(一):直接多输出中的策略,一次性输出接下来12个时刻的预测值,因为是直接多输出,所以这里pred_step_size=output_size。

3.3 模型训练/测试

模型训练中,经过预测后,我们得到的label和pred的shape分别为:

label(batch_size, n_outputs, pred_step_size)
pred((n_outputs, batch_size, pred_step_size))

由于需要对每一个output计算损失然后相加求平均,所以我们的损失函数求解如下:

total_loss = 0
for k in range(args.n_outputs):
    total_loss = total_loss + loss_function(labels[:, k, :], preds[k])
total_loss /= 3

即每次都取出一个output进行计算求和再平均。

3.4 实验结果

简单训练100轮,三个地区的负荷值预测结果如下所示:

变量负荷1负荷2负荷3
MAPE4.44%7.61%6.60%

在这里插入图片描述
效果一般。

IV. 源码及数据

后面将陆续公开~

  • 14
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
下面是一个使用PyTorch搭建LSTM进行多变量输入变量输出时间序列预测的示例代码,其中包含数据预处理、模型搭建、训练和预测部分。 首先,假设我们有一个包含多个变量的时间序列数据集,每个变量都有多个时间步。我们需要将数据集分成训练集和测试集,并对数据进行标准化处理,这里使用scikit-learn库中的MinMaxScaler进行归一化操作。 ```python import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler # 读取数据 data = pd.read_csv('data.csv', header=None) data = data.values # 分割数据集 train_size = int(len(data) * 0.8) train_data = data[:train_size] test_data = data[train_size:] # 标准化数据 scaler = MinMaxScaler(feature_range=(0, 1)) train_data = scaler.fit_transform(train_data) test_data = scaler.transform(test_data) ``` 接下来,我们需要将数据转换为输入输出对的形式,其中每个样本的输入包含多个时间步的多个变量输出为多个时间步的多个变量。我们可以定义一个函数来实现这个转换过程。 ```python def create_dataset(dataset, lookback=1, lookahead=1): X, Y = [], [] for i in range(len(dataset)-lookback-lookahead+1): X.append(dataset[i:(i+lookback), :]) Y.append(dataset[(i+lookback):(i+lookback+lookahead), :]) return np.array(X), np.array(Y) # 转换数据 lookback = 10 lookahead = 5 trainX, trainY = create_dataset(train_data, lookback, lookahead) testX, testY = create_dataset(test_data, lookback, lookahead) ``` 接下来,我们可以使用PyTorch搭建LSTM模型。这里使用两层LSTM,每层有64个隐藏单元。注意,输入输出的形状需要与数据集的形状相匹配。 ```python import torch import torch.nn as nn class LSTM(nn.Module): def __init__(self, input_size, output_size, hidden_size, num_layers): super().__init__() self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) out = self.fc(out[:, -1, :]) return out # 定义模型 input_size = trainX.shape[-1] output_size = trainY.shape[-1] hidden_size = 64 num_layers = 2 model = LSTM(input_size, output_size, hidden_size, num_layers) ``` 然后,我们需要定义损失函数和优化器。这里使用均方误差损失函数和Adam优化器。 ```python criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 现在,我们可以开始训练模型了。训练过程中,我们使用批量梯度下降来更新模型参数。在每个epoch结束时,我们对模型在测试集上的表现进行评估。 ```python # 训练模型 num_epochs = 100 batch_size = 64 train_loss = [] test_loss = [] for epoch in range(num_epochs): # 训练模型 model.train() for i in range(0, len(trainX), batch_size): optimizer.zero_grad() inputs = torch.tensor(trainX[i:i+batch_size]).float() targets = torch.tensor(trainY[i:i+batch_size]).float() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() train_loss.append(loss.item()) # 测试模型 model.eval() with torch.no_grad(): inputs = torch.tensor(testX).float() targets = torch.tensor(testY).float() outputs = model(inputs) loss = criterion(outputs, targets) test_loss.append(loss.item()) # 打印损失 print('Epoch [{}/{}], Train Loss: {:.4f}, Test Loss: {:.4f}' .format(epoch+1, num_epochs, train_loss[-1], test_loss[-1])) ``` 最后,我们可以使用训练好的模型进行预测。注意,预测过程中需要将标准化后的输出重新还原为原始数据。 ```python # 预测模型 model.eval() with torch.no_grad(): inputs = torch.tensor(testX).float() outputs = model(inputs) preds = scaler.inverse_transform(outputs.numpy()) ``` 这就是使用PyTorch搭建LSTM进行多变量输入变量输出时间序列预测的完整过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cyril_KI

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

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

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

打赏作者

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

抵扣说明:

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

余额充值