协变量¶
关于过去和未来协变量的章节是为 darts 版本 0.15.0 及更高版本编写的。关于静态协变量的章节是为 darts 版本 0.20.0 及更高版本编写的。
总结 - 太长不看¶
在 Darts 中,协变量 指的是可以作为模型输入的外部数据,以帮助提高预测效果。在预测模型的背景下,目标 是将要预测的序列,而协变量本身不需要被预测。我们区分三种协变量:
过去协变量 根据定义,是仅在过去已知的协变量(例如测量值)
未来协变量 是(根据定义)未来已知的协变量(例如,天气预报)
静态协变量 是(根据定义)随时间不变的协变量(例如,产品ID)。更多信息请查看我们的静态协变量示例笔记本 这里。
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 必须至少包含相同的时间跨度加上额外的 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 序列中。使用静态协变量的方法与使用过去或未来协变量的方法略有不同。查看我们的 关于静态协变量的笔记本 以了解更多信息。
Darts 的预测模型对 *_covariates 的支持模式不同。有些完全不支持协变量,有些只支持过去或未来的协变量,还有一些甚至支持所有三种(更多信息请参见 本小节)。
让我们来看一些过去、未来和静态协变量的例子:
past_covariates:通常是测量数据(过去的数据)或时间属性每日平均**测量**温度(仅在过去已知)
星期几, 月份, 年份, …
future_covariates:通常是预测(未来的已知数据)或时间属性每日平均 预测 温度(未来已知)
星期几, 月份, 年份, …
static_covariates:时间无关/恒定/静态的target特征分类:
target的位置(国家、城市等名称)target标识符:(产品ID,商店ID,…)
数值:
target所在国家/市场区域的 人口(假设在预测期间保持不变)target区域的年平均温度(假设在整个预测期间保持不变)
时间属性之所以强大,是因为它们是提前已知的,并且可以帮助模型捕捉 目标 序列的趋势和/或季节性模式。静态属性在处理多个 目标 时非常强大(无论是多个 时间序列 ,还是包含多个维度的多元序列)。与时间无关的信息可以帮助模型识别基础序列的性质/环境,并提高不同 目标 的预测准确性。
在本指南中,我们将重点介绍过去和未来的协变量。以下是一个简单的经验法则,用于判断您的序列是**过去**还是**未来协变量**:
如果值是提前已知的,它们是未来协变量(或可以用作过去协变量)。如果不是,它们**必须**是过去协变量。
你可能会想到一些情况,你希望训练一个只支持 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):¶
LFMs 是只能在一个目标序列上训练的模型。在 Darts 中,这类模型大多是简单的统计模型(如 ETS 或 ARIMA)。LFMs 只接受一个 target``(和协变量)时间序列,并且在调用 ``fit() 时通常会对整个提供的序列进行训练。它们也可以在训练序列结束后一次性预测任意数量的预测 n。
全球预测模型 (GFMs)¶
GFMs 是可以在多个目标(和协变量)时间序列上训练的模型。与 LFMs 不同,GFMs 在输入数据的固定长度子样本(块)上进行训练和预测。在 Darts 中,这些是全球(朴素)基线模型、回归模型、基于 PyTorch(Lightning)的模型(神经网络),以及集成模型(取决于它们的集成模型和/或它们集成的预测模型)。
模型 |
过去协变量 |
未来协变量 |
静态协变量 |
|---|---|---|---|
本地预测模型 (LFMs) |
|||
朴素基线 (a) |
|||
✅ |
|||
VARIMA 是一个用于时间序列预测的模型。 |
✅ |
||
AutoARIMA 是一个自动ARIMA模型。 |
✅ |
||
✅ |
|||
✅ |
|||
Prophet 模型 |
✅ |
||
FFT (快速傅里叶变换) |
|||
KalmanForecaster 是一个用于时间序列预测的卡尔曼滤波器模型。 |
✅ |
||
Croston 方法 |
|||
全球预测模型 (GFMs) |
|||
全局朴素基线 (b) |
|||
回归模型 (c) |
✅ |
✅ |
✅ |
RNNModel (d) |
✅ |
||
BlockRNNModel (e) |
✅ |
||
NBEATSModel 模型 |
✅ |
||
NHiTSModel 模型 |
✅ |
||
TCNModel 是一个用于时间序列预测的模型。 |
✅ |
||
✅ |
|||
TFTModel 是一个用于时间序列预测的模型。 |
✅ |
✅ |
✅ |
DLinearModel 是一个用于时间序列预测的模型。 |
✅ |
✅ |
✅ |
✅ |
✅ |
✅ |
|
✅ |
✅ |
✅ |
|
TSMixerModel 是一个时间序列预测模型。 |
✅ |
✅ |
✅ |
集成模型 (f) |
✅ |
✅ |
✅ |
表1:飞镖的预测模型及其协变量支持
朴素基线模型包括 NaiveDrift、 NaiveMean、 NaiveMovingAverage和 NaiveSeasonal。
全局朴素基线模型包括 GlobalNaiveAggregate、 GlobalNaiveDrift和 GlobalNaiveSeasonal。
回归模型包括 RegressionModel、 LinearRegressionModel、 RandomForest、 LightGBMModel、 XGBModel和 CatBoostModel。RegressionModel 是一种特殊类型的 GFM,可以使用协变量的任意滞后(过去和/或未来)以及过去的目标来进行预测。
RNNModel 包括
LSTM和GRU;在其概率版本中相当于 DeepARBlockRNNModel 包括
LSTM和GRU集成模型包括 RegressionEnsembleModel和 NaiveEnsembleModel。协变量支持由集成预测模型的协变量支持提供。
如何使用Darts预测模型中的过去和/或未来协变量的快速指南¶
在 Darts 的预测模型中使用协变量非常简单。它们只需要满足一些要求。
就像 target 系列一样,你过去的和/或未来的每个协变量系列都必须是一个 TimeSeries 对象。当你使用 fit() 训练模型时,如果使用了过去和/或未来的协变量,你必须在 predict() 中提供相同类型的协变量。根据你选择的模型和你的预测范围 n 的长度,你的协变量可能有不同的时间跨度要求。你可以在 下一小节 中找到这些要求。
如果 ``*_covariates`` 包含所需的时间跨度,你甚至可以在拟合和预测中使用相同的 ``*_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)
GFMs 可以在多个 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):¶
LFMs 通常会在调用 fit() 时一次性训练您提供的整个 target 和 future_covariates 序列(如果支持)。它们也可以在 target 结束后的预测范围内 n 一次性进行预测。
使用相同的未来协变量序列进行 ``fit()`` 和 ``predict()`` 的时间跨度要求:
future_covariates:**至少**与target相同的时间跨度,再加上target结束后的下一个n个时间步
全球预测模型 (GFMs):¶
GFMs 在固定长度的块(子样本)上进行训练和预测,这些块来自 target 和 *_covariates 系列(如果支持)。每个块包含一个输入块 - 代表样本的过去 - 和一个输出块 - 代表样本的未来。这些块的长度必须在模型创建时通过参数 input_chunk_length 和 output_chunk_length 指定(一个显著的例外是 RNNModel,它总是使用长度为 1 的 output_chunk_length)。
根据你的预测范围 n,模型可以一次性预测,或者通过在未来多个块上进行预测来自回归。这就是为什么在使用 past_covariates 进行预测时,你必须提供额外的“past_covariates 的未来值”。
使用相同的过去和/或未来协变量序列进行 ``fit()`` 和 ``predict()`` 的时间跨度要求:
当
n <= output_chunk_length时:当
n > output_chunk_length时:
如果你想了解更多关于协变量在全局预测模型中幕后使用的细节,请阅读我们的 Torch 预测模型指南 (基于 PyTorch 的全局预测模型)。它提供了使用我们的一个 Torch 预测模型进行训练和预测过程的逐步解释。
示例¶
以下是一些展示如何在Darts预测模型中使用协变量的示例: