TimeGPT:时间序列预测模型实例

时间序列预测领域正在经历一个非常激动人心的时期。在过去的三年里,我们见证了许多重要的贡献,如N-BEATS、N-HiTS、PatchTST和TimesNet等。同时,大型语言模型(LLM)近来在流行度方面取得了很大的成功,例如ChatGPT,因为它们可以适应各种任务而无需进一步训练。

这引出了一个问题:类似于自然语言处理中存在的基础模型,是否可以存在用于时间序列的基础模型?是否可能对大量时间序列数据进行预训练的大型模型然后能够在未见数据上产生准确的预测?

通过Azul Garza和Max Mergenthaler-Canseco提出的TimeGPT-1,作者将LLM背后的技术和架构调整到了预测领域,成功地构建了第一个能够进行零次推理的时间序列基础模型。在本文中,我们首先探讨TimeGPT背后的架构以及该模型的训练方式。然后,我们将其应用于一个预测项目,评估其性能与其他最先进的方法,如N-BEATS、N-HiTS和PatchTST等进行对比。

探索TimeGPT

正如前面提到的,TimeGPT是首次尝试创建用于时间序列预测的基础模型。58e75003dd7347b3c1d90672663cb1b5.jpeg

如何对TimeGPT进行训练以在未见数据上进行推理的示例

从上图中,我们可以看到TimeGPT背后的一般思想是在大量不同领域的数据上训练模型,然后在未见数据上进行零次推理。当然,这种方法依赖于迁移学习,即模型能够使用其在训练过程中获得的知识来解决新任务。现在,这只有在模型足够大且在大量数据上进行训练时才能实现。

训练TimeGPT

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

请注意,作者并没有透露用于策划1000亿个数据点的公共数据的来源。

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

例如,我们可以预期天气数据具有每天(白天较热,夜晚较冷)和每年的季节性,而车流量数据可能具有每天(白天车辆更多)和每周的季节性(工作日车辆更多)。

为确保模型的健壮性和泛化能力,预处理被保持到最小。实际上,只填充了缺失值,其余保持在原始形式。虽然作者没有指定数据插补的方法,但我怀疑使用了某种插值技术,如线性插值、样条插值或移动平均插值。然后,该模型在多天内进行训练,期间优化了超参数和学习率。虽然作者没有透露训练需要多少天和多少个GPU,但我们知道该模型是在PyTorch中实现的,它使用Adam优化器和学习速率衰减策略。

TimeGPT的架构

TimeGPT利用基于Google和多伦多大学在2017年的开创性工作的自注意力机制的Transformer架构。

ccb7d2ece3e728415f9f4dcdac470e72.jpeg

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

输入可以包含一窗历史数据,以及外生数据,比如一次性事件或另一个时间序列。

输入被馈送到模型的编码器部分。编码器内部的注意力机制然后从输入中学习不同的属性。然后将其馈送到解码器,解码器使用学到的信息生成预测。当达到用户设置的预测时间范围的长度时,预测序列就结束了。值得注意的是,作者在TimeGPT中实现了符合性预测,允许模型基于历史误差估计预测区间。

TimeGPT的功能

考虑到TimeGPT是构建时间序列基础模型的首次尝试,它具有各种广泛的功能。首先,由于TimeGPT是一个预训练模型,这意味着我们可以在没有在特定数据上进行训练的情况下生成预测。当然,仍然可以对模型进行微调以适应我们的数据。

其次,该模型支持用于预测目标的外生变量,并且可以处理多变量预测任务。最后,通过使用符合性预测,TimeGPT可以估计预测区间。这反过来使模型能够执行异常检测。基本上,如果数据点落在99%置信区间之外,那么模型将其标记为异常。

请记住,所有这些任务都可以使用零次推理或进行一些微调来完成,这对于时间序列预测领域来说是一种范式的彻底变革。现在,我们对TimeGPT有了更加坚实的理解,知道它是如何工作和如何训练的,让我们看看该模型的实际表现。

使用TimeGPT进行预测

现在,让我们将TimeGPT应用于一个预测任务,并将其性能与其他模型进行比较。请注意,在撰写本文时,TimeGPT仅通过API可访问,而且它处于封闭测试阶段。正如前面提到的,该模型是在来自公开可用数据的1000亿个数据点上进行训练的。由于作者没有指定实际使用的数据集,我认为测试该模型是否具有数据集可能在训练过程中看到的知名基准数据集,如ETT或天气数据,是不合理的。

导入库并读取数据

自然的第一步是导入用于这个实验的库。

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密钥。请注意,我没有将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()

7e5b9ce96da1033d1add51715f738ced.jpeg

我们数据集的前五行

从上图中,我们可以看到数据集的格式与使用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()

61d1e3754dbf647d067daf6fb9047542.jpeg

博客的日访问量

从上图中,我们已经可以看到一些有趣的行为。首先,注意红色点表示新发布的文章,它们几乎立即在访问量中出现峰值。我们还注意到2021年的活动较少,这反映在我的博客的日访问量较少。最后,在2023年,我们注意到在发布文章后出现了一些异常的访问高峰。在放大数据后,我们还发现了明显的每周季节性。

14be46ba5183b3d756e2f6dc55e49337.jpeg

博客的日访问量。在这里,我们看到了明显的每周季节性,周末访问的人数较少

从上图中,我们现在可以看到,在周末,博客的访问者较少,而在工作日,访问者较多。考虑到所有这些,让我们看看如何使用TimeGPT进行预测。

使用TimeGPT进行预测

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

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

然后,我们将预测视野设置为七天,因为我有兴趣预测整个星期的每日访问量。

现在,该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每次生成七个预测,直到获得168个预测,以便我们可以评估其在预测下周每日访问量方面的能力。

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

62348786a2c99dcb0a9ab48dea5258e6.jpeg

TimeGPT的预测

使用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')

然后,我们对24个窗口的7个时间步执行交叉验证,以获得与用于TimeGPT的测试集对齐的预测。

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

然后,我们可以简单地将来自TimeGPT的预测添加到这个新的`preds_df` DataFrame 中,以获得一个包含所有模型预测的单个 DataFrame。

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

f2937179e6617a126987e615ff8de6a8.jpeg

接下来,我们准备评估每个模型的性能

评估

在测量性能指标之前,让我们可视化每个模型在我们的测试集上的预测。231f59f8c72b52ea2dad771a06883ed4.jpeg

可视化每个模型的预测

首先,我们看到每个模型之间有很多重叠。然而,我们注意到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)

d990c5ccf2b2c83c2f4064ab04bed10e.jpeg

从上图可以看出,TimeGPT是冠军模型,因为它在MAE和MSE方面表现最佳,其次是N-BEATS、PatchTST和N-HiTS。这是一个令人振奋的结果,因为TimeGPT从未见过这个数据集,而且只进行了少量微调。虽然这不是详尽无遗的实验,但我认为它确实展示了基础模型在预测领域可能具有的潜力。

我对TimeGPT的个人看法

虽然我对TimeGPT的简短实验感到兴奋,但我必须指出,原始论文在许多重要领域仍然模糊不清。同样,我们不知道用于训练和测试模型的数据集是什么,因此我们无法真正验证TimeGPT的性能结果,如下所示。


93a60ca57fd2ed3811fedbb065cb29d8.jpeg

TimeGPT的性能结果

从上表中,我们可以看到TimeGPT在月度和周度频率上表现最佳,N-HiTS和Temporal Fusion Transformer(TFT)通常排名第二或第三。然而,由于我们不知道使用了哪些数据,我们无法验证这些指标。在模型是如何训练的以及如何适应处理时间序列数据方面,缺乏透明度。

结论

TimeGPT是用于时间序列预测的第一个基础模型。它利用Transformer架构,经过预训练,使用来自1000亿数据点的零样本推理能力。结合了符合预测技术,该模型可以生成预测区间,并在没有对特定数据集进行训练的情况下执行异常检测。

·  END  ·

HAPPY LIFE

c27aa5bef8b34c15b60a1ad919a942a5.png

本文仅供学习交流使用,如有侵权请联系作者删除

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【源码解析】聊聊线程池 实现原理与源码深度解析(一)

一、Java 线程池 实现原理与源码深度解析 架构 总揽线程池设计,其实可以发现都是符合顶层的接口设计,中间抽象类,最终是实际工作类 使用示例 public class MyRunnable implements Runnable{Overridepublic void run() {System.out.println…

深度学习——第3章 Python程序设计语言(3.2 Python程序流程控制)

3.2 Python程序流程控制 目录 1.布尔数据类型及相关运算 2.顺序结构 3.选择(分支)结构 4.循环结构 无论是在机器学习还是深度学习中,Python已经成为主导性的编程语言。而且,现在许多主流的深度学习框架,例如PyTorc…

EXPLAIN解析

针对以下sql进行解析 EXPLAIN SELECTdauk.id AS daukId,dasm.mailbox AS storeAccount,dau.id,dau.id AS userId,das.score AS score,das.sell_num AS sellNum,dapa.product_link AS productLink,dapa.able_category_ids AS ableCategoryIds,dac.parent_name AS parentName,da…

SAP_ABAP_RZ11解决SAP运行超时问题 TIME_OUT / rdisp/scheduler/prio_high/max_runtime

SAP ABAP 顾问(开发工程师)能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读510次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!https://blog.csdn.net/j…

Unity | 渡鸦避难所-1 | 修复资源导入后呈现洋红色(Built-in 转 URP)

1 前言 Unity 编辑器导入 Asset Store 的资源包后,在预览和使用时,发现对象显示为洋红色 以小狐狸为例,打开资源包中的场景,可以看到小狐狸和地板均显示为洋红色 这是因为 Asset Store 中的资源包大部分是针对内置渲染管线项目制…

自然语言处理:电脑如何理解我们的语言?

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 ​ 文章目录 ​编辑 常见方法 1.基于词典的方法 2.基于计数的方法 基于推理的方法 Bert input_ids attention_mask token_type_ids 结语 在广…

施密特触发器

1、作用 简单来说,施密特触发器可以将模拟信号转变成数字信号 2、为什么不使用比较器将模拟信号转变成数字信号 当输入电平高于参考电压时,输出高电平;输入电压低于参考电压时,输出低电平。这样比较器也可以实现模拟信号转换成数…

封装Servlet使用自定义注解进行参数接收

文章目录 前言一、前后对比✨二、具体实现🎇三、效果展示🎏 前言 先说项目背景,本项目是本人在校期间老师布置的作业(就一个CRUD),课程是后端应用程序设计,其实就是servlet和jsp那一套&#xf…

Python异常处理【侯小啾python领航班系列(二十六)】

Python异常处理【侯小啾python领航班系列(二十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

Java三种代理模式:静态代理、动态代理和CGLIB代理

Java三种代理模式:静态代理、动态代理和CGLIB代理 代理模式 代理模式是23种设计模式种的一种。代理模式是一种结构型设计模式,它允许为其他对象提供一个替代品或占位符,以控制对这个对象的访问。代理模式可以在不修改被代理对象的基础上&am…

SPM/SCM 流量跟踪体系

SPM SPM(shopping page mark,导购页面标记) 是淘宝社区电商业务(xTao)为外部合作伙伴(外站)提供的跟踪引导成交效果数据的解决方案 注:也有解释 SPM 为超级位置模型(Super Position…

2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④

2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④ 2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④A模块基础设施设置/安全加固(本模块200分)A-1任务一 登录安全加固&#xf…

(C++)和为s的两个数字--双指针算法

个人主页:Lei宝啊 愿所有美好如期而遇 和为S的两个数字_牛客题霸_牛客网输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果。题目来自【牛客题霸】https://www.nowcoder.com/practice/390da4f7a…

关于你对 Zookeeper 的理解

看看普通人和高手是如何回答这个问题的? 普通人 Zookeeper 是一种开放源码的分布式应用程序协调服务 是一个分布式的小文件存储系统 一般对开发者屏蔽分布式应用开发过过程种的底层细节 用来解决分布式集群中应用系统的一致性问题 高手 对于 Zookeeper 的理解…

网工学习9-STP配置

如图 1 所示,当前网络中存在环路, SwitchA 、SwitchB 、SwitchC 和 SwitchD 都运行 STP,通过 彼此交互信息发现网络中的环路,并有选择的对某个端口进行阻塞,最终将环形网络结构修剪成无 环路的树形网络结构&#xff…

python | 使用open读写文件

在目前的环境中,读取文件应该算是最基本的操作了,python也内置了读写文件的函数,让我们来看下。这里有个小点要点一下,我们使用python是没法办直接操作文件的,而是操作系统给我们预留了接口,python通过操作…

关于this和构造器的理解

1.类中的this关键字表示当前对象的引用。它可以被用于解决变量名冲突问题,或者在一个方法中调用类的另一个方法。如果在方法中没有明确指定要使用哪个变量,那么编译器就会默认使用this关键字来表示当前对象。 下面是一个输出this关键字的示例代码&#…

从朋友的反思中想到的一些关于外贸的问题

昨天有两个好消息,一个是上星期客户要开业的项目昨天顺利搭建完成,没有任何东西缺少,虽然指导安装过程中也是一堆糟心的事,还好只是有惊无险,同时也收到来自中间商的感谢信,她说没想到如此复杂的搭建甚至每…

海外的直播平台

1、Netflix Netflix以允许人们从众多设备观看系列和电影而闻名。用户可以开设一个帐户并添加不同的用户个人资料,这对于想要为整个家庭拥有单独帐户而又无需开设大量帐户并单独付款的人来说非常有用。它现在增加了一个直播服务,允许观众参加现场练习课程…

Mars3d标绘的时候通过绑定单击事件,查询点击落点的图层类型

需求期望: 期望可以判断标绘点落下的位置是什么图层类型,例如是否是3dtitles模型,或者是gltf模型,或者是其他数据图层。 需求来源: 标绘点时,无法知道点落下的地方的图层类型 解决方案: ma…