Press "Enter" to skip to content

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

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

I. 前言

 

这篇文章总结一下前面提到的多步长预测的五种实现方式。

 

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.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, _ = 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. 源码及数据

 

后面将陆续公开~

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注