跳至主要内容

Facebook Prophet:现代时间序列预测方法

了解 Facebook Prophet 如何对趋势、季节性与特殊事件建模,以获得准确且可解释的预测。
· 10分钟 阅读

使用 AI 探索

企业依赖对未来趋势的预测来做出战略决策,例如预测产品销量或评估需求波动。实现有效预测的一种方式就是时间序列预测。时间序列预测的一个基本原则是依靠历史数据值来预测未来结果。这就要求我们重视数据质量,因为真实世界中的数据往往存在噪声或缺失,因而难以预测。

虽然用于时间序列预测的工具很多,但 Facebook Prophet 专为处理真实世界的复杂性而设计,从非线性趋势和季节性,到节假日、营销活动或流量激增等特殊事件的影响。如果您完全不熟悉时间序列预测,建议先学习我们的 Python 时间序列分析课程和/或R 语言预测课程。

什么是 Facebook Prophet?

Prophet 是由 Facebook 核心数据科学团队开发的开源预测库,提供 Python 和 R 两种实现。数据分析师和数据科学家喜欢使用它的部分原因在于,它自动化了传统预测方法中很多繁琐的步骤。凭借这种灵活性,它能帮助用户快速生成可解释且高质量的预测。

Facebook Prophet 的核心建模框架

Facebook Prophet 的建模方法结构严谨且灵活。它将时间序列分解为四个关键组成部分,即趋势、季节性、节假日和误差。第三个组件,也就是我称为“节假日”部分,并不算标准。经典分解和 STL 分解通常只包含三部分:趋势、季节性和误差。

通过阐明趋势、季节性与节假日如何共同影响最终预测,这种分解方式在我们做出明智决策时有助于验证模型的推理过程。

时间序列的分解

Prophet 使用加性模型,将时间序列 y(t) 表示为:

Facebook Prophet 时间序列分解公式

其中, 

  • 趋势(g(t))用于表示长期增长或下降。

  • 季节性(s(t))包括每周、每月或每年的重复模式。

  • 节假日效应(h(t))用于解释诸如黑色星期五或国家法定假日等不规则但可预测的事件。

  • 误差(et)是其他组件无法解释的残余噪声。

除了通过展示驱动预测的因素来提升可解释性之外,它还自动化了大部分时间序列预测流程,例如季节性检测和缺失值处理。

通过处理这些复杂的预处理操作,Prophet 降低了对广泛统计专业知识的要求,而这在传统统计方法中往往必不可少。比如,ARIMA 要求满足平稳性假设,并且官方并不考虑外部因素;而 Prophet 明确建模季节性和节假日影响,因此被认为更适合业务预测。

趋势组件的设定

Prophet 提供两种趋势模型:

  1. 对数增长模型适用于时间序列在达到最大容量后趋于饱和的情况,类似新应用的用户采用曲线。
  2. 分段线性模型将趋势分解为带有变点的多个片段,从而更容易对增长中的突变进行建模。

季节性建模

季节性通过傅里叶级数进行建模,使时间序列数据中的周期函数平滑可表征。其季节性行为主要有两种形式:

  • 当季节性波动的幅度随时间保持一致时,使用加性季节性。
  • 当季节性波动会随趋势一起增长(如随着整体市场增长,销量波动加大)时,使用乘性季节性。

此外,用户也可以自定义季节性,以表达独特的、特定领域的模式,例如季度促销。

节假日与事件集成

Prophet 支持纳入预定义节假日和任意事件清单。在建模商业周期、文化节日或产品发布等一次性事件时,这尤为有用。还可以将 COVID-19 等突发事件作为额外回归量加入,以动态更新预测。对这类事件进行显式建模能提高准确性,并揭示特殊日期对底层趋势的影响。

处理噪声与离群值

真实数据常含有噪声和离群点,可能导致模型预测失真。Prophet 采用稳健的损失函数和非参数的趋势组件,使预测对离群值更具鲁棒性。

为进一步提升预测稳定性,分析残差图并通过 Winsorizing 或移除异常值来预处理数据是有益的。这些步骤可确保模型学习到真正的趋势,而非随机噪声。

何时使用(以及不适合使用)Facebook Prophet

与大多数机器学习模型和技术一样,Prophet 并非万能。了解它的优势与局限是有效使用它的关键。

优势与理想场景

在以下情况下,Prophet 尤其有效:

  • 数据具有明显的日、周或年季节性。
  • 数据集不完整,需要自动处理缺失值和离群点。
  • 用户需要快速进行探索性分析和初始模型开发。

其简单易用使得统计背景有限的用户也可上手;同时,良好的可解释性有助于分析师和数据科学家向非技术干系人有效传达结果。

局限与潜在陷阱

在以下情形中,Prophet 可能不太合适:

  • 高度波动或无季节性的数据,即不存在规律性的周期模式。
  • 长期预测且趋势不可预测。
  • 非线性趋势无法由分段线性或对数模型刻画。

使用 Prophet 或任何预测模型时的一条金律是:避免盲目采用。如果缺乏恰当的验证,模型很容易给出过于自信或具有误导性的预测,社区讨论和多起高调预测失败案例都表明了这一点。

在 Python 中使用 Prophet

步骤 1:导入库

首先,加载所有需要的 Python 包:

  • pandas 用于数据处理

  • prophet 用于构建预测模型

  • matplotlib 用于可视化

  • sklearn.metrics —— 计算 MAPE(误差指标)

import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_percentage_error

步骤 2:加载数据集

接下来,读取包含黄金期货历史价格的 CSV 文件。这里是我使用的 Kaggle 数据集链接。

file_path = "future-gc00-daily-prices.csv"
gold_ts = pd.read_csv(file_path)

步骤 3:清洗数据

现在,我们需要清洗数据。这意味着我们要:

  • 去除数值列中的逗号并转换为浮点数。

  • 将 Date 列由字符串格式转换为 datetime。

这样可以确保 Prophet 正确理解并对日期进行排序。

for col in ["Open", "High", "Low", "Close"]:
    gold_ts[col] = gold_ts[col].str.replace(",", "").astype(float)
gold_ts["Date"] = pd.to_datetime(gold_ts["Date"], format="%m/%d/%Y")

步骤 4:按日期排序

将数据按时间顺序排列。这是一个容易被忽略的重要步骤。

gold_ts = gold_ts.sort_values("Date")

步骤 5:为 Prophet 准备数据

我们还需要按 Prophet 的要求准备数据,输入列名需为:

  • ds → 日期时间戳

  • y → 需要预测的值(此处为 Close 收盘价)

gold_ts = gold_ts[["Date", "Close"]].rename(columns={"Date": "ds", "Close": "y"})

步骤 6:划分训练集与测试集

现在将数据划分为训练集和测试集。 

  • 将大部分数据用于训练。
  • 保留最后 180 行(或若更小则为 10%)用于测试模型准确性。
test_size = min(180, len(gold_ts) // 10)
train = gold_ts.iloc[:-test_size]
test = gold_ts.iloc[-test_size:]

步骤 7:拟合 Prophet 模型

在历史数据上训练 Prophet,并启用日季节性和年季节性。

model = Prophet(daily_seasonality=True, yearly_seasonality=True)
model.fit(train)

步骤 8:预测未来值

我们预测与测试集相同天数的未来。

预测结果包含 yhat(预测值)、yhat_lower 和 yhat_upper 等列。

future = model.make_future_dataframe(periods=test_size)
forecast = model.predict(future)

步骤 9:将预测与真实值对齐

基于匹配日期,将真实收盘价与模型预测结果进行合并,以便直接比较。

merged = pd.merge(test, forecast[["ds", "yhat"]], on="ds", how="inner")

步骤 10:计算 MAPE

现在来评估预测的准确性。如果没有日期重叠,它会给出警告而不是报错。

if merged.empty:
    print("No overlapping dates between forecast and test set.")
else:
    mape = mean_absolute_percentage_error(merged["y"], merged["yhat"]) * 100
    print(f"Mean Absolute Percentage Error (MAPE): {mape:.2f}%")

此处,平均绝对百分比误差(MAPE):5.83%

MAPE 公式

步骤 11:绘制预测图

可视化预测结果、置信区间以及历史数据。

fig1 = model.plot(forecast)
plt.title("Gold Futures (GC00) - Close Price Forecast")
plt.xlabel("Date")
plt.ylabel("Close Price")
plt.show()

Facebook Prophet 预测结果

步骤 12:绘制季节性组件

展示趋势、日季节性和年季节性模式如何对预测做出贡献会很有帮助。

fig2 = model.plot_components(forecast)
plt.show()

Facebook Prophet 季节性分解

步骤 13:查看预测样例

显示最后几条预测值及其不确定性区间。

print(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail(10))

预测值示例:

             ds         yhat   yhat_lower   yhat_upper
3714 2023-11-09  1834.568081  1743.127873  1922.791205
3715 2023-11-10  1833.323500  1749.265678  1937.246093
3716 2023-11-11  1832.818196  1740.941278  1921.772611
3717 2023-11-12  1832.370884  1745.285047  1925.012684
3718 2023-11-13  1832.644350  1736.792708  1919.057042
3719 2023-11-14  1832.017761  1736.229502  1929.786669
3720 2023-11-15  1831.650906  1743.190077  1924.851936
3721 2023-11-16  1831.566521  1738.181184  1933.026740
3722 2023-11-17  1830.427713  1736.038529  1919.505155
3723 2023-11-18  1830.029816  1737.022754  1922.118728

验证与测试 Facebook Prophet

验证方法

时间序列交叉验证可用于模拟真实世界的预测场景。重要的是在多个连续验证集上评估模型性能。这样不仅能避免“前视偏差”,还可提高对未来未知数据的泛化能力。

一些常用评估指标包括:

  • 平均绝对误差(MAE)衡量误差的平均大小,忽略方向。
  • 平均绝对百分比误差(MAPE)衡量平均绝对百分比差异,便于跨不同量纲进行解读。在我们的 Python 示例中就是用的它。

对比分析

与 ARIMA 或 LSTM 相比,Prophet 擅长:

  • 处理不规则季节性与节假日效应
  • 在缺失数据、离群点和业务不规则性方面表现出鲁棒性

不过,在涉及高度非线性模式或季节性较弱的数据集中,Prophet 可能表现不佳。 

实践应用与局限

真实案例

Prophet 已被广泛应用于各行业的场景,例如:

  • 零售销售预测、需求评估与库存管理
  • 网站流量预测,用于理解用户参与度
  • 能源需求预测,以高效平衡供给与消耗。

尽管有诸多优势,但在突发性扰动发生时,历史模式也可能失效,这在疫情期间就曾出现过。 

可扩展性约束

Prophet 能处理中等规模的数据集,适用于大多数业务和运营预测任务。但当用于极大规模或高频时间序列时,由于其底层贝叶斯建模框架,计算成本较高。为缓解这一问题,建议并行预测多条时间序列。另一个务实做法是聚合或降采样数据,在不丢失关键时间模式的前提下,降低内存和运行成本。

关键局限

Prophet 假设只有单一目标变量,并使用分段线性或对数增长曲线来建模其趋势。此类假设会限制其在多变量或非趋势主导问题上的灵活性。因此,用户需要在 Prophet 的预测基础上引入领域知识并进行外部验证,以确保可靠性。

真实世界的失败与批评

一些高调的预测失败事件(如 Zillow 的房市预测崩盘)凸显了过度依赖自动化预测软件的风险。对模型输出缺乏人工复核的过度信任,可能导致代价高昂的错误。因此,在解读预测结果时,建议进行充分的验证与情景规划。

不要犹豫去质疑每一个模型和趋势。培养鼓励批判性思维、允许团队挑战现状的文化。我见过这样的团队能持续构建稳健的预测方案。 

最后,我强烈建议秉持“信任但要验证”的心态,并结合您的领域知识,对结果进行合理性检查。 

未来发展方向

Prophet 仍在通过研究与社区贡献不断演进。正在推进的改进包括:

  • 多变量支持
  • 面向大数据集的可扩展性增强
  • 社区驱动的扩展

当前研究正致力于整合新的统计方法,并在复杂的高频数据集上提升性能。

结论

Facebook Prophet 是一款功能强大的时间序列预测工具,兼具自动化、可解释性与灵活性。在具有强季节性或特殊事件的业务及其他领域的探索性预测中表现出色。

但这并不意味着它是即插即用的方案。为了做出可信的预测,用户必须进行严谨的验证、参数调优,并融入领域知识。通过在 Prophet 的自动化优势与深思熟虑的人类判断之间取得平衡,分析师可以产出可行动的洞见并避免常见陷阱。

若想进行实践学习,请查看我们的课程与技能路径:

Vidhi Chugh

作者

Vidhi Chugh

我是一名 AI 策略与伦理专家,致力于在数据科学、产品与工程的交汇处构建可扩展的机器学习系统。曾入选全球“200 位顶尖商业与技术创新者”之一,我的使命是让机器学习走向大众,打破术语壁垒,让每个人都能参与这场变革。

常见问题解答

Facebook Prophet 的用途是什么?

Facebook Prophet 用于时间序列预测,帮助预测数据(如销售、需求或网站流量)中的趋势、季节性和事件效应。

Prophet 如何处理节假日和特殊事件?

Prophet 允许将预定义或自定义事件添加到模型中,从而解释时间序列中不规则的峰值或下跌。

为何 Prophet 在业务预测中颇受欢迎?

Prophet 具有自动化、可解释,并对缺失数据和离群点具备鲁棒性的特点,非常适合快速且可靠的预测。

何时应避免使用 Facebook Prophet?

对于高度波动或无季节性的数据,或当趋势过于不可预测时,应避免使用 Prophet。

Prophet 相较于 ARIMA 的主要优势是什么?

与 ARIMA 不同,Prophet 无需严格的平稳性要求,能处理缺失数据,并可自动检测变点。

主题