一、LSTM
class LSTM(nn.Module):
def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):
super().__init__()
self.hidden_layer_size = hidden_layer_size
self.lstm = nn.LSTM(input_size, hidden_layer_size)
self.linear = nn.Linear(hidden_layer_size, output_size)
self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size),
torch.zeros(1,1,self.hidden_layer_size)) # (num_layers * num_directions, batch_size, hidden_size)
def forward(self, input_seq):
lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq) ,1, -1), self.hidden_cell)
predictions = self.linear(lstm_out.view(len(input_seq), -1))
return predictions[-1]
细节问题:
二、Transformer
transformer-time-series-prediction时序预测代码
三、Informer
大名鼎鼎的Informer,AAAI 2021 Best Paper提出的模型,是对Transformer的改进。
首先介绍一个新任务,LSTF(Long Sequence Time-Series Forecasting),即长序列预测任务。刚刚我们提到的LSTM模型,往往以滑动窗口(或动态解码)的形式做长序列预测,随着时间步的增长,预测误差会逐渐放大。
Informer2020原作者代码
args.seq_len = 48 # input sequence length of Informer encoder
args.label_len = 24 # start token length of Informer decoder
args.pred_len = 24 # prediction sequence length
代码中的以上参数配置表示:1~48时间步为encoder输入,25~72时间步为decoder输入(其中49~72时间步被置为0),25~72时间步为decoder输出。可以结合着下图来理解。
另一个容易混淆的参数是timeenc。timeenc = 0 if args.embed!=‘timeF’ else 1,如果timeenc为1,将考虑更多可能的周期信息。
四、一些重要的库
以下是一些学习过程中接触到的、关于时序任务的开源库的整理。
https://github.com/linkedin/luminol
luminol支持两大功能:时序异常检测、两条时间序列的相关性计算。
GitHub - jdb78/pytorch-forecasting: Time series forecasting with PyTorch
pytorch-forecasting是一个基于pytorch的时序预测库,内嵌了一系列模型,如LSTM、DeepAR、Transformer、N-BEATS等。
Anomaly Detection Toolkit (ADTK)
adtk提供了通过三大组件,提供基本的异常检测算法(Detector)、异常特征加工(Transformer)、处理流程控制(Aggregator)等功能。注意这里真的只是基本算法,例如在异常检测中,通过阈值/分位数/滑动窗口/自回归等方式判断异常,没有高级的检测模型。
https://github.com/alexminnaar/time-series-classification-and-clustering
https://github.com/FilippoMB/Time-series-classification-and-clustering-with-Reservoir-Computing
GitHub - wannesm/dtaidistance: Time series distances: Dynamic Time Warping (DTW)
tslearn’s documentation - tslearn 0.5.1.0 documentation
以上几个项目与时间序列聚类任务相关。
时间序列相关工具、模型、数据集汇总。