时间序列预测的零样本学习是未来还是炒作:TimeGPT和TiDE的综合比较

news2024/10/7 16:20:14

最近时间序列预测预测领域的最新进展受到了各个领域(包括文本、图像和语音)成功开发基础模型的影响,例如文本(如ChatGPT)、文本到图像(如Midjourney)和文本到语音(如Eleven Labs)。这些模型的广泛采用导致了像TimeGPT[1]这样的模型的出现,这些模型利用了类似于它们在文本、图像和语音方面获得成功的方法和架构。

在本文中,我们将讨论一个通用的预训练模型能否解决预测任务的范式转变。我们通过使用TimeGPT进行零样本学习并对模型的性能进行了彻底分析。然后将TimeGPT的性能与TiDE[2]进行比较(TiDE是一种在预测用例中击败了Transformer的简单的多层感知机)。

TimeGPT

TimeGPT [1] 是时间序列预测的第一个基础模型,其特点是能够在不同领域之间进行泛化。它可以在训练阶段之外的数据集上产生精确的预测。

最近围绕用于时间序列预测的研究领域的基础模型正在经历显著增长。最近发布的新方法包括:卡内基梅隆大学(CMU)研究人员开发的“MOMENT” [3]、谷歌的“TimesFM” [4]、摩根士丹利和ServiceNow合作开发的“Lag-Llama” [5],以及Salesforce的“Moirai” [6]。我们以前也介绍过一些,随后的文章会将其他的模型进行逐个说明。

现在我们回到TimeGPT ,它号称利用迁移学习在零样本推理设置中表现出色。它使用了来自经济学、人口统计学、医疗保健、天气、物联网传感器数据、能源、网络流量、销售、交通和银行等各种领域的大量公开可用数据集,总共达到了1000亿个数据点。

这种广泛多样的领域使模型能够捕捉复杂的模式,例如多个季节性、不同长度的周期和不断演变的趋势。数据集展示了各种噪声水平、异常值、漂移和其他特征。一些数据集由干净的数据组成,具有规律的模式,而另一些则具有意外事件和行为,其中趋势和模式可能随时间波动。这些挑战为模型提供了许多学习的场景,提高了其鲁棒性和泛化能力。

TimeGPT是一个基于transformer的模型,可以生成潜在结果的概率分布,即预测区间的估计。依靠基于历史误差的符合性预测 [8] 来估计预测区间。与传统方法不同,符合性预测不需要分布假设,可以通过以下步骤实现:

  1. 创建 M 个训练和校准集;
  2. 使用模型对每个校准集进行预测;
  3. 对于每个预测的时刻 h,计算模型预测值与校准集内实际结果之间的绝对残差值。这些计算出的残差称为非符合性分数;
  4. 我们从每个预测时刻 h 的非符合性分数分布中选择特定的分位数。所选择的分位数决定了预测区间的覆盖水平,较高的分位数会导致更宽的区间。

预测区间由预测值 ± 最终的非符合性分数给出。

TiDE

TiDE 是23年4月谷歌发布的的多变量时间序列模型,可以在预测时段使用静态协变量(例如产品的品牌)和已知或未知的动态协变量(例如产品的价格)来生成准确的预测。与Transformers的复杂架构不同,TiDE 基于一个简单的编码器-解码器架构,并使用了残差连接:

  • 编码器负责将时间序列的过去目标值和协变量映射为特征的密集表示。特征投影降低了动态协变量的维度。密集编码器接收特征投影的输出与静态协变量以及过去的值的拼接,并将它们映射成单一的嵌入表示。
  • 解码器接收嵌入表示,并将其转换为未来的预测。密集解码器将嵌入表示映射到预测时段每个时间步的向量。然后,时间解码器将密集解码器的输出与该时间步的特征投影相结合,产生预测。
  • 残差连接线性地将回溯映射为与预测时段大小相同的向量,将其添加到时间解码器的输出中以产生最终的预测。

通过这种简单而有效的架构,TiDE能够利用静态和动态协变量生成准确的销售预测。就像之前更早的Dlinear类似,针对特定的任务简单的线性层可以获得更好的结果。

下面我们就要使用TimeGPT和TiDE应用于客户的销售数据(这是一个真实世界的数据集),并对其性能进行比较和分析。

TimeGPT VS TiDE

数据集包含195个唯一的时间序列,每个序列详细说明了美国市场的每周销售数据。除了历史销售数据外,数据集还包含两种类型的营销事件信息。并且合并了公共假日和二元季节性特征来增强数据集。预测范围是16周,也就是说想要预测未来16周的情况。

我们先导入包

 import matplotlib.pyplot as plt
 import os
 import pandas as pd
 import utils
 
 from nixtlats import TimeGPT
 from nixtlats.date_features import CountryHolidays
 from dotenv import load_dotenv
 from sklearn.preprocessing import MinMaxScaler, OrdinalEncoder
 
 load_dotenv()

然后,通过提供TimeGPT令牌来初始化TimeGPT类。

 timegpt = TimeGPT(token = os.environ.get("TIMEGPT_KEY"))
 timegpt.validate_token()

加载数据集时需要保证格式如下:

目标变量应该是数字的,并且没有缺失值;确保从开始日期到结束日期的日期序列中不存在间隙;日期列必须采用Pandas可识别的格式;TimeGPT可以进行数据缩放(归一化等)所以可以跳过这一步;对于预测多个时间序列,需要一个列来唯一地标识每个序列,这将用作预测函数中的参数;外生特征需要一个单独的数据集用于预测时段。

通过上面的介绍,我们可以看到,TimeGPT把最复杂的部分留给了我们,填充缺失值(包括保证时间序列的连续性)是最麻烦的事情。

我们读取自己处理好的数据集

 df = pd.read_csv('data/data.csv', parse_dates=['delivery_week'])

然后添加周和月的二元季节性特征:

 # add week and month to df
 df['week'] = df['delivery_week'].dt.isocalendar().week
 df['month'] = df['delivery_week'].dt.month
 
 # one hot encode week and month
 df = pd.get_dummies(df, columns=['week', 'month'], dtype=int)

截断数据集以供TimeGPT用于预测,剩下作为验证集进行验证。

 # Truncate data frame 
 forecast_df = df[df['delivery_week'] < "2023-10-16"]
 
 # Let's use the last x weeks of actuals for the holdout set 
 holdout_df = df[(df['delivery_week'] >= "2023-10-16") & (df['delivery_week'] <= "2024-02-05")]

对于TimeGPT的用法我们这里就不详细介绍了,可以看看我们23年10月的TimeGPT介绍。

 # create list with seasonal exogenous features
 EXOGENOUS_FAETURES = [x for x in df.columns if ('week_' in x) | ('month_' in x)]
 
 timegpt_fcst_ex_vars_df = timegpt.forecast(
     df=forecast_df[['unique_id', 'delivery_week', 'target', 'marketing_events_1', 'marketing_events_2']+EXOGENOUS_FAETURES],
     time_col='delivery_week',
     target_col='target',
     X_df=holdout_df[['unique_id', 'delivery_week', 'marketing_events_1', 'marketing_events_2']+EXOGENOUS_FAETURES],
     date_features=[CountryHolidays(['US'])],
     h=17,
     level=[80],
     freq='W-MON',
     id_col='unique_id',
     model='timegpt-1',
     add_history=True,
     )

API的预测只需要几分钟。它返回数据包含历史数据的拟合值和预测范围的预测值,并且还返回了外生协变量在预测中的重要性。

 timegpt.weights_x.head(10).sort_values(by='weights').plot.barh(x='features', y='weights')
 plt.title('Feature Importance - top 10')
 plt.show()

提取了十个最重要的协变量,这表明营销事件具有最高的重要性。

我们设置了add_history=True,所以可以绘制拟合值和预测值。

可以看到虽然拟合值与实际值很好地吻合,但预测结果并不一致。它们在大多数序列中显示出一致的模式。

下面我们看看TiDE生成的预测,然后就可以对预测性能指标以进行比较。这里使用平均绝对百分比误差(MAPE)作为比较指标,这样可以防止实际销售量的泄露,又能看到实际的对比结果。

 # load the forecast from TiDE and TimeGPT
 tide_model_df = pd.read_csv('data/tide.csv', parse_dates=['delivery_week'])
 timegpt_fcst_ex_vars_df = pd.read_csv('data/timegpt.csv', parse_dates=['delivery_week'])
 
 # merge data frames with TiDE forecast and actuals
 model_eval_df = pd.merge(holdout_df[['unique_id', 'delivery_week', 'target']], tide_model_df[['unique_id', 'delivery_week', 'forecast']], on=['unique_id', 'delivery_week'], how='inner')
 
 # merge data frames with TimeGPT forecast and actuals
 model_eval_df = pd.merge(model_eval_df, timegpt_fcst_ex_vars_df[['unique_id', 'delivery_week', 'TimeGPT']], on=['unique_id', 'delivery_week'], how='inner')
 
 utils.plot_model_comparison(model_eval_df)

在16周的195个时间序列中,有15周TiDE的平均MAPE低于TimeGPT。TimeGPT的零样本学习能力并没有打败我们的微调模型,并且这个模型是23年4月发布的,到现在已经有将近1年的时间了。

总结

在本文中,我们探讨了时间序列预测的最新创新之一——基础模型的发展。这些模型的目标是为缺乏内部开发SOTA模型所需的专业知识的组织提供对算法的使用。这种方式很有希望,但我们验证结果表明,它仍然无法提供准确的预测,也就是说目前来TimeGPT作为基础模型还是不够好。

另外还需要说明的是这里为了简单对比所以我们没有进行人工的特征工程和使用XGB等提升树的模型进行计算。因为目前来看无论是lightgbm还是xgboost,都是目前时间序列预测的sota:这点可以从时间序列发布的论文中看到,所有论文的结果展示没有和它们进行对比的,而对比对象的都是一些前辈(transformer类的深度学习模型)。

虽然目前来看时间序列的基础模型还不够完善,TimeGPT可以说是一个失败的模型,但是我们也可以看到目前的研究方向也在向时间序列的基础模型而努力。虽然其他领域,如计算机视觉和NLP,基础模型已经获得越来越多的关注并且可以说是成功了,但时间序列预测这个领域还有是有很大的研究前景的。

以下是本文的引用:

[1] Garza, A., & Mergenthaler-Canseco, M. (2023). TimeGPT-1. Retrieved from arXiv:2310.03589.

[2] Abhimanyu Das, Weihao Kong, Andrew Leach, Shaan Mathur, Rajat Sen, Rose Yu. (2023) Long-term Forecasting with TiDE: Time-series Dense Encoder. arXiv:2304.08424.

[3] Goswami, M., Szafer, K., Choudhry, A., Cai, Y., Li, S., & Dubrawski, A. (2024). MOMENT: A Family of Open Time-series Foundation Models. Retrieved from arXiv:2402.03885 (cs.LG).

[4] Das, A., Kong, W., Sen, R., & Zhou, Y. (2024). A decoder-only foundation model for time-series forecasting. Retrieved from arXiv:2310.10688 (cs.CL).

[5] Rasul, K., Ashok, A., Williams, A. R., Ghonia, H., Bhagwatkar, R., Khorasani, A., Darvishi Bayazi, M. J., Adamopoulos, G., Riachi, R., Hassen, N., Biloš, M., Garg, S., Schneider, A., Chapados, N., Drouin, A., Zantedeschi, V., Nevmyvaka, Y., & Rish, I. (2024). Lag-Llama: Towards Foundation Models for Probabilistic Time Series Forecasting. Retrieved from arXiv:2310.08278 (cs.LG).

[6] Woo, G., Liu, C., Kumar, A., Xiong, C., Savarese, S., & Sahoo, D. (2024). Unified Training of Universal Time Series Forecasting Transformers. Retrieved from arXiv:2402.02592 (cs.LG).

[7] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, L., & Polosukhin, I. (2017). Attention Is All You Need. Retrieved from arXiv:1706.03762.

[8] Stankeviciute, K., Alaa, A. M., & van der Schaar, M. (2021). Conformal time-series forecasting. In Advances in Neural Information Processing Systems (Vol. 34, pp. 6216–6228).

https://avoid.overfit.cn/post/b74a5eaf984849b186b26ea6d8f93db5

作者:Luís Roque

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GPT-SOVITS-06】特征工程-HuBert原理

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

从0开始写一个问卷调查APP的第11天

1.今日任务 分析:上次我们实现了从数据库中成功的查找到对应问卷的问题并在前端展示出来&#xff0c;那么今天我们增加难度。在数据库中插入多项选择问题&#xff0c;在接口中查找到并在前端显示出来。 2.实现 2.1数据库中插入测试数据 我们先查看一下表的结构 2.2接口实现…

软件架构设计 C/S与B/S架构的区别

一、什么是C/S架构&#xff1f; C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机&#xff0c;并采用大型数据库系统&#xff0c;如Oracle或SQLServer。 C/S架构软件有一个特点&#xff0c;就是如果用户要使用的话&#xff0c;需要下载一个客户端&#x…

nodejs部署

字符集转换&#xff1a; mysql报错&#xff1a;Incorrect string value: \xF0\x9F... for column XXX at row 1_incorrect string value: \\xf0\\x9f\\x94\\xa5\\xe8-CSDN博客 查看nginx是否启动 ps -ef|grep nginx 检查nginx是否配置正确 nginx -t 防火墙开启端口 启动并…

CCDP.01.使用NotePad++辅助部署OpenStack的说明

前言 对于象OpenStack&#xff08;OS&#xff09;这样的复杂分布式系统&#xff08;云计算平台&#xff09;&#xff0c;一次部署通过是需要相当的Linux基础、网络基础、分布式系统基础、云计算基础的。这里类比在开发大型复杂系统常常采用的“防御式编程”方法论&#xff0c;探…

Vue中使用Lodash

Vue中使用Lodash 前言安装Lodash引用方法vue中使用1、cloneDeep 深拷贝2、uniq 数组去重3、uniqWith 数组对象去重 isEqual 深度比对4、intersection 提取数组相同元素5、chunk 数组切分6、compact去除假值7、reject:根据条件删除指定的值8、find:查找结果的第一个值9、filter:…

Machine Learning ---- Multiple linear regression equation

一、Multiple linear regression: In the study of real-world problems, the changes in the dependent variable are often influenced by several important factors. In this case, it is necessary to use two or more influencing factors as independent variables to e…

如何用Selenium通过Xpath,精准定位到“多个相同属性值以及多个相同元素”中的目标属性值

前言 本文是该专栏的第21篇,后面会持续分享python爬虫干货知识,记得关注。 相信很多同学,都有使用selenium来写爬虫项目或者自动化页面操作项目。同样,也相信很多同学在使用selenium来定位目标元素的时候,或多或少遇见到这样的情况,就是用Xpath定位目标元素的时候,页面…

AI系统性学习01- Prompt Engineering

文章目录 面向开发者的Prompt Engineering一、简介二、Prompt设计原则1 环境配置2.两个基本原则2.1 原则1&#xff1a;编写清晰、具体的指令2.1.1 策略一&#xff1a;分割2.1.2 策略2&#xff1a;结构化输出2.1.3 策略3&#xff1a;模型检测2.1.4 策略4&#xff1a;提供示例 2.…

Godot 学习笔记(1):环境配置

文章目录 前言Godot 环境配置相关链接最简单的按钮项目Sence打包最简单的按钮事件 总结 前言 我从小就有个梦想&#xff0c;我想做游戏。虽然我大学的时候选择了计算机&#xff0c;工作也是计算机&#xff0c;但是我一直没有时间去学游戏引擎。原因有二&#xff1a;第一&#…

学习数据结构和算法的第16天

单链表的实现 链表的基本结构 #pragma once #include<stdio.h> #include<stlib.h> typedf int SLTDataType; typedy struct SListNode {SLTDataType data;struct SListNode*next; }SLTNode;void Slisprint(SLTNode*phead); void SListPushBack(SLTNode**pphead,S…

常用芯片学习——DS3231M芯片

DS3231M RTC实时时钟 芯片介绍 DS3231M是一款低成本、极其精确的 I2C 实时时钟 &#xff08;RTC&#xff09;。该设备集成了电池输入&#xff0c;并在设备主电源中断时保持准确的计时。微型电子机械系统 &#xff08;MEMS&#xff09; 谐振器的集成提高了器件的长期精度&…

【记录搭建elk 如何在linux共享文件】

『如何在linux共享文件 &#xff0c;搭建elk直接看第二部分』 新增用户a b c adduser a adduser b adduser c新增用户组 A groupadd developteam将用户a b c 加入 组 usermod -a -G developteam hadoop usermod -a -G developteam hbase usermod -a -G developteam hive设置um…

Flutter 核心原理 - UI 框架(UI Framework)

Flutter 既能保证很高的开发效率&#xff0c;又能获得很好的性能。 这两年 Flutter 技术热度持续提高&#xff0c;整个 Flutter 生态和社区也发生了翻天覆地的变化。目前Flutter 稳定版发布到了3.0&#xff0c;现在已经支持移动端、Web端和PC端&#xff0c;通过Flutter 开发的…

【计算机视觉】二、图像形成——实验:2D变换编辑器2.0(Pygame)

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)2D变换编辑器0. 项目结构1. Package: guibutton.pywindow.py1. __init__(self, width, height, title)2. add_buttons(self)3. clear(self)4. dr…

WEB前端 HTML 列表表格

列表 有序列表 使用“ol”创建“有序列表”&#xff0c;使用“li”表示“列表项” <body><ol type"1"><li>列表1</li><li>列表2</li><li>列表3</li></ol><ol type"A"><li>列表A<…

Redis进阶——redis消息队列

目录 redis消息队列认识消息队列基于List实现消息队列如何基于List结构模拟消息队列基于List的消息队列有哪些优缺点&#xff1f; 基于PubSub的消息队列基于Stream的消息队列读取消息的方式之一&#xff1a;XREAD基于Stream的消息队列–消费者组redis三种消息队列的对比 Stream…

Spring炼气之路(炼气二层)

一、bean的配置 1.1 bean的基础配置 id&#xff1a; bean的id&#xff0c;使用容器可以通过id值获取对应的bean&#xff0c;在一个容器中id值唯一 class&#xff1a; bean的类型&#xff0c;即配置的bean的全路径类名 <bean id"bookDao" class "com.zhang…

Java八股文(MyBatis Plus)

Java八股文のMyBatis Plus MyBatis Plus MyBatis Plus MyBatis Plus 是什么&#xff1f;它与 MyBatis 有什么区别&#xff1f; MyBatis Plus 是基于 MyBatis 进行扩展的一款持久层框架&#xff0c;它提供了一系列增强功能&#xff0c;简化了 MyBatis 的使用。 与 MyBatis 相比…

(十八)【Jmeter】取样器(Sampler)之BeanShell 取样器

简述 操作路径如下: 作用:通过Beanshell脚本来编写自定义请求。配置:编写Beanshell脚本代码,实现请求逻辑。使用场景:在JMeter中利用Beanshell脚本语言的特性进行自定义请求。优点:可以利用Beanshell脚本语言的丰富功能。缺点:脚本语言的性能可能不如其他编译语言,且…