Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

点预测评估

北京大学光华管理学院

本章把上一章的评估思想落到可运行流程中:用航空乘客数据比较 TimeGPT 模型,在留后测试和滚动窗口中计算 ME、MAE、MSE、RMSE、MPE(Mean Percentage Error)、MAPE 和 sMAPE。重点不是记住每个指标公式,而是理解一套可复现的评估流程如何防止我们被一次好看的预测曲线误导。

学习目标

完成本章后,你应该能够:

AI 输出也需要评价

本章练习的一个重要背景是:预测结果不一定由我们亲手训练的模型产生,也可能来自 TimeGPT、DeepSeek、Darts、StatsForecast 或其他 AI 平台。模型越像一个自动化平台,越容易让使用者误以为“输出了曲线”就等于“可以使用”。点预测评估的任务正好相反:无论预测来自专家、统计模型、深度学习模型还是 API,都必须放到同一套评价流程里接受检验。

我们把这个原则说得更直接:预测不管是人工做出来的、智能做出来的,还是人工加智能做出来的,都要回头看真实值。点预测最基本的对象是 et=yty^te_t = y_t - \hat{y}_t。如果误差平均为正,按这个符号约定说明模型倾向低估;如果误差平均为负,说明模型倾向高估。误差的方向、大小、波动和极端值,才是评价曲线是否可信的起点。

因此,本章的重点不是证明某个 AI 模型一定更好,而是训练一种工作习惯:先规定数据切分、预测步长、频率、指标和基准,再比较模型。只有这样,timegpt-1timegpt-1-long-horizon 或其他模型之间的差异才有可解释性。

数据与任务

示例 notebook 使用 air_passengers_with_id.csv。数据至少包含三列:

读取后先统一排序:

df = pd.read_csv("data/air_passengers_with_id.csv")
df["ds"] = pd.to_datetime(df["ds"])
df = df.sort_values(["unique_id", "ds"]).reset_index(drop=True)

评估之前应先画图检查序列。航空乘客数据有明显趋势和季节性,如果模型输出完全平滑的曲线,或者完全忽略季节波动,误差表之外也能看出问题。

近视度数、用电量和销量趋势等例子都说明:评价点预测之前,先要理解序列本身。一个模型如果连明显趋势、周期或异常点都没有反映出来,即使某个汇总指标还可以,也需要回到图形和分步长误差中检查。

用 TimeGPT 对航空乘客数据做快速预测时,可以先整理 unique_id、日期列和 y,设置月度频率和 H=12H=12,再调用模型生成未来 12 期曲线。TimeGPT 的意义在于把大规模预训练时间序列模型封装成可调用服务 Garza et al., 2024。这个示例的目的不是当场证明 TimeGPT 一定最好,而是先看到 AI 平台如何把一个标准格式的数据表转成可视化预测。真正判断它好不好,仍然要回到本章的留后法、滚动窗口和误差指标。

留后法

留后法把最后一段历史数据当作测试集。例如保留最后 12 个月:

H_TEST = 12
train = df.iloc[:-H_TEST]
test = df.iloc[-H_TEST:]

模型只能使用 train,然后预测未来 12 期。预测结果与 testunique_idds 合并后计算误差。这个方法简单、直观,适合演示和快速比较。

留后法的局限是只评价一个切分点。如果最后 12 个月恰好是异常时期,结果可能过于悲观或乐观。因此正式评估通常还需要滚动窗口。留后法适合快速检查,但不应成为唯一证据。

滚动窗口评估

滚动窗口把评估重复多次。每一次选择一个历史切分点,用切分点之前的数据预测接下来 HH 期,然后向前滚动到下一个切分点。示例 notebook 中使用 cross_validation 生成多次窗口,并给每个预测样本标注步长:

cv["h"] = cv.groupby(["unique_id", "cutoff"]).cumcount() + 1

这样就可以分别计算 T+1T+1T+2T+2、一直到 T+HT+H 的平均误差。这个拆分非常重要。模型短期预测好,不代表长期预测好;长期误差也不应掩盖短期可用性。

滚动窗口的直觉可以称为“历史中的未来”(past futures)。站在某个历史时点,我们把那一刻之后已经发生、但在当时还未知的数据当作模拟未来。这样既不会偷看真正未来,又能在已有数据里反复检验模型。这个方法隐含一个前提:历史规律在未来仍有一定延续性。如果疫情、政策冲击或结构性变化让历史和未来脱节,滚动评估仍然有用,但它只能说明模型在相似环境下的表现,不能保证它能处理全新制度或全新行为。

一个具体做法是:先保留历史末端一小段,例如未来 6 天或 12 个月,模拟站在更早时点做预测;计算一次误差后,再移动预测起点,重复多组窗口。最后汇总这些窗口的 MAE、sMAPE、RMSE 或偏差方向。这样做比只看最后一个测试窗口更稳健,也能发现模型是否只在某个偶然时期表现好。

指标解释

ME 和 MPE 用于检查偏差方向。ME 为正,表示真实值平均高于预测值,模型整体低估;ME 为负,表示模型整体高估。MPE 是百分比版本,便于解释偏差比例。

MAE 表示平均绝对偏离,单位和目标变量一致。它适合回答“平均错多少人、多少件、多少元”。

MSE 和 RMSE 对大误差更敏感。RMSE 回到原单位,便于解释。如果业务特别害怕极端错误,例如电力负荷调度或现金流短缺,RMSE 往往比 MAE 更有警示性。

MAPE 用百分比衡量相对误差,适合向管理层沟通。但真实值为 0 或很小时,MAPE 会失真,因此在零销量、低销量和跨序列比较中要谨慎使用 Hyndman & Koehler, 2006

sMAPE 对高估和低估更对称,常用于预测竞赛和跨模型基准。它也不是万能指标,低销量、零销量和间歇性需求仍需谨慎处理。

点预测指标适合回答“平均错多少”“是否系统性高估或低估”。如果业务真正关心风险范围、服务水平或安全库存,就需要进一步进入概率预测和区间覆盖评估。

指标冲突

不同指标经常给出不同排序,这是正常现象。一个模型可能 MAE 较低,说明大多数时期平均偏离较小;同时 RMSE 较高,说明少数时期出现了很大的错误。一个模型也可能 MAPE 较低,但在高峰期绝对误差很大。我们让你比较多个指标,目的就是看到:指标不是装饰,指标代表业务偏好。

指标选择也会影响“谁看起来赢”。较宽松的指标可能让某个模型显得提升明显,较严苛的指标则会暴露少数严重失误。正式报告不能先看哪个模型结果好,再反过来挑支持它的指标;应先根据业务损失说明为什么选择 MAE、RMSE、MAPE、sMAPE 或基准尺度化误差。

如果业务关心日常稳定性,MAE 可能更自然;如果业务害怕极端错误,RMSE 更重要;如果需要跨产品、跨地区汇报,百分比误差更便于沟通;如果真实值接近 0,百分比误差就需要谨慎使用。不同选择背后对应的是不同的业务风险偏好。

比较模型

notebook 比较了 timegpt-1timegpt-1-long-horizon。比较时必须保证数据切分、预测步长、频率和指标一致。否则误差差异可能来自评估设计,而不是模型能力。若要进一步判断两个模型误差差异是否稳定,还可以使用预测准确性比较的统计检验思想 Diebold & Mariano, 1995

一个合理的比较表至少包括:

排序时可以先看业务最关心的指标。例如运营排班可能优先看短期 MAE;年度预算可能更关心 12 期总量偏差;风险控制场景可能更关心 RMSE 或预测区间。

本章练习的设计可以推广成一套通用评估模板。先把 AirPassengers 整理成 unique_id, ds, y 三列,再让 TimeGPT 和 long-horizon 版本分别预测同一组 horizon,例如未来 5 步。随后把两个模型的预测值和测试集真实值合并,分别计算 MAE、RMSE、MAPE、sMAPE、ME 和 MPE。输出表中的每一行不是“模型身份”的装饰,而是一个待比较的预测者:它也可以换成专家预测、DeepSeek 预测、统计模型预测或组合预测。

这个练习最重要的观察是:不同指标可能给出不同排序。某个模型在 MAE 上更好,另一个模型可能在 RMSE 或 sMAPE 上更好;短期 horizon 表现好的模型,长期 horizon 未必更好。因此评估表应同时按模型和 horizon 展开,而不是只给一个总分。

简单基准是比较模型时的最低门槛。例如“今年同月等于去年同月”或“下一期等于上一期”看起来朴素,但它们能检验复杂模型是否真的带来增量价值。不能超过基准的高级模型,通常不应直接进入业务流程。

模型比较还要注意信息边界。所有模型必须站在同一个历史时点,只能使用当时可获得的信息。如果一个模型在评估时隐含使用了未来新闻、未来政策或后来才知道的修正数据,它的误差表会很好看,但这种结果不能代表真实预测能力。

从误差表到业务解释

评估表不能只停留在“模型 A 的 MAE 更低”。需要继续追问:

例如航空乘客预测中,季节高峰低估可能比淡季高估更严重,因为它会影响机队、人员和票价策略。指标解释要服务于这种具体判断。

旅游复苏预测是更困难的评价场景。预测者站在 2022 年或 2023 年时,并不知道未来一年国际旅行会以什么路径恢复。此时评价不只是计算 yty^ty_t - \hat{y}_t,还要考虑预测竞赛如何设定提交时间、何时揭晓结果、是否允许更新信息、是否按目的地或区域分层评价。这个例子提醒我们,点预测评估看起来是公式问题,实际是实验设计问题。

实操注意事项

不要把 API key 写入 notebook。使用环境变量更安全:

from nixtla import NixtlaClient

nixtla = NixtlaClient(api_key=os.environ["NIXTLA_API_KEY"])

评估前确认频率参数正确。月度起始频率常写作 MS。频率错误会导致未来日期错位,进而让合并和误差计算失效。

评估时保留原始预测表、合并后的评估表和汇总表。这样在结果异常时可以回溯到具体窗口、具体日期和具体预测步长。

使用 TimeGPT、DeepSeek 或其他云端 API 时,还要先判断数据是否可以上传。航空乘客公开数据适合教学演示;家庭收入、企业订单、客户交易、内部产能和未公开经营数据不应随意发送到外部服务。API 预测越方便,越要把数据边界、调用成本和 key 管理写进实验流程。

小结

点预测评估是一套流程:定义切分、调用模型、合并真实值、计算指标、按步长和业务场景解释结果。留后法提供快速检查,滚动窗口提供更稳健的证据。一个预测结果只有经过这种流程,才从“看起来合理”变成“可以被比较和讨论”。

练习

  1. 将最后 6、12、24 期分别作为测试集,比较同一模型的 MAE。

  2. 用滚动窗口分别报告 T+1T+1T+5T+5 的误差,并解释误差是否随步长增加。

  3. 找出 ME 和 MAE 同时较大的模型,判断它是系统性偏差还是波动误差。

  4. 解释为什么一个模型 MAPE 低但 RMSE 高时,业务上仍可能有风险。

  5. 为一个 AI 平台预测结果设计评估流程,说明数据切分、基准模型和主要指标。

  6. 把 TimeGPT、TimeGPT long-horizon 和一个第三方预测结果放进同一张评估表,比较不同指标是否给出一致排序。

  7. 将评估结果写成一段管理层可读的结论,避免只罗列指标。

参考文献

References
  1. Garza, A., Challu, C., & Mergenthaler-Canseco, M. (2024). TimeGPT-1. 10.48550/arXiv.2310.03589
  2. Hyndman, R. J., & Koehler, A. B. (2006). Another Look at Measures of Forecast Accuracy. International Journal of Forecasting, 22(4), 679–688. 10.1016/j.ijforecast.2006.03.001
  3. Diebold, F. X., & Mariano, R. S. (1995). Comparing Predictive Accuracy. Journal of Business & Economic Statistics, 13(3), 253–263. 10.1198/073500102753410444