协变量

关于过去和未来协变量的章节是为 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`` ,前提是它们包含所需的时间跨度。

figure0

图1:预测模型如何与目标和协变量一起工作以进行预测的顶层总结,预测范围 n=2

有一些额外的细微差别可能值得了解。例如,Darts 中的深度学习模型通常可以一次预测 output_chunk_length 个点。然而,如果已知未来足够远的 past_covariates,使用过去协变量训练的模型仍然可以对某些时间范围 n > output_chunk_length 进行预测。在这种情况下,预测是通过消耗未来值的过去协变量,并对目标序列进行自回归来获得的。如果你想了解更多细节,请继续阅读。

介绍 - 什么是协变量(在Darts中)?

过去、未来和静态协变量提供了额外的信息/上下文,这些信息/上下文可以用于改进对 target 序列的预测。target 序列是我们希望预测其未来的变量。我们不预测协变量本身,只使用它们来预测 target

过去和未来的协变量包含关于过去(直到并包括当前时间)或未来的信息。这总是相对于预测点(在时间上)之后的未来,我们希望预测未来。在 Darts 中,我们将这两种类型称为 past_covariatesfuture_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)

ARIMA

VARIMA 是一个用于时间序列预测的模型。

AutoARIMA 是一个自动ARIMA模型。

StatsForecastAutoArima

指数平滑

StatsforecastAutoETS

StatsforecastAutoCES

BATSTBATS

ThetaFourTheta

StatsForecastAutoTheta

Prophet 模型

FFT (快速傅里叶变换)

KalmanForecaster 是一个用于时间序列预测的卡尔曼滤波器模型。

Croston 方法

全球预测模型 (GFMs)

全局朴素基线 (b)

回归模型 (c)

RNNModel (d)

BlockRNNModel (e)

NBEATSModel 模型

NHiTSModel 模型

TCNModel 是一个用于时间序列预测的模型。

TransformerModel 模型

TFTModel 是一个用于时间序列预测的模型。

DLinearModel 是一个用于时间序列预测的模型。

NLinearModel

TiDEModel

TSMixerModel 是一个时间序列预测模型。

集成模型 (f)

表1:飞镖的预测模型及其协变量支持

  1. 朴素基线模型包括 NaiveDriftNaiveMeanNaiveMovingAverageNaiveSeasonal

  2. 全局朴素基线模型包括 GlobalNaiveAggregateGlobalNaiveDriftGlobalNaiveSeasonal

  3. 回归模型包括 RegressionModelLinearRegressionModelRandomForestLightGBMModelXGBModelCatBoostModel。RegressionModel 是一种特殊类型的 GFM,可以使用协变量的任意滞后(过去和/或未来)以及过去的目标来进行预测。

  4. RNNModel 包括 LSTMGRU ;在其概率版本中相当于 DeepAR

  5. BlockRNNModel 包括 LSTMGRU

  6. 集成模型包括 RegressionEnsembleModelNaiveEnsembleModel。协变量支持由集成预测模型的协变量支持提供。


如何使用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() 时一次性训练您提供的整个 targetfuture_covariates 序列(如果支持)。它们也可以在 target 结束后的预测范围内 n 一次性进行预测。

使用相同的未来协变量序列进行 ``fit()`` 和 ``predict()`` 的时间跨度要求:

  • future_covariates**至少**与 target 相同的时间跨度,再加上 target 结束后的下一个 n 个时间步

全球预测模型 (GFMs):

GFMs 在固定长度的块(子样本)上进行训练和预测,这些块来自 target*_covariates 系列(如果支持)。每个块包含一个输入块 - 代表样本的过去 - 和一个输出块 - 代表样本的未来。这些块的长度必须在模型创建时通过参数 input_chunk_lengthoutput_chunk_length 指定(一个显著的例外是 RNNModel,它总是使用长度为 1 的 output_chunk_length)。

根据你的预测范围 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 的全局预测模型)。它提供了使用我们的一个 Torch 预测模型进行训练和预测过程的逐步解释。

示例

以下是一些展示如何在Darts预测模型中使用协变量的示例: