【pytorch】時間序列預測 —— 同時預測多個分位點

部分參考

  • 《Multi-Horizon Time Series Forecasting with Temporal Attention Learning》
  • 《A Multi-Horizon Quantile Recurrent Forecaster》

這兩篇文章考慮的是多步預測的情形,多步預測在有外部協變量且未來輸入已知的情況下效果好一點,如果只有未知變量的歷史值,還是考慮做單步預測吧!否則只能通過迭代地執行單步預測(導致誤差累計)或者直接預測hh步之後的值(誤差大),效果不好,意義不大!

單變量單步預測的分位點損失

在這裏插入圖片描述

單變量多步預測的分位點損失

在這裏插入圖片描述

多變量多步預測的分位點損失

在這裏插入圖片描述

結果可視化

在這裏插入圖片描述

模型

該模型可實現變量單步分位點預測

import torch
import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self, n_val, window, hidRNN, quantiles = [0.5]):
        super(Model, self).__init__()
        self.use_cuda = True
        self.P = window  # 輸入窗口大小
        self.m = n_val  # 列數,變量數
        self.hidR = hidRNN
        self.quantiles = torch.tensor(quantiles)
        
        self.GRU = nn.GRU(self.m, self.hidR)
       
        self.linear = nn.Linear(self.hidR, self.m * len(quantiles))

 
    def forward(self, x):

        x1 = x.permute(1, 0, 2).contiguous()  # x1: [window, batch, n_val]
        _, h = self.GRU(x1)  # h: [1, batch, hidRNN]
        h = torch.squeeze(h,0)  # h: [batch, hidRNN]
        res =  self.linear(h)  # res: [batch, n_val * n_quantile]
        res = res.view(-1, len(self.quantiles), self.m)
        return res
    

    def MQLoss(self, pred, true):

        quantiles = self.quantiles.unsqueeze(1).expand(len(self.quantiles), self.m)

        true = true.view(-1, 1, self.m).expand(pred.shape)

        tau = torch.gt(pred, true).type(torch.FloatTensor) - quantiles
        loss = tau.mul(pred - true).sum()

        return loss
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章