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是首次尝试创建用于时间序列预测的基础模型。
如何对TimeGPT进行训练以在未见数据上进行推理的示例
从上图中,我们可以看到TimeGPT背后的一般思想是在大量不同领域的数据上训练模型,然后在未见数据上进行零次推理。当然,这种方法依赖于迁移学习,即模型能够使用其在训练过程中获得的知识来解决新任务。现在,这只有在模型足够大且在大量数据上进行训练时才能实现。
训练TimeGPT
为此,作者在超过1000亿个数据点上训练了TimeGPT,所有这些数据点都来自开源时间序列数据。该数据集涵盖了各种领域,从金融、经济和天气到网络流量、能源和销售。
请注意,作者并没有透露用于策划1000亿个数据点的公共数据的来源。
这种多样性对于基础模型的成功至关重要,因为它可以学习不同的时间模式,从而更好地进行泛化。
例如,我们可以预期天气数据具有每天(白天较热,夜晚较冷)和每年的季节性,而车流量数据可能具有每天(白天车辆更多)和每周的季节性(工作日车辆更多)。
为确保模型的健壮性和泛化能力,预处理被保持到最小。实际上,只填充了缺失值,其余保持在原始形式。虽然作者没有指定数据插补的方法,但我怀疑使用了某种插值技术,如线性插值、样条插值或移动平均插值。然后,该模型在多天内进行训练,期间优化了超参数和学习率。虽然作者没有透露训练需要多少天和多少个GPU,但我们知道该模型是在PyTorch中实现的,它使用Adam优化器和学习速率衰减策略。
TimeGPT的架构
TimeGPT利用基于Google和多伦多大学在2017年的开创性工作的自注意力机制的Transformer架构。
从上图中,我们可以看到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 pltfrom neuralforecast.core import NeuralForecast
from neuralforecast.models import NHITS, NBEATS, PatchTSTfrom neuralforecast.losses.numpy import mae, msefrom 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()
我们数据集的前五行
从上图中,我们可以看到数据集的格式与使用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进行预测。
使用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()
TimeGPT的预测
使用N-BEATS、N-HiTS和PatchTST进行预测
现在,让我们应用其他方法,看看在我们的数据集上对这些模型进行专门训练是否能产生更好的预测。对于这个实验,如前所述,我们使用N-BEATS、N-HiTS和PatchTST。
horizon = 7models = [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']
接下来,我们准备评估每个模型的性能
评估
在测量性能指标之前,让我们可视化每个模型在我们的测试集上的预测。
可视化每个模型的预测
首先,我们看到每个模型之间有很多重叠。然而,我们注意到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的简短实验感到兴奋,但我必须指出,原始论文在许多重要领域仍然模糊不清。同样,我们不知道用于训练和测试模型的数据集是什么,因此我们无法真正验证TimeGPT的性能结果,如下所示。
TimeGPT的性能结果
从上表中,我们可以看到TimeGPT在月度和周度频率上表现最佳,N-HiTS和Temporal Fusion Transformer(TFT)通常排名第二或第三。然而,由于我们不知道使用了哪些数据,我们无法验证这些指标。在模型是如何训练的以及如何适应处理时间序列数据方面,缺乏透明度。
结论
TimeGPT是用于时间序列预测的第一个基础模型。它利用Transformer架构,经过预训练,使用来自1000亿数据点的零样本推理能力。结合了符合预测技术,该模型可以生成预测区间,并在没有对特定数据集进行训练的情况下执行异常检测。
· END ·
HAPPY LIFE
本文仅供学习交流使用,如有侵权请联系作者删除
相关文章:
TimeGPT:时间序列预测模型实例
时间序列预测领域正在经历一个非常激动人心的时期。在过去的三年里,我们见证了许多重要的贡献,如N-BEATS、N-HiTS、PatchTST和TimesNet等。同时,大型语言模型(LLM)近来在流行度方面取得了很大的成功,例如Ch…...
【JavaEE】多线程 (1)
目录 1. 认识线程(Thread) 1) 线程是什么 2) 为啥要有线程 3) 进程和线程的区别 2.第⼀个多线程程序 3.多线程的其他创建方式 方法二:实现 Runnable 接⼝ 方法三:匿名内部类 方法四:实现Runable, 重写run, 匿名内部类 方法五:使用lambda表达式…...
linux 应用层同步与互斥机制之条件变量
2、条件变量 互斥量防止多个线程同时访问同一共享变量。(我们称为互斥) 有一种情况,多个线程协同工作。一个线程的消费需要等待另一个线程的产出。必须线程B完成了应有的任务,满足了某一个条件,线程A才能继续执行。&…...
3.5毫米音频连接器接线方式
3.5毫米音频连接器接线方式 耳机插头麦克风插头 绘制电路图注意事项 3.5毫米音频连接器分为单声道开关型和无开关型如下图: sleeve(套筒) tip(尖端) ring(环) 耳机插头 麦克风插头 绘制电路图…...
智慧农田可视化大数据综合管理平台方案,EasyCVR助力农业高质量发展
一、背景需求 我国是农业大国,农业耕地面积达到20亿亩。随着物联网、大数据、人工智能等新一代信息技术与农业农村加速融合,以及国家对农业的重视,智慧农业对于我国农业现代化建设和实施乡村振兴战略具有重大引领与推动作用。在传统农田生产…...
python超详细基础文件操作【建议收藏】
文章目录 前言1 文件操作1.1 文件打开与关闭1.1.1 打开文件1.1.2 关闭文件 1.2 访问模式及说明 2 文件读写2.1 写数据(write)2.2 读数据(read)2.3 读数据(readlines)2.3 读数据(readline&#x…...
华为变革进展指数TPM的五个级别:试点级、推行级、功能级、集成级和世界级
华为变革进展指数TPM的五个级别:试点级、推行级、功能级、集成级和世界级 TPM(Transformation Progress Metrics,变革进展指标)用来衡量管理体系在华为的推行程度和推行效果,并找出推行方面的不足与问题,…...
vue el-select多选封装及使用
使用了Element UI库中的el-select和el-option组件来构建多选下拉框。同时,也包含了一个el-input组件用于过滤搜索选择项,以及el-checkbox-group和el-checkbox组件用于显示多选项。 创建组件index.vue (src/common-ui/selectMultiple/index.vue) <tem…...
大模型上下文学习(ICL)训练和推理两个阶段31篇论文
大模型都火了这么久了,想必大家对LLM的上下文学习(In-Context Learning)能力都不陌生吧? 以防有的同学不太了解,今天我就来简单讲讲。 上下文学习(ICL)是一种依赖于大型语言模型的学习任务方式…...
WordPress(安装比子主题文件)zibll-7.5.1
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、新建网站二、配置ssl三.配置伪静态四.上传文件五.添加本地访问前言 提示:这里可以添加本文要记录的大概内容: 首先,我们要先理解什么是授权原理。 原理就是我们大家运营网站,点击授权…...
蓝桥杯 动态规划
01 数字三角形 #include<bits/stdc.h> using namespace std; const int N105; using lllong long; ll a[N][N],dp[N][N]; int main(){int n;cin>>n;for(int i1;i<n;i){for(int j1;j<i;j){cin>>a[i][j];}}for(int i5;i>1;i--){for(int j1;j<i;j){…...
【图论】重庆大学图论与应用课程期末复习资料2-各章考点(计算部分)(私人复习资料)
图论各章考点 二、树1、避圈法(克鲁斯克尔算法)2、破圈法3、Prim算法 四、路径算法1、Dijkstra算法2、Floyd算法 五、匹配1、匈牙利算法(最大权理想匹配(最小权权值取反)) 六、行遍性问题1、Fleury算法&…...
整数和浮点数在内存中的存储(大小端详解)
目录 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1为什么有大小端? 2.2请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)-百度笔试题 方法一(char*强制类型转换)…...
SpringBoot 集成 ChatGPT,实战附源码
1 前言 在本文中,我们将探索在 Spring Boot 应用程序中调用 OpenAI ChatGPT API 的过程。我们的目标是开发一个 Spring Boot 应用程序,能够利用 OpenAI ChatGPT API 生成对给定提示的响应。 您可能熟悉 ChatGPT 中的术语“提示”。在 ChatGPT 或类似语…...
数据结构——希尔排序(详解)
呀哈喽,我是结衣 不知不觉,我们的数据结构之路已经来到了,排序这个新的领域,虽然你会说我们还学过冒泡排序。但是冒泡排序的性能不高,今天我们要学习的希尔排序可就比冒泡快的多了。 希尔排序 希尔排序的前身是插入排…...
C++ day53 最长公共子序列 不相交的线 最大子序和
题目1:1143 最长公共子序列 题目链接:最长公共子序列 对题目的理解 返回两个字符串的最长公共子序列的长度,如果不存在公共子序列,返回0,注意返回的是最长公共子序列,与前一天的最后一道题不同的是子序…...
ubuntu中删除镜像和容器、ubuntu20.04配置静态ip
1 删除镜像 # 短id sudo docker rmi 镜像id # 完整id sudo docker rmi 镜像id# 镜像名【REPOSITORY:TAG】 sudo docker rmi redis:latest2 删除容器 # 删除某个具体容器 sudo docker rm 容器id# 删除Exited状态/未运行的容器,三种命令均可 sudo docker rm docker …...
华为手环 8 五款免费表盘已上线,请注意查收
华为手环 8,作为一款集时尚与实用于一体的智能手环,不仅具备强大的功能,还经常更新的表盘样式,让用户掌控时间与健康的同时,也能展现自己的时尚品味。这不,12 月官方免费表盘又上新了,推出了五款…...
JOSEF约瑟 同步检查继电器DT-13/200 100V柜内安装,板前接线
系列型号 DT-13/200同步检查继电器; DT-13/160同步检查继电器; DT-13/130同步检查继电器; DT-13/120同步检查继电器; DT-13/90同步检查继电器; DT-13/254同步检查继电器; 同步检查继电器DT-13/200 100V柜内板前接线 一、用途 DT-13型同步检查继电器用于两端供电线路的…...
龙迅#LT8311X3 USB中继器应用描述!
1. 概述 LT8311X3是一款USB 2.0高速信号中继器,用于补偿ISI引起的高速信号衰减。通过外部下拉电阻器选择的编程补偿增益有助于提高 USB 2.0 高速信号质量并通过 CTS 测试。 2. 特点 • 兼容 USB 2.0、OTG 2.0 和 BC 1.2• 支持 HS、FS、LS 信令 • 自动检测和补偿 U…...
eclipse jee中 如何建立动态网页及服务的设置问题
第一次打开eclipse 时,设置工作区时,一定是空目录 进入后 File-----NEW------Dynamic Web Project 填 项目名,不要有大写 m1 next next Generate前面打对勾 finish 第一大步: window----Preferences type filter text 处填 :Serve…...
一张网页截图,AI帮你写前端代码,前端窃喜,终于不用干体力活了
简介 众所周知,作为一个前端开发来说,尤其是比较偏营销和页面频繁改版的项目,大部分的时间都在”套模板“,根本没有精力学习前端技术,那么这个项目可谓是让前端的小伙伴们看到了一丝丝的曙光。将屏幕截图转换为代码&a…...
处理k8s中创建ingress失败
创建ingress: 如果在创建过程中出错了: 处理方法就是: kubectl get ValidatingWebhookConfiguration kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission 然后再次创建,发现可以:...
Redis高可用集群架构
高可用集群架构 哨兵模式缺点 主从切换阶段, redis服务不可用,高可用不太友好只有单个主节点对外服务,不能支持高并发单节点如果设置内存过大,导致持久化文件很大,影响数据恢复,主从同步性能 高可用集群…...
JAVA常见问题解答:解决Java 11新特性兼容性问题的六个步骤
引言: 随着技术的不断发展,Java作为一种被广泛使用的编程语言,也在不断更新和改进。Java 11作为Java的最新版本,带来了许多新的特性和改进。然而,对于一些老旧的Java应用程序来说,升级到Java 11可能会带来一…...
【C语言】深入理解指针(1)
目录 前言 (一)内存与地址 从实际生活出发 地址 内存 内存与地址关系密切 (二)指针变量 指针变量与取地址操作符 指针变量与解引用操作符 指针的大小 指针的运算 指针 - 整数 指针-指针 指针的关系运算 指针的类型的…...
MySQL的系统信息函数
系统信息函数让你更好的使用MySQL数据库 1、version()函数 查看MySQL系统版本信息号 select version();2、connection_id()函数 查看当前登入用户的连接次数 直接调用CONNECTION_ID()函数--不需任何参数--就可以看到当下连接MySQL服务器的连接次数,不同时间段该…...
python中.format() 方法
.format() 方法是一种用于格式化字符串的方法,它允许将变量的值插入到字符串中的占位符位置上。该方法可以接受一个或多个参数,并根据给定的格式规则将它们插入到字符串中。 下面是一些使用 .format() 方法的示例: # 基本用法 name "…...
【新手解答8】深入探索 C 语言:递归与循环的应用
C语言的相关问题解答 写在最前面问题:探索递归与循环在C语言中的应用解析现有代码分析整合循环示例代码修改注意事项结论 延伸:递归和循环的退出条件设置解析使用递归使用循环选择适合的方法 写在最前面 一位粉丝私信交流,回想起了当初的我C…...
服务器中深度学习环境的配置
安装流程 11.17 日,周末去高校参加学术会议,起因, 由于使用了某高校内的公共有线网络, 远程连接服务器后,黑客利用 ssh 开放的 22 端口, 篡改了主机的配置, 使得只要一连上网络, 服…...
动态网站开发技术php/百度163黄页关键词挖掘
Ⅰ考查目标 计算机学科专业基础综合考试涵盖数据机构、计算机组成原理、操作系统和计算机网络等学科专业基础课程。要求考生比较系统地掌握上述专业基础课程的概念、基本原理和方法,能够运用所学的基本原理和基本方法分析、判断和解决有关理论问题和实际问题。 Ⅱ…...
会展设计用什么软件/石家庄抖音seo
这里我们来谈论下函数式编程中另一个重要的概念,柯里化 首先,我们先通过下面的方式将上节代码中不纯的函数变成纯函数。就是将mini拿到函数内部去。 function checkAge (age) {let mini 18;return age > mini; }但是当我们把这个mini拿到函数内部的…...
设计师网址导航 优设/福州短视频seo服务
1.直接使用定义好的颜色 \usepackage{color} \textcolor{red/blue/green/black/white/cyan/magenta/yellow}{text} 其中textcolor{...}中包含的是系统定义好的颜色 2.组合red、green和blue的值合成我们想要的颜色 \usepackage{color} \textcolor[rgb]{r,g,b}{text} 其中{r,g,b}…...
做网站泰安/青岛网站建设培训学校
C/C预处理指令常见的预处理指令如下: #空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义࿰…...
做外贸门户网站/seo免费优化网站
基本字符IVXLCDM相应的阿拉伯数字表示为1510501005001000相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ3;小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ8、Ⅻ12;小的数字(限于…...
建设部网站官网 建造师 挂靠/seo优化好做吗
方法一:生成两个(1,5)的随机数,这样一共是25种情况,注意这两个数是有顺序的,从这25种情况中,取前21种,每三种代表(1,7)中的一个数字,如果取到的是…...