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

译 | 用于具有外生特征的时间序列预测模型TimeXer

文章出自:出自:TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables

本篇技术亮点在于结合自注意力和交叉注意力机制,既捕捉时间序列的内在变化,又融合外部影响因素,提高预测准确度。该方法特别适合受外部因素影响明显的时间序列预测,如电力需求、产品销量等。

商业应用场景包括节假日促销预测、电力负荷管理、气象影响下的能源调度等。例如,利用历史销售数据和节假日信息预测商品需求,帮助企业合理备货和安排促销活动。整体方法适合需要考虑外部环境变量的复杂预测任务。


文章目录

  • 1 TimeXer 介绍
    • 1.1 TimeXer 的架构
    • 1.2 内源性特征嵌入
    • 1.3 外源性特征嵌入
    • 1.4 内源性特征的自注意力
    • 1.5 外源性到内源性交叉注意力
    • 1.6 最后步骤与输出预测
  • 2 使用 TimeXer 进行预测案例
    • 2.1 初始设置
    • 2.2 训练每个模型
    • 2.3 评估
  • 3 结论
  • 4 参考文献


Photo by Michael Payne on Unsplash

照片由 Michael Payne 在 Unsplash 提供

虽然在Time-MoE、Moirai或TimeGPT等基础预测模型上投入了大量研究工作,但新的特定数据模型仍在积极开发和发布中。

最新提出的方法之一是 TimeXer,于2024年2月发表在论文TimeXer:Empowering Transformers for Time Series Forecasting with Exogenous Variables[1]中。

顾名思义,TimeXer 是一个基于 Transformer 的模型,就像 PatchTST 和 iTransformer 一样,也考虑了外生特性。因此,它不仅依赖于该序列的过去值,还依赖于可能有助于预测目标的外部信息。

这对于受外部因素影响的时间序列特别有用。例如,如果有节假日,产品的需求可能会发生变化;或者电力需求会受到室外温度的影响。

在这些情况下,我们可以使用 TimeXer,因为它是专门为处理外生特征而构建的。

本文中,我们首先探讨 TimeXer 的架构和内部工作原理,然后将其应用到一个小型实验中,将其性能与其他模型进行比较。

有关更多详细信息,请务必阅读原始论文。

让我们开始吧!


1 TimeXer 介绍

如前所述,TimeXer 是一个基于 Transformer 的模型。TimeXer 背后的动机来自于意识到现有的基于 Transformer 的模型缺乏一些关键功能。

例如,PatchTST 执行单变量预测,这意味着它无法对多个序列的相互依赖性进行建模。此外,它不支持外生特征。

iTransformer 可以执行单变量和多变量预测,但不支持外生特征。

而 TimeXer 不仅能执行单变量和多变量预测,还能利用外生特征来辅助预测。


1.1 TimeXer 的架构

下图展示了 TimeXer 的总体架构。

TimeXer 架构

从图中可以看出,TimeXer 基本复用了原始 Transformer 架构,没有修改其组件。

主要的变化在于 TimeXer 如何采用自注意力机制学习时间依赖关系,以及采用交叉注意力机制捕捉外生特征对目标序列的影响。

当然,细节还有很多,我们接下来逐一深入了解各个组件。


1.2 内源性特征嵌入

TimeXer 的第一步是从输入时间序列创建嵌入。普通的 Transformer 会对每个时间步单独进行标记化,而 TimeXer 采用了 patching(分块)策略,将数据点分组后再进行标记化。

Patching 可视化

如图所示,序列长度为15,patch 长度为5,步幅也是5,因此产生了3个不重叠的补丁。

这种分块策略最初在 PatchTST 中提出,iTransformer 则是分块的极端版本。

分块的主要优点是减少了标记数量,降低了模型的空间和时间复杂度,同时帮助捕获时间依赖关系。

因此,TimeXer 采用相同的非重叠分块策略,将输入序列嵌入后送入自注意力机制。


1.3 外源性特征嵌入

与输入序列类似,外生特征也必须经过嵌入步骤,之后才能送入交叉注意力机制。

作者选择了变量级表示方法,如下图所示:

外生特征变量级表示

这里,每个外生序列被嵌入成一个唯一的 token。

这种策略允许模型处理缺失值或频率与目标序列不同的外生特征。

同时,它也降低了计算复杂度,因为每个变量只对应一个 token。这是分块的极端情况,整个序列被压缩成一个 token(类似 iTransformer)。


1.4 内源性特征的自注意力

对于目标序列,TimeXer 使用自注意力机制来学习时间依赖关系:

自注意力示意图
这里,注意力机制学习输入序列中的时间依赖。

关键创新是引入了一个全局 token(图中带虚线边缘的立方体)。

该机制包含三种主要注意力操作:

  1. Patch-to-patch:标准的自注意力,学习不同时间段(patch)之间的关系。
  2. Patch-to-global:全局 token 关注所有时间 patch,学习全局模式。
  3. Global-to-patch:每个时间 patch 关注全局 token,接收全局信息。

通过这种策略,模型能同时捕获局部和全局模式,有助于提升预测准确性。


1.5 外源性到内源性交叉注意力

TimeXer 的另一个关键机制是交叉注意力,用于捕获外部特征与目标序列之间的关系:

交叉注意力示意图

这里,全局 token 再次发挥关键作用。

交叉注意力机制有效地从外部因素中提取相关信息。

由于外生变量被编码为变量级 token,全局 token 聚合这些外部信息,并在前面提到的全局到 patch 操作中传递给时间 patch。

这使得 TimeXer 能够同时捕获时间依赖和目标序列与外部变量间的关系。


1.6 最后步骤与输出预测

经过两种注意力机制处理后,输出先经过归一化和前馈层,然后进入最终归一化层。

归一化层有助于稳定训练,前馈层进一步从注意力机制产生的深层抽象表示中学习。

最后一步是将输出投影到与预测任务一致的维度。

  • 如果只预测一个序列,输出为长度等于预测范围的一维向量。
  • 如果预测多个序列,输出为二维向量,维度为序列数 × 预测范围。

2 使用 TimeXer 进行预测案例

本节将 TimeXer 应用于流行的 EPF 基准数据集。

该数据集包含五个欧洲市场的电价信息,且附带已知的外生特征。数据集可在 GitHub 根据 MIT 许可获取。

本实验将 TimeXer 与 NHITS 和 TSMixerx 进行比较,它们都是支持外生特征的强大模型。

我们使用 neuralforecast 中的实现,因为它是使用深度学习模型进行时间序列预测最简单快捷的方式。

完整代码可在 GitHub 获取。


2.1 初始设置

首先导入实验所需的包,包括常用的数据处理和可视化包,以及 neuralforecast 和 utilsforecast:

import pandas as pd  
import numpy as np  
import matplotlib.pyplot as pltfrom neuralforecast.core import NeuralForecast  
from neuralforecast.models import TimeXer, NHITS, TSMixerxfrom utilsforecast.evaluation import evaluate  
from utilsforecast.losses import mae, mse

读取数据,并格式化为 neuralforecast 期待的格式。主要是创建 unique_id 列标识序列,时间戳列命名为 ds,目标列命名为 y。同时去除外生特征名称前的多余空格。

BE_url = "https://raw.githubusercontent.com/thuml/TimeXer/refs/heads/main/dataset/EPF/BE.csv"  
DE_url = "https://raw.githubusercontent.com/thuml/TimeXer/refs/heads/main/dataset/EPF/DE.csv"BE_df = pd.read_csv(BE_url, parse_dates=["date"])  
BE_df["unique_id"] = "BE"  
BE_df = BE_df.rename(columns={  "date": "ds",  " Generation forecast": "Generation forecast",  " System load forecast": "System load forecast",  "OT": "y"  
})  
DE_df = pd.read_csv(DE_url, parse_dates=["date"])  
DE_df["unique_id"] = "DE"  
DE_df = DE_df.rename(columns={  "date": "ds",  " Wind power forecast": "Wind power forecast",  " Ampirion zonal load forecast": "Ampirion zonal load forecast",  "OT": "y"  
})

为了简化,本文只对数据集中五个市场中的两个进行预测。你可以自由扩展到所有市场,只需确保变量名正确。

设置实验常量:

HORIZON = 24  
INPUT_SIZE = 168  
FREQ = "h"  
BE_EXOG_LIST = ["Generation forecast", "System load forecast"]  
DE_EXOG_LIST = ["Wind power forecast", "Ampirion zonal load forecast"]

这里,预测范围为24小时,输入长度为168小时(7天),数据频率为每小时,并定义了外生特征名称。


2.2 训练每个模型

在 neuralforecast 中,可以初始化一个模型列表,在数据集上训练。这里使用 TimeXer、NHITS 和 TSMixerx。

以下为比利时市场模型初始化示例:

models = [  TimeXer(  h=HORIZON,  input_size=INPUT_SIZE,  n_series=1,  futr_exog_list=BE_EXOG_LIST,  patch_len=HORIZON,  max_steps=1000  ),  NHITS(  h=HORIZON,  input_size=INPUT_SIZE,  futr_exog_list=BE_EXOG_LIST,  max_steps=1000  ),  TSMixerx(  h=HORIZON,  input_size=INPUT_SIZE,  n_series=1,  futr_exog_list=BE_EXOG_LIST,  max_steps=1000  )  
]

futr_exog_list 参数用于指定外生特征列名。

TSMixerx 和 TimeXer 使用 n_series 参数,因为它们是多变量模型,可以学习多个序列间的依赖。由于本例中一次只建模一个市场,故设为1。NHITS 是多变量模型,但不使用该参数。

接着使用交叉验证训练模型,获得多个预测窗口以便与实际值直接比较。

本例使用十个不重叠的交叉验证窗口:

nf = NeuralForecast(models=models, freq=FREQ)  
BE_cv_preds = nf.cross_validation(BE_df, step_size=HORIZON, n_windows=10)  
BE_cv_preds.head()

丹麦市场重复相同步骤:

models = [  TimeXer(  h=HORIZON,  input_size=INPUT_SIZE,  n_series=1,  futr_exog_list=DE_EXOG_LIST,  patch_len=HORIZON,  max_steps=1000  ),  NHITS(  h=HORIZON,  input_size=INPUT_SIZE,  futr_exog_list=DE_EXOG_LIST,  max_steps=1000  ),  TSMixerx(  h=HORIZON,  input_size=INPUT_SIZE,  n_series=1,  futr_exog_list=DE_EXOG_LIST,  max_steps=1000  )  
]nf = NeuralForecast(models=models, freq=FREQ)  
DE_cv_preds = nf.cross_validation(DE_df, step_size=HORIZON, n_windows=10)  
DE_cv_preds.head()

2.3 评估

在计算性能指标前,先可视化两个市场的预测结果。

比利时市场预测:

比利时市场预测

图片由作者提供

图中可见 NHITS 错过了数据中的细微波动,而 TSMixerx 和 TimeXer 的预测更好。

丹麦市场预测:

丹麦市场预测

图片由作者提供

令人惊讶的是,TimeXer 在此表现最差,完全错过了早期的下跌,而 NHITS 和 TSMixerx 大致跟随实际趋势。

性能指标表进一步证实了这一观察:

性能指标表

图片由作者提供

TimeXer 在比利时数据集表现最好,而 NHITS 表现最差;丹麦数据集则相反,NHITS 最佳,TimeXer 最差。

我很难解释这种差异的原因。但在其他数据集测试中,TimeXer 似乎受益于更长的训练时间,可能对丹麦数据集而言,1000步训练不够。

当然,本实验不是全面基准,主要目的是展示如何在自己的数据集上实现 TimeXer。

请注意:

  • TimeXer 在 neuralforecast 中作为多变量模型实现,能建模多个序列间的依赖关系。
  • TimeXer 受益于更长训练,建议训练步数大于1000。
  • 模型支持外生特征,需在 futr_exog_list 参数中传入。这意味着预测时外生特征的未来值是已知的。

3 结论

TimeXer 是一个结合自注意力和交叉注意力机制的基于 Transformer 的模型。

自注意力建模目标序列的时间依赖,交叉注意力捕获目标序列与外部变量的关系。

使用 TimeXer 时,建议训练步数超过1000,因为它似乎从更长训练中获益。

在本小型实验中,TimeXer 在一个数据集表现最佳,在另一个数据集表现最差。再次强调,这不是完整的基准测试,但其表现足够有趣,值得在你自己的项目中尝试。

每个问题都有其最佳解决方案,现在你可以测试 TimeXer 是否适合你的场景。

4 参考文献

[1] Y. Wang et al., “TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables,” arXiv.org, 2024. https://arxiv.org/abs/2402.19072

[2] TimeXer 官方实现 — GitHub

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

相关文章:

  • JavaScript 大数运算!
  • Abp+ShardingCore+EFCore.BulkExtensions使用案例
  • MCU中的DAC(数字模拟转换器)是什么?
  • 动态挑战-响应机制和密钥轮换
  • 算法练习:JZ32 从上往下打印二叉树
  • iOS高级开发工程师面试——其他
  • 磁盘坏道检测工具在美国服务器硬件维护中的使用规范
  • Linux 计划任务管理
  • 【在线五子棋对战】十一、整合封装服务器模块实现
  • linux git ssh配置过程
  • chrome.storage 和 localStorage
  • 自动化与配置管理工具 ——SaltStack
  • 用 AI 自动生成口型同步视频,短视频内容也能一人完成
  • 基于深度学习的医学图像分析:使用YOLOv5实现医学图像目标检测
  • 测试平台进化论:如何在CI/CD时代重构软件质量防线
  • # 前端开发规范基础汇总
  • 掌握Python三大语句:顺序、条件与循环
  • 深度解析:基于Python构建的闲鱼自动化营销与信息发送机器人
  • 暄桐:如何脱离“不学无术”的状态?
  • 集成学习方法之随机森林:从原理到实战的深度解析
  • pip库版本升级
  • vue vxe-table :edit-config=“editConfig“ 可以编辑的表格
  • Netcat终极实战指南:从端口扫描到渗透测试
  • Multimodal Fusion on Low-quality Data: A Comprehensive Survey 中文版
  • Java面试高频题目
  • 基于notepad++的sensor寄存器序列文本处理方法(以后会随时更新补充)
  • STM32F1到STM32F0的标准库移植指南--GPIO篇
  • 认知绞肉机:个体实践视域下认知暴力与元认知升维的活体实验研究
  • 如何将 Redis 监控集成到微服务整体的监控体系中( 如 Prometheus + Grafana)
  • [12月考试] E