当前位置: 首页 > news >正文

用 Python 轻松实现时间序列预测:Darts 协变量 Covariates

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

Darts

Darts 是一个 Python 库,用于对时间序列进行用户友好型预测和异常检测。它包含多种模型,从 ARIMA 等经典模型到深度神经网络。所有预测模型都能以类似 scikit-learn 的方式使用 fit()predict() 函数。该库还可以轻松地对模型进行回溯测试,将多个模型的预测结果结合起来,并将外部数据考虑在内。Darts 支持单变量和多变量时间序列和模型。基于 ML 的模型可以在包含多个时间序列的潜在大型数据集上进行训练,其中一些模型还为概率预测提供了丰富的支持。

协变量

Covariates

与 past 和 future covariates 相关的章节适用于 darts 0.15.0 及以后版本。与 static covariates 相关的章节适用于 darts 0.20.0 及以后版本。

摘要

在 Darts 中,协变量(covariates)指可作为模型输入的外部数据,用于提升预测效果。在预测模型语境下,目标(target)是需要预测的序列,而协变量本身并不会被预测。我们区分三种协变量:

  • past covariates:按定义,仅已知过去值的协变量(如测量值)
  • future covariates:按定义,已知未来值的协变量(如天气预报)
  • static covariates:按定义,在时间轴上保持不变的协变量(如产品 ID)。更多信息请查看静态协变量示例 notebook。

Darts 的预测模型在其 fit()predict() 方法中接受 past_covariates 和/或 future_covariates,具体取决于模型能力(某些模型不接受任何协变量)。目标与协变量必须都是 TimeSeries 对象。如果使用了不被支持的协变量,模型将报错。

# 创建 Darts 预测模型之一
model = SomeForecastingModel(...)# 使用 past 与 future covariates 训练模型
model.fit(target=target,past_covariates=past_covariates_train,future_covariates=future_covariates_train)# 预测未来 n=12 步
model.predict(n=12,series=target,  # 仅 Global Forecasting Models 需要past_covariates=past_covariates_pred,future_covariates=future_covariates_pred)

不同于 past 与 future covariates,static covariates 必须嵌入到 目标 序列中。因此,使用 static covariates 的方法略有不同,可参考该示例了解用法。

如需将多个协变量作为 past(或 future)covariates 使用,需用 stack() 将它们合并为单个 past_covariates(或 future_covariates)对象:

# 使用 stack() 合并两个 TimeSeries
past_covariates = past_covariates.stack(other_past_covariates)# 或使用 concatenate()
from darts import concatenate
past_covariates = concatenate([past_covariates, other_past_covariates], axis=1)

Darts 的预测模型期望每个目标序列对应一个 past 和/或 future covariate 序列。若使用 Darts 的 Global Forecasting Models 训练多个目标序列,则必须向 fit() 提供相同数量的专用协变量:

# 使用两个目标序列训练
model.fit(target=[target, target_2],past_covariates=[past_covariates, past_covariates_2],# 可选 future_covariates,)# 预测时必须指定要预测的目标序列及其对应协变量
model.predict(n=12,series=target_2,past_covariates=past_covariates_2,# 可选 future_covariates,)

如果训练时使用了 past_covariates,预测时也必须在 predict() 中提供这些 past_covariatesfuture_covariates 同理,但需注意预测时 future_covariates 必须延伸到足够远的未来(直至预测期长 n)。如下图所示,past_covariates 至少需要与 target 相同的时间跨度,future_covariates 则需至少覆盖与 target 相同时间跨度外加 n 步未来。

只要时间跨度满足要求,你可在训练与预测阶段使用同一 *_covariates

img

图 1:预测期长 n=2 时,目标与协变量在预测模型中的顶层概览

另需注意,Darts 的深度学习模型通常每次预测 output_chunk_length 个时间点。然而,若模型训练时使用了 past covariates,且这些 past covariates 在未来也足够长,则可预测 n > output_chunk_length 的期长。此时通过消耗 past covariates 的未来值并对目标序列自回归完成预测。欲了解更多细节,请继续阅读。

简介 - Darts 中的协变量是什么?

Past、future 与 static covariates 提供额外信息/上下文,有助于提升对 target 序列的预测效果。target 序列是我们希望预测未来的变量;协变量本身不会被预测,仅用于预测 target

Past 与 future covariates 分别包含过去(含当前)或未来的信息,相对于我们未来预测时刻而言。
在 Darts 中,我们称这两种类型为 past_covariatesfuture_covariates

Static covariates 包含与 target 序列无关时间(恒定/静态)的信息,称为 static_covariates,必须嵌入在 target 序列中。使用 static covariates 的方式与 past/future covariates 略有不同,可查看相关 notebook 了解更多。

Darts 的预测模型对 *_covariates 的支持各异:有些不支持任何协变量,有些仅支持 past 或 future,有些支持全部三种(详见后文小节)。

以下是 past、future 与 static covariates 的示例:

  • past_covariates:通常为测量值(历史数据)或时间属性

    • 每日平均实测气温(仅过去已知)
    • 星期几、月份、年份……
  • future_covariates:通常为预报值(未来已知数据)或时间属性

    • 每日平均预报气温(未来已知)
    • 星期几、月份、年份……
  • static_covariates:与 target 无关时间/恒定/静态的特征

    • 类别型:
      • target 的位置(国家、城市……名称)
      • target 的标识符(产品 ID、门店 ID……)
    • 数值型:
      • target 所在国家/市场区域的人口(假设预测期内恒定)
      • target 所在地区的平均气温(假设预测期内恒定)

时间属性因其提前已知,可帮助模型捕捉 target 序列的趋势与/或季节性模式,效果显著。
静态属性在同时处理多个 target(多个 TimeSeries 或多变量序列)时尤为有效;这些与时间无关的信息可帮助模型识别底层序列的性质/环境,从而在不同 target 间提升预测效果。

本指南主要聚焦 past 与 future covariates。判断序列是 past 还是 future covariates 的简单经验法则:

如果数值提前已知,则为 future covariates(或可作为 past covariates);否则 必须 是 past covariates。

例如,若模型仅支持 past_covariates(如 TCNModel,见表 1),你仍可把预报的温度作为 past covariate 使用,即便你同时也拥有未来的温度预报。了解这些“past covariates 的未来值”可让你预测更远的未来(对 Darts 深度学习模型,当预测期长 n > output_chunk_length 时)。同样,大多数使用 future covariates 的模型也可使用“future covariates 的历史值”。

旁注:若你没有未来值(如实测气温的未来值),你完全可以用 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 以固定长度的子样本(chunks)进行训练与预测。在 Darts 中,这些模型包括全局(朴素)基线模型、回归模型、基于 PyTorch(Lightning)的模型(神经网络)以及部分集成模型(取决于其内部模型及/或参与集成的预测模型)。


ModelPast CovariatesFuture CovariatesStatic Covariates
Local Forecasting Models (LFMs)
Naive Baselines (a)
ARIMA
VARIMA
ExponentialSmoothing
TBATS
Theta 与 FourTheta
Prophet
FFT (快速傅里叶变换)
KalmanForecaster
Croston 方法
StatsForecastModel
AutoARIMA
AutoETS
AutoCES
AutoMFLES
AutoTBATS
AutoTheta
全局预测模型(GFMs)
Global Naive Baselines (b)
Regression Models ©
RNNModel (d)
BlockRNNModel (e)
NBEATSModel
NHiTSModel
TCNModel
TransformerModel
TFTModel
DLinearModel
NLinearModel
TiDEModel
TSMixerModel
Ensemble Models (f)
Conformal Prediction Models (g)

表 1:Darts 预测模型及其协变量支持

  1. Naive Baselines 包括 NaiveDrift、NaiveMean、NaiveMovingAverage 与 NaiveSeasonal。
  2. Global Naive Baselines 包括 GlobalNaiveAggregate、GlobalNaiveDrift 与 GlobalNaiveSeasonal。
  3. Regression Models 包括 SKLearnModel、LinearRegressionModel、RandomForestModel、LightGBMModel、XGBModel 与 CatBoostModel。SKLearnModel 是一种特殊的 GFM,可使用任意滞后协变量(past 和/或 future)与过去目标值进行预测。
  4. RNNModel 包括 LSTMGRU;其概率版等价于 DeepAR。
  5. BlockRNNModel 包括 LSTMGRU
  6. Ensemble Model 包括 RegressionEnsembleModel 与 NaiveEnsembleModel。其协变量支持取决于被集成模型的协变量支持。
  7. Conformal Prediction Model 包括 ConformalNaiveModel 与 ConformalQRModel。其协变量支持取决于底层预测模型。

在 Darts 预测模型中使用 past 和/或 future covariates 的快速指南

使用协变量非常简单,只需满足若干要求即可。

target 序列一样,每个 past 和/或 future covariate 序列必须是 TimeSeries 对象。当你用 fit() 训练模型并使用了 past 和/或 future covariates 时,在 predict() 中也必须提供相同类型的协变量。根据模型选择与预测期长 n,协变量时间跨度要求可能不同,详见下一小节。

只要时间跨度满足要求,你甚至可以在训练与预测阶段使用同一 *_covariates,因为 Darts 会基于目标时间轴“智能”切片。

# 创建 Darts 预测模型之一
model = SomeForecastingModel(...)# 训练模型
model.fit(target,past_covariates=past_covariate,future_covariates=future_covariates)# 用相同类型协变量进行预测
pred = model.predict(n=1,series=target,  # 仅 GFMs 需要past_covariates=past_covariates,future_covariates=future_covariates)

如需对 target 使用多个 past 和/或 future covariates,需将它们全部合并成一个专用 TimeSeries

# 使用 stack() 合并时间序列
past_covariates = past_covariates.stack(past_covariates2)# 或使用 concatenate()
from darts import concatenate
past_covariates = concatenate([past_covariates, past_covariates2, ...], axis=1)

GFMs 可在多个 target 序列上训练。你需为每个 fit() 使用的 target TimeSeries 提供一份对应的 covariate TimeSeries。预测时,需指定要预测的 target 序列并提供相应协变量:

from darts.models import NBEATSModel# 多个时间序列
all_targets = [target1, target2, ...]
all_past_covariates = [past_covariates1, past_covariates2, ...]# 创建 GFM 模型,训练并预测
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 的“局部”与“全局”预测模型在训练与预测时提取/使用所提供数据的方式有所不同。

根据所用模型与预测期长 n,协变量时间跨度要求可能不同。

局部预测模型(LFMs)

LFMs 通常在你调用 fit() 时一次性在整个 targetfuture_covariates(若支持)序列上训练,并可在训练序列结束后一次性预测期长 n

若要在 ``fit()`` 与 ``predict()`` 中使用同一 future covariates 序列,其时间跨度要求:

  • future_covariates至少target 相同的时间跨度,外加 target 结束后接下来的 n 个时间点。

全局预测模型(GFMs)

GFMs 在固定长度的 chunks(子样本)上训练与预测,每个 chunk 包含输入块(样本过去)与输出块(样本未来)。创建模型时通过 input_chunk_lengthoutput_chunk_length 指定块长度(RNNModel 例外,始终使用 output_chunk_length=1)。

根据预测期长 n,模型可一次性预测,或通过多步预测(未来多个 chunks)自回归完成。因此,当使用 past_covariates 预测时,你需提供其“未来值”。

若要在 ``fit()`` 与 ``predict()`` 中使用同一 past 和/或 future covariates 序列,其时间跨度要求:

  • 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 个时间点

如需了解 GFMs 内部如何使用协变量的更多细节,请阅读我们的 Torch Forecasting Models(基于 PyTorch 的 GFMs)指南,其中逐步解释了训练与预测流程。

示例

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

  • 静态协变量教程(含 TFTModel 示例)
  • 与 GFMs 使用 past covariates
  • 与 TFTModel 使用 past 与 future covariates
  • 与 SKLearnModels(原 RegressionModel)使用 past 与 future covariates

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。

http://www.dtcms.com/a/306255.html

相关文章:

  • 构建工具和脚手架:从源码到dist
  • uvm tlm preface
  • 若依前后端分离版学习笔记(四)——目录文件及主配置文件介绍
  • TP-Link Archer C50路由器曝安全漏洞,硬编码DES密钥可解密敏感配置
  • 用 Go Typed Client 快速上手 Elasticsearch —— 从建索引到聚合的完整实战
  • 基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(一)
  • vscode配置rust环境
  • CVAE 回顾版
  • 工作笔记-----存储器类型相关知识
  • BCD (Binary-Coded Decimal) 指令介绍
  • 求职招聘小程序源码搭建招聘小程序开发定制人力资源系统
  • LAMP及其环境的部署搭建
  • FragmentManager 返回栈与 Activity 运行栈的关系(当按下Back键时屏幕会如何变化?)
  • kali Linux 2025.2安装教程(解决安装失败-图文教程超详细)
  • GitPython03-项目setup编译
  • Spring boot 打包成docker image 镜像
  • forge篇——配置
  • DevOps 实践指南:Git 版本控制从入门到精通
  • 以rebase 方式merge , git要怎么实现两个分支以rebase 合并
  • LLM gateway
  • Kong API Gateway深度解析:插件系统与微服务架构的技术基石
  • LabVIEW DSC报警Web服务客户端
  • labview控制软件开发
  • 量子图灵机 Quantum Turing Machine, QTM
  • Spring Boot音乐服务器项目-查询喜欢的音乐模块
  • Java Ai While 和Do While 循环 day (08)
  • Radash: 新一代前端工具库取代替换Lodash库
  • 【开发技术】.Net中配置Serilog日志分级记录
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘dash’问题
  • Python爬虫实战:研究python-readability库相关技术构建网页内容提取系统