时间序列⼯具库学习(5)Darts模块-多个时间序列、预训练模型和协变量的概
念和使⽤
1.实验⽬的
第一次历史性飞跃此笔记本⽤作以下⽬的:
在多个时间序列上训练单个模型
使⽤预训练模型获取训练期间未见的任何时间序列的预测
使⽤协变量训练和使⽤模型
2.导库
# fix python path if working locally
from utils import fix_pythonpath_if_working_locally
fix_pythonpath_if_working_locally()
import pandas as pd
import numpy as np
import torch
import matplotlib.pyplot as plt
dels import NBEATSModel
dels import*
from darts import TimeSeries
from darts.utils.timeries_generation import(
gaussian_timeries,
linear_timeries,
sine_timeries,
)
dels import(
黑木耳怎么吃RNNModel,
TCNModel,
TransformerModel,
NBEATSModel,
BlockRNNModel,
)
ics import mape, smape
from ansformers import Scaler
from darts.utils.timeries_generation import datetime_attribute_timeries
观怎么组词from darts.datats import AirPasngersDatat, MonthlyMilkDatat
%load_ext autoreload
%autoreload 2
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from darts import TimeSeries
from darts.datats import AirPasngersDatat,MonthlyMilkDatat
# for reproducibility
torch.manual_ed(1)
np.random.ed(1)
3.读取数据
从阅读两个时间序列开始——⼀个包含每⽉的航空乘客数量,另⼀个包含每头奶⽜每⽉的产奶量。这些时间序列彼此没有太⼤关系,只是它们都具有明显的年度周期性和上升趋势的⽉频率,并且(完全巧合)它们包含可⽐较数量级的值。
ries_air = AirPasngersDatat().load()
ries_milk = MonthlyMilkDatat().load()
ries_air.plot(label="Number of air pasngers")
ries_milk.plot(label="Pounds of milk produced per cow")
plt.legend()
4. 预处理
通常,神经⽹络倾向于在标准化/标准化数据上⼯作得更好。在这⾥,将使⽤Scaler该类来规范化 0 和 1 之间的时间序列:
from ansformers import Scaler
scaler_air, scaler_milk = Scaler(), Scaler()
ries_air_scaled = scaler_air.fit_transform(ries_air)面面垂直
ries_milk_scaled = scaler_milk.fit_transform(ries_milk)因式分解教学视频
ries_air_scaled.plot(label="air")
ries_milk_scaled.plot(label="milk")
plt.legend()
5.拆分数据集【训练集、验证集】
保留这两个系列的最后 36 个⽉作为验证:
美丽的旅程
train_air, val_air = ries_air_scaled[:-36], ries_air_scaled[-36:]
train_milk, val_milk = ries_milk_scaled[:-36], ries_milk_scaled[-36:]
6.全局预测模型
Darts 包含许多预测模型,但并⾮所有模型都可以在多个时间序列上进⾏训练。⽀持多系列训练的模型称为全局模型。⽬前有 5 个全局模型:
BlockRNN模型
RNN模型
时间卷积⽹络 (TCN)
N-Beats 模型
Transformer 模型
将区分两种时间序列:
⽬标时间序列是我们有兴趣预测的时间序列(鉴于其历史)
协变量时间序列是可能有助于预测⽬标序列的时间序列,但对预测不感兴趣。有时也称为外部数据。
进⼀步区分协变量系列,这取决于它们是否可以提前知道:
过去协变量表⽰其过去值在预测时已知的时间序列。这些通常是必须测量或观察的事情。
未来协变量表⽰其未来值在预测时间范围内已知的时间序列。例如,这些可以代表已知的未来假期或天⽓预报。
有些模型只使⽤过去的协变量,有些只使⽤未来的协变量,有些模型可能同时使⽤两者。
BlockRNNModel, TCNModel,NBEATSModel和TransformerModel都使⽤past_covariates。
RNNModel使⽤future_covariates。
上⾯列出的所有全局模型都⽀持多个序列的训练。此外,它们还都⽀持多变量序列。这意味着它们可以⽆缝地⽤于多维时间序列;⽬标系列可以包含⼀个(通常是这种情况)或多个维度。具有多个维度的时间序列实际上只是⼀个常规时间序列,其中每个时间戳的值是向量⽽不是标量。
例如,⽀持past_covariates的4个模型遵循 “块”架构 。它们包含⼀个神经⽹络,该⽹络以时间序列的块作为输⼊,并输出(预测的)未来时间序列的块。输⼊维数是⽬标序列的维数(组件),加上所有协变量的组件数——堆叠在⼀起。输出维数为⽬标序列的维数:
RNNModel的⼯作⽅式不同,以⼀种循环的⽅式(这也是它们⽀持未来协变量的原因)。 好消息是,作为⽤户,我们不需要太担⼼不同的模型类型和输⼊/输出维度。维度由模型基于训练数据⾃动推断出来,对过去或未来协变量的⽀持由past_covariates或future_covariates参数简单地处理。
在构建模型时,仍然需要指定两个重要参数:
input_chunk_length:这是模型的回溯窗⼝的长度;因此模型将通过读取前⾯的input_chunk_length点来计算每个输出。
Output_chunk_length:这是内部模型产⽣的输出(预测)的长度。然⽽**,“outer” dart模型** (例如,NBEATSModel、TCNModel等的模型)的predict()⽅法可以在更长的时间范围内被调⽤。在这些情况下,如果在超过output_chunk_length的范围内调⽤predict(),内部模型将被重复调⽤,以⼀种⾃回归
的⽅式依赖于它⾃⼰以前的输出。如果使⽤了past_covariates,它需要这些协变量提前⾜够长的时间被知道。
7.训练-预测-单变量
构建⼀个 N-BEATS 模型,该模型具有 24 个点 ( input_chunk_length=24) 的回溯窗⼝并预测接下来的 12 个点 ( output_chunk_length=12)。选择这些值,这样模型就会在过去的两年⾥,每次产⽣连续的预测。
这个模型可以像任何其他dart预测模型⼀样使⽤,适⽤于单个时间序列:
model_air = NBEATSModel(
input_chunk_length=24, output_chunk_length=12, n_epochs=200, random_state=0
)
model_air.fit(train_air, verbo=True)
和其他dart预测模型⼀样,可以通过调⽤predict()来获得预测。注意,下⾯,调⽤的窗⼝为36的predict
(),⽐模型内部output_chunk_length 为12的视界要长。这在这⾥不是问题——正如上⾯所解释的,在这种情况下,内部模型将被简单地称为⾃回归输出。在本例中,它将被调⽤三次,以便三个12点输出构成最后的36点预测——但所有这些都是在幕后透明地完成的。
pred = model_air.predict(n=36)
ries_air_scaled.plot(label="actual")
pred.plot(label="forecast")
plt.legend()
字符大全print("MAPE = {:.2f}%".format(mape(ries_air_scaled, pred)))
(1).训练过程【后台训练过程】
调⽤model_air.fit()时发⽣了什么呢?
为了训练内部神经⽹络,dart⾸先从提供的时间序列(在本例中为ries_air_scaled)中创建⼀个输⼊/输出⽰例数据集。有⼏种⽅法可以做到这⼀点,并且dart在dart .utils.data包中包含⼀些不同的数据集实现。备耕
默认情况下,NBEATSModel将实例化 ⼀个 darts.utils.data.PastCovariatesSequentialDatat,它只是构建序列中存在的所有连续的输⼊/输出⼦序列对(长度为input_chunk_length和output_chunk_length)。
对于长度为14的序列,input_chunk_length=4, output_chunk_length=2,它看起来如下:
对于这样的数据集,⼀系列长度为N的数据集会得到 N - input_chunk_length - output_chunk_length + 1个样本的“训练集”。在上⾯的⽰例中,我们有N=14, input_chunk_length=4和output_chunk_length=2,所以⽤于训练的样本数量是K = 9。在这种情况下,训练阶段包含对所有样本的完全遍历(可能包含⼏个⼩批量)。