TimeGPT:时间序列预测的第一个基础模型

news2024/11/18 18:47:15

时间序列预测领域在最近的几年有着快速的发展,比如N-BEATS、N-HiTS、PatchTST和TimesNet。

大型语言模型(llm)最近在ChatGPT等应用程序中变得非常流行,因为它们可以适应各种各样的任务,而无需进一步的训练。

这就引出了一个问题:时间序列的基础模型能像自然语言处理那样存在吗?一个预先训练了大量时间序列数据的大型模型,是否有可能在未见过的数据上产生准确的预测?

通过Azul Garza和Max Mergenthaler-Canseco提出的TimeGPT-1,作者将llm背后的技术和架构应用于预测领域,成功构建了第一个能够进行零样本推理的时间序列基础模型。

在本文中,我们将探索TimeGPT背后的体系结构以及如何训练模型。然后,我们将其应用于预测项目中,以评估其与其他最先进的方法(如N-BEATS, N-HiTS和PatchTST)的性能。

TimeGPT

TimeGPT是为时间序列预测创建基础模型的第一次尝试。

从上图中,我们可以看到TimeGPT背后的一般思想是在来自不同领域的大量数据上训练模型,然后对未见过的数据产生零样本的推断。

这种方法依赖于迁移学习,迁移学习是指模型利用在训练过程中获得的知识解决新任务的能力。这种方式只有当模型足够大,并且在大量数据上进行训练时才有效。

为此,作者对TimeGPT进行了超过1000亿个数据点的训练,这些数据点都来自开源的时间序列数据。该数据集涵盖了广泛的领域,从金融、经济和天气,到网络流量、能源和销售。

但是这里作者没有披露用于管理1000亿个数据点的公共数据的来源。

这种多样性对于基础模型的成功至关重要,因为它可以学习不同的时间模式,因此可以更好地进行泛化。

例如,我们可以预期天气数据具有日季节性(白天比晚上热)和年季节性,而汽车交通数据可以具有日季节性(白天路上的汽车比晚上多)和周季节性(一周内路上的汽车比周末多)。

为了保证模型的鲁棒性和泛化能力,预处理被保持在最低限度。事实上只有缺失的值被填充,其余的保持原始形式。虽然作者没有具体说明数据输入的方法,但我怀疑使用了某种插值技术,如线性、样条或移动平均插值。

然后作者对模型进行多天的训练,在此期间对超参数和学习率进行优化。虽然作者没有透露训练需要多少天和gpu资源,但我们确实知道该模型是在PyTorch中实现的,并且它使用Adam优化器和学习率衰减策略。

TimeGPT利用Transformer架构。

从上图中,我们可以看到TimeGPT使用了完整的编码器-解码器Transformer架构。

输入可以包括历史数据窗口,也可以包括外生数据窗口,如准时事件或其他系列。

输入被馈送到模型的编码器部分。然后编码器内部的注意力机制从输入中学习不同的属性。然后将其输入解码器,解码器使用学习到的信息进行预测。预测序列在达到用户设置的预测范围长度时结束。

值得注意的是,作者已经在TimeGPT中实现了适形预测,允许模型根据历史误差估计预测间隔。

考虑到TimeGPT是为时间序列构建基础模型的第一次尝试,它具有一系列广泛的功能。

TimeGPT的功能总结:

首先,TimeGPT是一个预先训练的模型,这意味着可以生成预测,而不需要对数据进行特定的训练。尽管如此,还是可以根据我们的数据对模型进行微调。

其次,该模型支持外生变量来预测我们的目标,也就是说可以处理多变量预测任务。

最后,使用保形预测,TimeGPT可以估计预测区间。这反过来又允许模型执行异常检测。如果一个数据点落在99%的置信区间之外,那么模型将其标记为异常。

所有这些任务都可以通过零样本推理或一些微调来实现,这是时间序列预测领域范式的根本转变。

现在我们对TimeGPT有了更扎实的了解,了解了它是如何工作的,以及它是如何训练的,让我们来看看实际的模型。

TimeGPT进行预测

现在让我们将TimeGPT应用于预测任务,并将其性能与其他模型进行比较。

在撰写本文时,TimeGPT只能通过API访问,并且还处于封闭测试阶段。我提交申请,并获得了免费使用该模型两周的授权。

如前所述,该模型是在来自公开可用数据的1000亿个数据点上进行训练的。由于作者没有指定使用的实际数据集,我认为在已知的基准数据集(如ETT或weather)上测试模型是不合理的,因为模型可能在训练期间看到了这些数据。

因此,我使用了自己的数据集,数据集现在在GitHub上公开可用,最重要的是TimeGPT没有在这些数据上进行训练。

导入库并读取数据

 import pandas as pd
 import numpy as np
 import datetime
 import matplotlib.pyplot as plt
 
 from neuralforecast.core import NeuralForecast
 from neuralforecast.models import NHITS, NBEATS, PatchTST
 
 from neuralforecast.losses.numpy import mae, mse
 
 from nixtlats import TimeGPT
 
 %matplotlib inline

然后,为了访问TimeGPT模型从文件中读取API密钥。

 with open("data/timegpt_api_key.txt", 'r') as file:
         API_KEY = file.read()

然后读取数据。

 df = pd.read_csv('data/medium_views_published_holidays.csv')
 df['ds'] = pd.to_datetime(df['ds'])
 
 df.head()

从上图中,我们可以看到数据集的格式与我们使用Nixtla的其他开源库时的格式相同。

我们有一个unique_id列来标记不同的时间序列,但在本例中,我们只有一个序列。

y列表示我的博客每天的浏览量,published是一个简单的标志,用来标记某一天有新文章发布(1)或没有文章发布(0)。一般来说当新内容发布时,浏览量通常会增加一段时间。

最后,列is_holiday表示美国是否有假日。在假期很少有人会访问。

现在让我们把我们的数据可视化。

 published_dates = df[df['published'] == 1]
 
 fig, ax = plt.subplots(figsize=(12,8))
 
 ax.plot(df['ds'], df['y'])
 ax.scatter(published_dates['ds'], published_dates['y'], marker='o', color='red', label='New article')
 ax.set_xlabel('Day')
 ax.set_ylabel('Total views')
 ax.legend(loc='best')
 
 fig.autofmt_xdate()
 
 
 plt.tight_layout()

从上图中,我们可以看到一些有趣的行为。首先,红点表示新发表的文章,并且几乎紧随其后的是访问高峰。

我们还注意到2021年的活动减少,这反映在日浏览量减少上。最后在2023年,我们注意到一篇文章发表后,访问量出现了一些异常高峰。

放大数据,我们还发现了明显的每周季节性。

从上图中,可以看到周末访问的访客比平时少。

考虑到所有这些,让我们看看如何使用TimeGPT进行预测。

首先,将数据集分成训练集和测试集。在这里为测试集保留168个时间步长,这对应于24周的每日数据。

 train = df[:-168]
 test = df[-168:]

然后使用7天的预测范围,因为我对预测整个星期的每日视图感兴趣。

该API没有附带验证的实现。因此我们创建自己的循环,一次生成七个预测,直到我们对整个测试集进行预测。

 future_exog = test[['unique_id', 'ds', 'published', 'is_holiday']]
 
 timegpt = TimeGPT(token=API_KEY)
 
 timegpt_preds = []
 
 for i in range(0, 162, 7):
 
     timegpt_preds_df = timegpt.forecast(
         df=df.iloc[:1213+i],
         X_df = future_exog[i:i+7],
         h=7,
         finetune_steps=10,
         id_col='unique_id',
         time_col='ds',
         target_col='y'
     )
     
     preds = timegpt_preds_df['TimeGPT']
     
     timegpt_preds.extend(preds)

在上面的代码块中必须传递外生变量的未来值,因为它们是静态变量,我们知道未来假期的日期,

这里我们还使用finetune_steps参数对TimeGPT进行了微调。

一旦循环完成就可以将预测结果添加到测试集中。TimeGPT一次生成7个预测,直到获得168个预测,因此我们可以评估它预测下周每日浏览量的能力。

 test['TimeGPT'] = timegpt_preds
 
 test.head()

与N-BEATS, N-HiTS和PatchTST对比

现在我们用其他方法来进行对比,这里使用了N-BEATS, N-HiTS和PatchTST。

 horizon = 7
 
 models = [NHITS(h=horizon,
                input_size=5*horizon,
                max_steps=50),
          NBEATS(h=horizon,
                input_size=5*horizon,
                max_steps=50),
          PatchTST(h=horizon,
                  input_size=5*horizon,
                  max_steps=50)]

然后,我们初始化NeuralForecast对象并指定数据的频率,在本例中是每天。

 nf = NeuralForecast(models=models, freq='D')

在7个时间步骤的24个窗口上运行执行验证,以获得与用于TimeGPT的测试集一致的预测。

 preds_df = nf.cross_validation(
     df=df, 
     static_df=future_exog , 
     step_size=7, 
     n_windows=24
 )

然后合并结果,这样就得到了一个包含所有模型预测的单一DataFrame。

 preds_df['TimeGPT'] = test['TimeGPT']

下面开始评估每个模型的性能。在度量性能指标之前,可视化一下测试集中每个模型的预测。

每个模型之间有很多重叠。我们确实注意到N-HiTS预测的两个峰值在现实中没有实现。此外PatchTST似乎经常预测不足。但是TimeGPT似乎通常与实际数据重叠得很好。

但是评估每个模型性能的唯一方法是度量性能指标。在这里使用平均绝对误差(MAE)和均方误差(MSE)。另外我们做的一个动作是将预测四舍五入为整数,因为小数在每日访问量上下文中是没有意义的。

 preds_df = preds_df.round({
     'NHITS': 0,
     'NBEATS': 0,
     'PatchTST': 0,
     'TimeGPT': 0
 })
 
 data = {'N-HiTS': [mae(preds_df['NHITS'], preds_df['y']), mse(preds_df['NHITS'], preds_df['y'])],
        'N-BEATS': [mae(preds_df['NBEATS'], preds_df['y']), mse(preds_df['NBEATS'], preds_df['y'])],
        'PatchTST': [mae(preds_df['PatchTST'], preds_df['y']), mse(preds_df['PatchTST'], preds_df['y'])],
        'TimeGPT': [mae(preds_df['TimeGPT'], preds_df['y']), mse(preds_df['TimeGPT'], preds_df['y'])]}
 
 metrics_df = pd.DataFrame(data=data)
 metrics_df.index = ['mae', 'mse']
 
 metrics_df.style.highlight_min(color='lightgreen', axis=1)

从上图中可以看到TimeGPT是表现最好,它实现了最低的MAE和MSE,其次是N-BEATS, PatchTST和N-HiTS。

这是一个令人兴奋的结果,因为TimeGPT从未见过这个数据集,并且只进行了几个步骤的微调。虽然这不是一个详尽的实验,但我相信它确实展示了潜在的基础模型在预测领域的潜力。

对TimeGPT的看法

TimeGPT是时间序列预测的第一个基础模型。它利用了Transformer架构,并在1000亿个数据点上进行了预训练,以便对新的未见过的数据进行零样本推断。该模型结合保形预测技术,无需特定数据集的训练即可生成预测区间并进行异常检测。

虽然TimeGPT的简短实验证明是令人兴奋的,但原始论文在许多重要概念仍然含糊不清。

比如我们不知道使用了哪些数据集来训练和测试模型,因此我们无法真正验证TimeGPT的性能结果,如下所示。

从上表中可以看到TimeGPT在每月和每周频率上表现最好,N-HiTS和TFT通常排名第二或第三。因为我们不知道使用了什么数据,所以我们无法验证这些指标。

虽然TimeGPT看起来很好,但是它还是有2个问题要面对:

1、当涉及到如何训练模型以及如何调整模型来处理时间序列数据时缺乏透明度,可以认为是没有任何的可解释性。

2、这个模型是用于商业用途的,这也就是为什么论文缺少细节,无法让人通过论文来复制TimeGPT。当然这并没有错,因为毕竟是要赚钱的。但这就导致论文缺乏可重复性,没人或再去研究和改进他。

虽然是这样,但是我还是觉得这能激发时间序列基础模型的新工作和研究,并且我们最终能看到这些模型的开源版本,就像我们在LLM中看到的那样。

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

作者:Marco Peixeiro

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

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

相关文章

21款奔驰GLE450升级23P驾驶辅助 缓解开车疲劳

驾驶辅助和自动驾驶的区别就是需要人为去接管,虽然车辆会根据道路自己行驶,弯道上也能居中自动修正行驶,长时间不接管方向盘,系统会提示人为接管,这就是奔驰的23P驾驶辅助系统, 很多车友升级23P驾驶辅助系…

跨境商城开发秘籍揭密:如何选择最适合你的技术方案?

在全球化的商业环境下,跨境电商正蓬勃发展,成为许多企业拓展国际市场的首选方式。而跨境商城开发作为实现这一目标的关键,选择合适的技术方案显得尤为重要。本文将揭示跨境商城开发的秘籍,为您提供权威的指导,助力您选…

Mysql数据库 4.SQL语言 DQL数据查询语言 查询

DQL数据查询语言 从数据表中提取满足特定条件的记录 1.单表查询 2.多表查询 查询基础语法 select 关键字后指定要查询到的记录的哪些列 语法:select 列名(字段名)/某几列/全部列 from 表名 [具体条件]; select colnumName…

如何助力企业出海?未来发展趋势是什么?尽在「云通信」Tech专场

2023杭州云栖大会 倒计时4天! 阿里云云通信 2大并行Session 6场话题演讲 今日「云通信」Tech 议程内容抢先知晓 01 「云通信」Tech • 国内企业出海,如何更高地提升市场营销的ROI,提升客户的转化率? • 面对海外存量客户&a…

数据库简介和sqlite3安装

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。 严格意义上来说,"数据库"不能被称之为"数据库",而…

GoLong的学习之路(十四)语法之标准库 time(时间包)的使用

文章目录 time包跨时区时间戳时间间隔时间操作addSubEqualBeforeAfter 定时器时间格式化解析字符串格式的时间 time包 时间和日期是我们编程中经常会用到的,本文主要介绍了 Go 语言内置的 time 包的基本用法。 time 包提供了一些关于时间显示和测量用的函数。time…

Mac 安装nvm

安装方案: 1. 从github下载nvm仓库到 ~/目录 地址:https://github.com/nvm-sh/nvm.git git clone https://github.com/nvm-sh/nvm.git 2. 进入nvm目录中执行install.sh等待执行完成,执行的操作方法就是直接将文件拖入到终端然后回车。 3.…

微信小程序 slot 不显示

问题:创建组件&#xff0c;使用带名字的slot&#xff0c;页面调用组件使用slot不显示 源码&#xff1a; 组件xml <view class"p-item br24" style"{{style}}"><slot name"right" wx:if"{{!custBottom}}"></slot>&l…

IP应用场景API的反欺诈潜力:保护在线市场不受欺诈行为侵害

前言 在数字化时代&#xff0c;网络上的商业活动迅速增长&#xff0c;但与之同时&#xff0c;欺诈行为也在不断演化。欺诈者不断寻找新方法来窃取个人信息、进行金融欺诈以及实施其他不法行为。为了应对这一威胁&#xff0c;企业和组织需要强大的工具&#xff0c;以识别和防止…

【干货】JVS低代码表单基础组件的配置与应用

表单的基础组件主要用于收集用户输入的数据&#xff0c;并对这些数据进行验证和处理。通过表单组件&#xff0c;用户可以输入各种类型的数据&#xff0c;如文本、数字、日期、选择项等。这些数据可以通过表单的提交按钮提交到服务器进行处理&#xff0c;从而使网站或应用程序能…

元宇宙热潮依旧,《神由都城》引人注目

随着5G、云计算、人工智能、虚拟现实等技术的成熟,元宇宙的发展已然驶入快车道,这对企业来说是一个发展壮大的好机会。常孝股份抓住创新发展的机遇,打造属于自己的元宇宙世界——《神由都城》。 《神由都城》是以常孝股份旗下的文旅景区“中华孝道园”为依托,打造的元宇宙世界…

leetcode刷题日记之做菜顺序

原题链接&#xff1a; 做菜顺序 一个厨师收集了他 n 道菜的满意程度 satisfaction &#xff0c;这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间&#xff08;包含之前每道菜所花费的时间&#xff09;乘以这道菜的满意程…

【点云学习PCL 】一

点云学习 说明&#xff1a;仅做学习使用&#xff0c;侵删 参考网址1 一、点云基础 0 概述 PCL&#xff08;Point Cloud Library&#xff09;是用于 2D/3D 图像和点云处理的大型开源跨平台的 C 编程库&#xff0c;PCL 框架实现了大量点云相关的通用算法和高效的数据结构&…

Bytebase 2.10.0 - 支持更灵活的变更发布人:指定任意角色或自定义审批流的最后节点

&#x1f680; 新功能 发布策略支持制定更灵活的变更发布人&#xff1a;可以指定任意角色集合&#xff0c;也可以指定自定义审批流的最后一个审批人。 支持在项目中创建分支保护规则。支持给数据库设置标签。支持给字段设置标签。支持给表设置分类分级。 &#x1f384; 改进 …

C# Winform编程(10)Chart图表控件

Chart控件 Chart控件Chart属性详述Chart属性设置图表样式属性数据样式属性图例样式图标区样式SeriesChartType类型 Chart控件鼠标滚轮事件特殊处理Series绑定数据演示代码鼠标滚轮缩放图表示例参考引用 Chart控件 Chart控件是微软自带的一种图形可视化组件&#xff0c;使用简单…

node开发微信群聊机器人第⑤章

▍PART 序 看本文时&#xff0c;请确保前4章都已经看过&#xff0c;不然本章你看着看着思维容易跳脱&#xff01;再一个机器人教程只在公众号&#xff1a;“程序员野区”首发。csdn会跟着发一份&#xff0c;未经博主同意&#xff0c;请勿转载&#xff01;欢迎分享到自己的微信…

前端入门(一)JavaScript语法、数据类型、运算、函数

文章目录 概念JavaScript编写的位置基本语法数据类型变量声明var、let、constundefined与null的区别字符串类型数组Map和Set函数定义与参数传递 变量的作用域let、const方法的定义与调用常用内部对象json对象原型操作BOM对象操作DOM对象表单操作&#xff08;验证&#xff09;MD…

年轻人开发谁用默认背景?我直接美图安排上

文章目录 一、你还在用传统的开发界面吗二、年轻人的界面 1.动漫型2.偶像型3.提神型 三、更换背景的操作 第一步第二步第三步 一、你还在用传统的开发界面吗 不比不知道&#xff0c;一比吓一跳&#xff0c;都2023年了&#xff0c;你还在用Pycharm的默认背景写代码吗&#xf…

面试必考精华版Leetcode215. 数组中的第K个最大元素

题目&#xff1a; 代码&#xff08;2023年10月27日首刷看解析&#xff09;&#xff1a; class Solution { public:int findKthLargest(vector<int>& nums, int k) {return quickselect(nums,k);}int quickselect(vector<int>& nums,int k){vector<int&…

【Axure教程】中继器制作树元件

树元件在计算机科学和软件工程中常常用于构建和操作树形数据结构&#xff0c;提供了一种有效的方式来处理和查询具有层次性关系的数据&#xff0c;使开发人员能够更容易地组织和检索信息&#xff0c;用于组织和管理数据&#xff0c;具有各种应用。 那Axure里面也自带了一个树元…