PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)

目录

  • I. 前言
  • II. 多步预测
    • 2.1 直接多输出
    • 2.2 单步滚动预测
    • 2.3 多模型单步预测
    • 2.4 多模型滚动输出
    • 2.5 seq2seq预测
  • III. 实验

I. 前言

系列文章:

  1. 深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)
  2. PyTorch搭建LSTM实现时间序列预测(负荷预测)
  3. PyTorch搭建LSTM实现多变量时间序列预测(负荷预测)
  4. PyTorch搭建LSTM实现多变量多步长时间序列预测(负荷预测)
  5. PyTorch搭建双向LSTM实现时间序列预测(负荷预测)
  6. PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)

在PyTorch搭建LSTM实现多变量多步长时间序列预测(负荷预测)中我简单实现了一下LSTM的多变量多步预测,其中LSTM搭建如下:

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[0], input_seq[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))
        pred = self.linear(output)
        pred = pred[:, -1, :]
        
        return pred

可以看到,在得到output之后我直接将其经过一个线性层,将单个输出转成了多个输出,这种方法的优点是比较简单,但可能没有考虑到时间序列之间的相关性,而是直接将其变成了一个非线性转换问题。下面我总结一下常见的五种多步预测方法。

II. 多步预测

2.1 直接多输出

这种方法也就是我之前那篇文章所使用的方法,输入经过LSTM之后,得到的输出是:

output(batch_size, seq_len, num_directions * hidden_size)

此时再经过一个线性层:

Linear(num_directions * hidden_size, output_size)

就变成了:

(batch_size, seq_len, output_size)

然后根据时间序列预测下一个的原理,我们直接取最后一个seq即可:

pred = pred[:, -1, :]

2.2 单步滚动预测

我们遵循LSTM的原理,每次只预测单个,比如前10个预测后3个:我们首先利用[1…10]预测[11’],然后利用[2…10 11’]预测[12’],最后再利用[3…10 11’ 12’]预测[13’],也就是为了得到多个预测输出,我们直接预测多次。这种方法的缺点是显而易见的:由于每一步的预测都有误差,将有误差的预测值带入进行预测后往往会造成更大的误差,让误差传递。利用这种方式预测到后面通常预测值就完全不变了。

2.3 多模型单步预测

比如前10个预测后3个,那么我们可以训练三个模型分别根据[1…10]预测[11]、[12]以及[13]。也就是说如果需要进行n步预测,那么我们一共需要训练n个LSTM模型,缺点很突出。

2.4 多模型滚动输出

这种方式是2.2和2.3的结合,还是以前10个预测后3个为例:按照2.3中描述训练三个模型,首先模型1利用[1…10]预测[11’],然后模型2利用[2…10 11’]预测[12’],最后由模型3利用[3…10 11’ 12’]预测[13’]。

2.5 seq2seq预测

和直接多输出有点类似,但采用编码器-解码器结构来进行训练。

III. 实验

实验和代码等忙完毕设再慢慢补充。

你可能感兴趣的:(DL,lstm,pytorch,时间序列预测,多步长预测,负荷预测)