Chronos协变量预测:三步把外部特征喂给模型
【免费下载链接】chronos-forecastingChronos: Pretrained Models for Time Series Forecasting项目地址: https://gitcode.com/GitHub_Trending/ch/chronos-forecasting
只拿历史电价去预测明天的电价,误差很难压下去;把明早的用电负荷与可再生能源发电预测加进去,曲线立刻贴合得多——这是官方快速上手 notebook 里的一个真实对比。下面从最小可运行示例讲起,再到内部处理链路,带你用 Chronos-2 完成协变量预测,学完后能独立给自己的业务数据加一列外部特征跑通全流程。
🧠 先建立心智模型:协变量预测在解决什么问题
时序预测的核心矛盾是:目标序列自身解释不了所有波动。销量在节假日跳升、电价随天气摆动,这些驱动力都活在序列"外面",单变量模型只能等它们反映进历史里才后知后觉。说白了,协变量预测就是给模型开第二个通道,让它直接看到这些外部信息。
- 目标(target):要预测的序列,比如销量、电价。
- 协变量(covariate):影响目标的外部列,分两类——只有历史值的,以及预测窗口内取值已知的。
- 零样本(zero-shot):不微调,直接用预训练模型对新任务做推理,Chronos-2 官方宣称支持单变量、多变量与协变量预测三种形态。
这个通道在模型里到底怎么接进去的?看源码最清楚。
🐍 最小可运行示例:三步跑出协变量预测
下面这段代码做三件事:加载 Chronos-2 模型,准备历史数据与未来协变量两个 DataFrame,一次predict_df调用拿到预测结果。
import pandas as pd from chronos import Chronos2Pipeline pipeline = Chronos2Pipeline.from_pretrained("amazon/chronos-2") # GPU 推荐,CPU 可传 device_map="cpu" context_df = pd.read_parquet("historical.parquet") # 列:id, timestamp, target, 协变量列 future_df = pd.read_parquet("future.parquet") # 协变量的未来值,不要含 target 列 pred_df = pipeline.predict_df( context_df, future_df=future_df, # 两表都有的列会被视为"已知未来协变量" prediction_length=24, # 预测步数 quantile_levels=[0.1, 0.5, 0.9], # 输出哪些分位数 id_column="id", timestamp_column="timestamp", target="target", )输出还是一个 DataFrame:每行对应一个(序列ID,未来时间戳),列为predictions(点预测,按源码注释实为中位数)加上0.1、0.5、0.9等分位列。
注意这几个坑:
future_df只放协变量列加 id/timestamp;若从测试集截取,先像 README 示例那样drop(columns="target"),混入目标列会干扰处理。- 两个 DataFrame 时间戳必须等间隔、无缺失,
future_df的每条序列恰好覆盖预测窗口,校验不过会直接抛错。 prediction_length别轻易超过模型默认预测窗口,官方源码对超长预测会警告精度可能退化。
⚙️ 关键机制拆解
未来协变量如何并入上下文
输入:目标与协变量的历史序列、协变量的未来取值。处理:在 src/chronos/chronos2/model.py 的_prepare_patched_future中,未来协变量先套用与历史上下文同一套实例归一化参数(loc/scale),NaN 自动生成掩码,再按补丁结构拼接;时间编码上历史是负序号、未来是正序号,以 0 为分界。输出:历史 token 与未来 token 拼成一条序列进编码器,预测末端的表示在注意力中直接"看见"未来协变量。
一句话记忆:未来协变量不是单独喂的,而是贴着历史序列拼成一条序列、共用同一套归一化参数。
缺失值与分类协变量怎么被消化
输入:含 NaN 的协变量列,或文本分类列(如"晴/多云/雨")。处理:在 src/chronos/chronos2/preprocess.py 中,NaN 默认被自动推断为掩码而非报错;分类列默认走目标编码——按(序列,类别)组合算平滑后的目标均值,NaN 自己占一个槽位,未来出现历史里没有的类别则落到预留的哨兵槽。输出:所有协变量变成与目标同形状的数值张量,数值与掩码分两路进入模型。
一句话记忆:NaN 是"缺失标记"不是错误;文字类别按每序列的类别均值转成数值,没见过的类别有兜底位。
⚖️ 效果与取舍
| 维度 | 单变量模式(无协变量) | Chronos-2 协变量预测 |
|---|---|---|
| 输入信息 | 仅目标历史值 | 额外加入协变量的历史值与已知未来值 |
| 输出形式 | 分位数(0.1–0.9)+ 中位数 | 相同,输出结构不变 |
| 上手成本 | 一个 DataFrame | 两个 DataFrame,需时间戳对齐 |
| 适用信号 | 外部影响弱 | 受节假日、天气、促销驱动明显 |
官方快速上手 notebook 里的电价案例给出了定性结论:仅用历史价时预测"合理但不精确",加上负荷与发电预测后"能明显利用这两个外部预测、精度显著提高"(原文为定性描述,未附统一误差指标)。具体误差降多少,官方未公开可复用的对比数字,需要自己在业务数据上回测验证。诚实的限制是:协变量本身噪声大或历史样本太短时,收益会缩水,所以"带/不带协变量"的消融对比值得先跑一遍再定案。
🧭 上手建议与延伸
建议:
- 优先挑"未来值本来就可知"的协变量:促销日历、节假日表、天气预报、负荷预测。
- 先做一轮带/不带的消融对比,只留稳定有效的特征。
- 历史很长时按模型默认 2048 步上下文处理,超长部分会被自动截断。
不建议:
- 不要堆大量低相关列,噪声协变量只会稀释注意力。
- 不要用预测时点拿不到的值冒充未来协变量,那是数据泄漏。
- 不要用超长预测窗口代替滚动预测,官方源码已警告精度可能退化。
加上明日的负荷与发电预测,再看价格预测收紧,协变量的价值就在曲线上。
【免费下载链接】chronos-forecastingChronos: Pretrained Models for Time Series Forecasting项目地址: https://gitcode.com/GitHub_Trending/ch/chronos-forecasting
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考