Lag-Llama:第一个时间序列推测的开源根本模子先容和性能测试

[复制链接]
发表于 2026-2-21 11:52:19 | 显示全部楼层 |阅读模式
2023年10月,我们发表了一篇关于TimeGPT的文章,TimeGPT是时间序列推测的第一个根本模子之一,具有零样本推理、非常检测和共形推测本事。
固然TimeGPT是一个专有模子,只能通过API访问。但是它照旧引发了对时间序列根本模子的更多研究。到了2024年2月,已经有了一个用于时间序列推测的开源根本模子:laglllama。

在原论文《Lag-Llama: Towards Foundation Models for Probabilistic Time Series Forecasting》中,模子作为单变量概率推测的通用根本模子提出。它是由来自差异机构的大型团队开发的,这些机构包罗Morgan Stanley, ServiceNow, Université de Montréal, Mila-Quebec, 和McGill University.
在本文中,我们将探究Lag-Llama的架构、功能以及练习方式。还会将lagllama应用于一个推测项目中,并将其与其他深度学习方法Temporal Fusion Transformer (TFT) 和DeepAR举行性能比力。
Lag-Llama

lagllama是为单变量概率推测而构建的。它利用不依靠于频率的通用方法来标记时间序列数据。如许模子可以很好地推广到不可见的频率。
它利用Transformer体系布局和分布头来剖析输入令牌,并将它们映射到具有置信区间的将来推测。
1、具有滞后特性的标记
laglllama的标记战略是利用一组指定的滞厥后构造序列的滞后特性。
它将从这个列表中为给定的数据集选择全部符合的频率:
季度、月、周、天、小时、秒
也就是说,如果以逐日频率提供数据集,lag - llama将实验利用逐日滞后(t-1),每周滞后(t-7),每月滞后(t-30)等构建特性。
战略如下图所示。

从上图中,我们还可以看到模子构建了其他静态协变量,比方秒/分、小时/天等等,直到季度/年。固然这可以很好地推广到全部范例的时间序列,但它有一个致命的缺点:由于固定的滞后指数列表,输入令牌大概会变得非常大。
比方,查察每小时数据的每月频率须要730个时间步。这意味着除了全部静态协变量之外,输入令牌的长度至少为730。
2、Lag-Llama架构
Lag-Llama是一个基于transformer的纯解码器模子,其灵感来自尊型语言模子LLaMA的体系布局。

从图中可以看到输入标记是滞后时间步长和静态协变量的拼接。输入序列通过线性投影层将特性映射到解码器内部注意力模块的隐蔽维度。别的就是在末了的输出,序列被发送到一个分布头负责输出一个概率分布。
在推理过程中,输入序列天生下一个时间点的分布。然后通过自回归,模子逐个天生剩余的推测序列,直到到达设置的长度。
天生推测的自回归过程有用地允许模子为其推测天生不确定性区间。但是这里的题目就是如果序列很长,自回归的方式会将错误扩大。
3、Lag-Llama分布头
Lag-Llama的分布头负责输出概率分布。如许模子就可以或许天生推测区间。
在模子的迭代中,末了一层利用Student 's t分布来构造不确定性区间。从理论上讲差异的分布头可以组合在一起,但是论文并没有做如许的实验,大概是想在以后在做吧。
4、Lag-Llama的练习
作为一个根本模子,Lag-Llama显然是在大量的时间序列数据语料库上练习的,因此该模子可以很好地泛化未见过的时间序列并举行零样本推测。
论文中说:Lag-Llama在来自差异范畴的27个时间序列数据集上举行了练习,如能源、交通、经济等。
数据包罗7965个单变量时间序列,总计约3.52亿个令牌。
全部数据集都是开源的,包罗ethth, Exchange和Weather等。
Lag-Llama测试

由于代码已经开源,以是我们可以直接测试,我们起首利用Lag-Llama的零样本推测本事,并将其性能与特定命据模子(如TFT和DeepAR)举行比力。
Lag-Llama的实现是创建在GluonTS之上的,以是我们还须要安装这个库。实利用用了澳大利亚电力需求数据集,该数据集包罗五个单变量时间序列,以半小时的频率跟踪能源需求。
这里有个阐明:Lag-Llama如今的实现是初期阶段。而且存还在积极开发中,背面大概还会有很大的调解,由于如今还没参加微调的功能。
1、环境设置
  1. !git clone https://github.com/time-series-foundation-models/lag-llama/
  2. cd lag-llama
  3. pip install -r requirements.txt --quiet
复制代码
然后须要我们从HuggingFace下载模子的权重。
  1. !huggingface-cli download time-series-foundation-models/Lag-Llama lag-llama.ckpt --local-dir /content/lag-llama
复制代码
2、加载数据集
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import matplotlib.dates as mdates
  4. import torch
  5. from itertools import islice
  6. from gluonts.evaluation import make_evaluation_predictions, Evaluator
  7. from gluonts.dataset.repository.datasets import get_dataset
  8. from lag_llama.gluon.estimator import LagLlamaEstimator
复制代码
可以直接从GluonTS加载数据集。
  1. dataset = get_dataset("australian_electricity_demand")
  2. backtest_dataset = dataset.test prediction_length = dataset.metadata.prediction_length
  3. context_length = 3 * prediction_length
复制代码
3、利用Lag-Llama推测
简单地初始化模子并利用LagLlamaEstimator对象。
  1. ckpt = torch.load("lag-llama.ckpt", map_location=torch.device('cuda:0'))
  2. estimator_args = ckpt["hyper_parameters"]["model_kwargs"]
  3. estimator = LagLlamaEstimator( ckpt_path="lag-llama.ckpt",
  4.    prediction_length=prediction_length,
  5.    context_length=context_length,
  6.    input_size=estimator_args["input_size"],
  7.    n_layer=estimator_args["n_layer"],
  8.    n_embd_per_head=estimator_args["n_embd_per_head"],
  9.    n_head=estimator_args["n_head"],
  10.    scaling=estimator_args["scaling"],
  11.    time_feat=estimator_args["time_feat"])
  12. lightning_module = estimator.create_lightning_module()
  13. transformation = estimator.create_transformation()
  14. predictor = estimator.create_predictor(transformation, lightning_module)
复制代码
利用make_evaluation_predictions函数天生零样本的推测。
  1. forecast_it, ts_it = make_evaluation_predictions(
  2.    dataset=backtest_dataset,
  3.    predictor=predictor)
复制代码
这个函数返回天生器。我们须要把它们转换成列表。
  1. forecasts = list(forecast_it)
  2. tss = list(ts_it)
复制代码
4、评估
GluonTS可以利用Evaluator对象方便地盘算差异的性能指标。
  1. evaluator = Evaluator()
  2. agg_metrics, ts_metrics = evaluator(iter(tss), iter(forecasts))
复制代码
RMSE为481.57。
我们还可以随意地将推测可视化。
  1. plt.figure(figsize=(20, 15))
  2. date_formater = mdates.DateFormatter('%b, %d')
  3. plt.rcParams.update({'font.size': 15})
  4. for idx, (forecast, ts) in islice(enumerate(zip(forecasts, tss)), 4):
  5.    ax = plt.subplot(2, 2, idx+1)
  6.    plt.plot(ts[-4 * dataset.metadata.prediction_length:].to_timestamp(), label="target")
  7.    forecast.plot( color='g')
  8.    plt.xticks(rotation=60)
  9.    ax.xaxis.set_major_formatter(date_formater)
  10.    ax.set_title(forecast.item_id)
  11. plt.gcf().tight_layout()
  12. plt.legend()
  13. plt.show()
复制代码

上图可以看到模子对数据做出了公道的推测,只管它在第四个序列(图的右下角)上确实存在题目。
别的由于 Lag-Llama实现了概率推测,可以得到推测的不确定性区间。
5、与TFT和DeepAR相比
我们在数据集上练习TFT和DeepAR模子,看看它们是否能表现得更好。
为了节流时间,我们将练习设置为5个epoch。
  1. from gluonts.torch import TemporalFusionTransformerEstimator, DeepAREstimator
  2. tft_estimator = TemporalFusionTransformerEstimator(
  3.    prediction_length=prediction_length,
  4.    context_length=context_length,
  5.    freq="30min",
  6.    trainer_kwargs={"max_epochs": 5})
  7. deepar_estimator = DeepAREstimator(
  8.    prediction_length=prediction_length,
  9.    context_length=context_length,
  10.    freq="30min",
  11.    trainer_kwargs={"max_epochs": 5})
复制代码
练习过程。
  1. tft_predictor = tft_estimator.train(dataset.train)
  2. deepar_predictor = deepar_estimator.train(dataset.train)
复制代码
练习完成后,天生推测并盘算RMSE。
  1. tft_forecast_it, tft_ts_it = make_evaluation_predictions(
  2.    dataset=backtest_dataset,
  3.    predictor=tft_predictor)
  4. deepar_forecast_it, deepar_ts_it = make_evaluation_predictions(
  5.    dataset=backtest_dataset,
  6.    predictor=deepar_predictor)
  7. tft_forecasts = list(tft_forecast_it)
  8. tft_tss = list(tft_ts_it)
  9. deepar_forecasts = list(deepar_forecast_it)
  10. deepar_tss = list(deepar_ts_it)
  11. # Get evaluation metrics
  12. tft_agg_metrics, tft_ts_metrics = evaluator(iter(tft_tss), iter(tft_forecasts))
  13. deepar_agg_metrics, deepar_ts_metrics = evaluator(iter(deepar_tss), iter(deepar_forecasts))
复制代码
下表突出表现了性能最好的模子。

可以看到TFT是如今表现最好的模子,DeepAR的表现也优于laglama。
固然laglllama的表现好像不尽如人意,但该模子没有颠末微调,而且零样本测本身就比力困难。
风趣的是,只练习了5个epoch这两个模子都取得了比Lag-Llama更好的结果。固然样本推测可以节流时间,但练习五个epoch在时间和盘算本事方面的要求应该不是很苛刻。以是如今大概零样本学习方面还须要很大的提升。
总结

在实验了TimeGPT和Lag-Llama之后,Lag-Llama算是构建开源推测模子的第一步,但与TimeGPT相比,它在功能方面存在不敷。
TimeGPT可以处置惩罚多变量时间序列、不规则时间戳,并实现共形推测,与利用laglama等固定分布相比,这是一种更妥当的量化不确定性的方式。
laglllama是一个开源的根本模子,只用于单变量概率推测,而且我以为它练习的数据有点少了。我信任在不久的将来会看到更多的开源推测模子出现。他们的表现大概会得到改善,这代表了该范畴的一个庞大变革。
末了论文所在:
Lag-Llama: Towards Foundation Models for Probabilistic Time Series Forecasting by K. Rasul, A. Ashok, A. Williams, H. Ghonia, R. Bhagwatkar, A. Khorasani, M. Bayazi, G. Adamopoulos, R. Riachi, N. Hassen, M. Bilos, S. Garg, A. Schneider, N. Chapados, A. Drouin, V. Zantedeschi, Y. Nevmyvaka, I. Rish
https://avoid.overfit.cn/post/8a9120d3cf074c1ba0de0a7a247993c9
作者:Marco Peixeiro

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表