协变量¶
关于过去和未来协变量的部分适用于 darts 0.15.0 及更高版本。关于静态协变量的部分适用于 darts 0.20.0 及更高版本。
总结 - 太长不看版¶
在 Darts 中,协变量是指可用作模型输入以帮助改进预测的外部数据。在预测模型的上下文中,目标是要预测的序列,而协变量本身不被预测。我们区分三种协变量:
过去协变量(根据定义)是仅已知到过去的数据(例如测量值)
未来协变量(根据定义)是已知到未来的数据(例如天气预报)
静态协变量(根据定义)是随时间推移保持不变的数据(例如产品 ID)。请查看我们的静态协变量示例 notebook 此处了解更多信息。
Darts 中的模型在其 fit()
和 predict()
方法中接受 past_covariates
和/或 future_covariates
,具体取决于它们的能力(有些模型根本不接受协变量)。目标和协变量都必须是 TimeSeries
对象。如果使用了不支持的协变量,模型将引发错误。
# create one of Darts' forecasting models
model = SomeForecastingModel(...)
# fitting model with past and future covariates
model.fit(target=target,
past_covariates=past_covariates_train,
future_covariates=future_covariates_train)
# predict the next n=12 steps
model.predict(n=12,
series=target, # only required for Global Forecasting Models
past_covariates=past_covariates_pred,
future_covariates=future_covariates_pred)
与过去和未来协变量不同,静态协变量必须嵌入到目标序列中。因此,使用静态协变量的方法有所不同。您可以在此示例中查看如何使用静态协变量。
如果您有多个协变量变量希望用作过去(或未来)协变量,则必须将所有变量 stack()
到单个 past_covariates
(或 future_covariates
)对象中。
# stack two TimeSeries with stack()
past_covariates = past_covariates.stack(other_past_covariates)
# or with concatenate()
from darts import concatenate
past_covariates = concatenate([past_covariates, other_past_covariates], axis=1)
Darts 的预测模型期望每个目标序列对应一个过去和/或未来协变量序列。如果将多个目标序列与 Darts 的全局预测模型之一一起使用,则必须为 fit()
提供相同数量的对应协变量。
# fit using multiple (two) target series
model.fit(target=[target, target_2],
past_covariates=[past_covariates, past_covariates_2],
# optional future_covariates,
)
# you must give the specific target and covariate series that you want to predict
model.predict(n=12,
series=target_2,
past_covariates=past_covariates_2,
# optional future_covariates,
)
如果您使用 past_covariates
训练模型,则在预测时也必须向 predict()
提供这些 past_covariates
。这同样适用于 future_covariates
,但需要注意一点,future_covariates
在预测时必须向未来延伸足够远(一直到预测范围 n
)。这可以在下图中看到。past_covariates
需要包含至少与 target
相同的时间步,而 future_covariates
必须包含至少与 target
相同的时间跨度以及额外的 n
个预测范围时间步。
如果它们包含所需的时间跨度,您可以使用相同的 ``*_covariates`` 进行训练和预测。

图 1:预测模型如何与目标和协变量配合进行预测(预测范围 n=2)的高层摘要
还有一些额外的细节可能值得了解。例如,Darts 中的深度学习模型通常可以一次预测 output_chunk_length
个点。但是,如果 past_covariates
已知足够远,则使用过去协变量训练的模型仍然可以对某个范围 n > output_chunk_length
进行预测。在这种情况下,通过使用过去协变量的未来值并在目标序列上使用自回归来获得预测。如果您想了解更多详细信息,请继续阅读。
介绍 - 什么是协变量(在 Darts 中)?¶
过去、未来和静态协变量提供了额外的信息/上下文,这有助于改进对 target
序列的预测。target
序列是我们希望预测未来的变量。我们不预测协变量本身,仅将其用于预测 target
。
过去和未来协变量包含关于过去(包括当前时间)或未来的信息。这始终相对于预测点(时间),在此之后我们希望预测未来。在 Darts 中,我们将这两种类型称为 past_covariates
和 future_covariates
。
静态协变量包含关于 target
序列的与时间无关(常数/静态)的信息。我们将它们称为 static_covariates
。它们必须嵌入到 target
序列中。使用静态协变量的方法与使用过去或未来协变量略有不同。查看我们的关于静态协变量的 notebook 了解更多信息。
Darts 的预测模型对 *_covariates
有不同的支持模式。有些根本不支持协变量,有些仅支持过去或未来协变量,有些甚至支持所有三种(更多信息请参见本小节)。
我们来看一些过去、未来和静态协变量的示例
past_covariates
:通常是测量值(过去数据)或时间属性日平均测量温度(仅过去已知)
星期几、月份、年份等
future_covariates
:通常是预测值(未来已知数据)或时间属性日平均预测温度(未来已知)
星期几、月份、年份等
static_covariates
:与时间无关/常数/静态的target
特征分类
target
的位置(国家、城市等名称)target
标识符:(产品 ID、商店 ID 等)
数值
target
所在国家/市场区域的人口(假定在预测范围内保持不变)target
所在区域的平均温度(假定在预测范围内保持不变)
时间属性非常有用,因为它们是提前已知的,可以帮助模型捕获 target
序列的趋势和/或季节性模式。静态属性在处理多个 target
时非常有用(无论是多个 TimeSeries
,还是包含多个维度的多元序列)。与时间无关的信息可以帮助模型识别基础序列的性质/环境,并改进对不同 targets
的预测。
在本指南中,我们将重点介绍过去和未来协变量。这里有一个简单的经验法则,可以帮助您判断序列是过去协变量还是未来协变量
如果值是提前已知的,则它们是未来协变量(或可用作过去协变量)。如果不是,则它们必须是过去协变量。
您可能会想到一些情况,例如您只想训练一个仅支持 past_covariates
的模型(例如 TCNModel
,参见表 1)。在这种情况下,您可以将预测温度用作模型的过去协变量,即使您也可以访问未来的温度预测。了解此类“过去协变量的未来值”可以让您对更远的未来进行预测(对于 Darts 中预测范围 n > output_chunk_length
的深度学习模型)。类似地,大多数使用未来协变量的模型也可以使用“未来协变量的历史值”。
旁注:如果您没有未来值(例如测量温度),没有什么能阻止您应用 Darts 的预测模型之一来预测未来温度,然后将其用作 future_covariates
。Darts 不会尝试为您预测协变量,因为这将引入一个额外的“隐藏”建模步骤,我们认为最好留给用户自行处理。
预测模型协变量支持¶
Darts 的预测模型根据自身能力,在其 fit()
和 predict()
方法中接受可选的 past_covariates
和/或 future_covariates
(以及嵌入在 target
序列中的 static_covariates
)。表 1 显示了每个模型支持的协变量类型。如果使用了不支持的协变量,模型将引发错误。
本地预测模型 (LFMs):¶
LFM 是只能在单个目标序列上训练的模型。在 Darts 中,此类模型大多是更简单的统计模型(如 ETS 或 ARIMA)。LFM 仅接受单个 target
(和协变量)时间序列,并且通常在调用 fit()
时对您提供的整个序列进行一次性训练。它们还可以在训练序列结束后对任意数量的预测 n
进行一次性预测。
全局预测模型 (GFMs)¶
GFM 是可以在多个目标(和协变量)时间序列上训练的模型。与 LFM 不同,GFM 对输入数据进行固定长度的子样本(块)训练和预测。在 Darts 中,这些是全局(朴素)基线模型、回归模型、基于 PyTorch (Lightning) 的模型(神经网络)以及集成模型(取决于其集成模型和/或它们集成的预测模型)。
模型 |
过去协变量 |
未来协变量 |
静态协变量 |
---|---|---|---|
本地预测模型 (LFMs) |
|||
朴素基线 (a) |
|||
✅ |
|||
✅ |
|||
✅ |
|||
✅ |
|||
FFT (快速傅里叶变换) |
|||
✅ |
|||
Croston 方法 |
✅ |
||
✅ |
|||
✅ |
|||
✅ |
|||
✅ |
|||
✅ |
|||
✅ |
|||
✅ |
|||
全局预测模型 (GFMs) |
|||
全局朴素基线 (b) |
|||
回归模型 (c) |
✅ |
✅ |
✅ |
RNNModel (d) |
✅ |
||
BlockRNNModel (e) |
✅ |
||
✅ |
|||
✅ |
|||
✅ |
|||
✅ |
|||
✅ |
✅ |
✅ |
|
✅ |
✅ |
✅ |
|
✅ |
✅ |
✅ |
|
✅ |
✅ |
✅ |
|
✅ |
✅ |
✅ |
|
集成模型 (f) |
✅ |
✅ |
✅ |
保形预测模型 (g) |
✅ |
✅ |
✅ |
表 1:Darts 的预测模型及其协变量支持
朴素基线包括 NaiveDrift、NaiveMean、NaiveMovingAverage 和 NaiveSeasonal。
全局朴素基线包括 GlobalNaiveAggregate、GlobalNaiveDrift 和 GlobalNaiveSeasonal。
回归模型包括 RegressionModel、LinearRegressionModel、RandomForest、LightGBMModel、XGBModel 和 CatBoostModel。RegressionModel 是一种特殊的 GFM,它可以使用协变量(过去和/或未来)和过去目标的任意滞后进行预测。
RNNModel 包括
LSTM
和GRU
;在其概率版本中等同于 DeepARBlockRNNModel 包括
LSTM
和GRU
集成模型包括 RegressionEnsembleModel 和 NaiveEnsembleModel。协变量支持由被集成的预测模型的协变量支持决定。
保形预测模型包括 ConformalNaiveModel 和 ConformalQRModel。协变量支持由基础预测模型的协变量支持决定。
如何将过去协变量和/或未来协变量与 Darts 的预测模型结合使用的快速指南¶
在 Darts 的预测模型中使用协变量非常简单。只需要满足一些要求。
就像 target
序列一样,您的每个过去和/或未来协变量序列都必须是一个 TimeSeries
对象。当您使用过去和/或未来协变量通过 fit()
训练模型时,必须向 predict()
提供相同类型的协变量。根据您选择的模型以及预测范围 n
的长短,您的协变量可能需要不同的时间跨度。您可以在下一小节中找到这些要求。
如果它们包含所需的时间跨度,您甚至可以将相同的 ``*_covariates`` 用于拟合和预测。这是因为 Darts 会根据目标时间轴为您“智能地”对其进行切片。
# create one of Darts' forecasting model
model = SomeForecastingModel(...)
# fit the model
model.fit(target,
past_covariates=past_covariate,
future_covariates=future_covariates)
# make a prediction with the same covariate types
pred = model.predict(n=1,
series=target, # this is only required for GFMs
past_covariates=past_covariates,
future_covariates=future_covariates)
要将多个过去和/或未来协变量与您的 target
一起使用,您必须将它们全部堆叠到一个单独的 TimeSeries
中
# stack() time series
past_covariates = past_covariates.stack(past_covariates2)
# or concatenate()
from darts import concatenate
past_covariates = concatenate([past_covariates, past_covariates2, ...], axis=1)
GFM 可以在多个 target
序列上进行训练。您必须为通过 fit()
使用的每个 target
TimeSeries 提供一个协变量 TimeSeries。在预测时,您必须指定要预测哪个 target
序列并提供相应的协变量
from darts.models import NBEATSModel
# multiple time series
all_targets = [target1, target2, ...]
all_past_covariates = [past_covariates1, past_covariates2, ...]
# create a GFM model, train and predict
model = NBEATSModel(input_chunk_length=1, output_chunk_length=1)
model.fit(all_targets,
past_covariates=all_past_covariates)
pred = model.predict(n=1,
series=all_targets[0],
past_covariates=all_past_covariates[0])
本地和全局预测模型对协变量时间跨度的要求¶
Darts 的“本地”和“全局”预测模型在训练和预测方面存在差异。具体来说,它们在 fit() 和 predict() 期间如何提取/处理提供的数据。
根据您使用的模型以及预测范围 n
的长短,您的协变量可能需要不同的时间跨度。
本地预测模型 (LFMs):¶
LFM 通常在调用 fit()
时对您提供的整个 target
和 future_covariates
序列(如果支持)进行一次性训练。它们还可以在 target
结束后对预测范围 n
进行一次性预测。
将相同的未来协变量序列同时用于 ``fit()`` 和 ``predict()`` 的时间跨度要求
future_covariates
:至少与target
相同的时间跨度,外加target
结束后额外的n
个时间步
全局预测模型 (GFMs):¶
GFM 对 target
和 *_covariates
序列(如果支持)的固定长度块(子样本)进行训练和预测。每个块包含一个输入块(代表样本的过去)和一个输出块(样本的未来)。这些块的长度必须在模型创建时使用参数 input_chunk_length
和 output_chunk_length
指定(一个值得注意的例外是 RNNModel
,它总是使用 output_chunk_length
为 1)。
根据您的预测范围 n
,模型可以一次性预测,也可以通过对未来的多个块进行预测来进行自回归预测。这就是为什么在使用 past_covariates
进行预测时,您必须提供额外的“您的 past_covariates
的未来值”。
将相同的过去和/或未来协变量序列同时用于 ``fit()`` 和 ``predict()`` 的时间跨度要求
当
n <= output_chunk_length
时past_covariates
:至少与target
相同的时间跨度future_covariates
:至少与target
相同的时间跨度,外加target
结束后额外的output_chunk_length
个时间步
当
n > output_chunk_length
时past_covariates
:至少与target
相同的时间跨度,外加target
结束后额外的n - output_chunk_length
个时间步future_covariates
:至少与target
相同的时间跨度,外加target
结束后额外的n
个时间步
如果您想了解有关全局预测模型中协变量如何在幕后使用的更多详细信息,请阅读我们的Torch 预测模型指南(基于 PyTorch 的 GFM)。它逐步解释了使用我们的一个 Torch 预测模型的训练和预测过程。
示例¶
这里有一些示例展示如何在 Darts 预测模型中使用协变量