部分參考
- 《Multi-Horizon Time Series Forecasting with Temporal Attention Learning》
- 《A Multi-Horizon Quantile Recurrent Forecaster》
這兩篇文章考慮的是多步預測的情形,多步預測在有外部協變量且未來輸入已知的情況下效果好一點,如果只有未知變量的歷史值,還是考慮做單步預測吧!否則只能通過迭代地執行單步預測(導致誤差累計)或者直接預測步之後的值(誤差大),效果不好,意義不大!
單變量單步預測的分位點損失
單變量多步預測的分位點損失
多變量多步預測的分位點損失
結果可視化
模型
該模型可實現多變量單步的多分位點預測
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