指标体系搭好之后,"最近数据怎么样"就变成了每天都要回答的问题:下个月 DAU 能做到多少?今天这个下跌算不算异常?靠人肉盯报表既不现实也不可靠,业界通行的做法是基于预测的监控——先让模型预测指标的合理波动范围,实际值一旦跌出这个范围就报警。而提到时间序列预测,几乎绕不开 Facebook 开源的 Prophet。
一、基于预测的监控:从"盯数字"到"盯偏离"
常见的时间序列异常检测方法分为两大类:
- 基于预测:用 Prophet、ARIMA 等模型拟合历史、预测未来,实际值与预测值的偏离超过阈值即为异常;
- 基于统计:如 3-sigma 法,假设数据服从正态分布,偏离均值三倍标准差的点判为异常。
两者相比,基于预测的方法有一个本质优势:它给出的阈值是随时间动态变化的。工作日和周末的 DAU 基线天然不同、大促前后的订单量量级悬殊,固定阈值要么误报不断、要么漏掉真正的异常;而预测模型学到了趋势和周期,报警标准会跟着基线一起走。Prophet 正是"基于预测"这一路线里最流行的起点。
二、Prophet 是什么:一个可加的时间序列模型
Prophet 由 Facebook 数据科学团队于 2017 年开源发布(论文《Forecasting at Scale》),是一款时间序列预测的可加模型,具有操作简单、功能丰富、拟合能力强等优势。
它的核心思想是把指标拆解为三个可解释的分量:
其中 g(t) 是增长项(趋势),s(t) 是周期项(季节性),h(t) 是节假日项,\varepsilon_t 是模型未覆盖的误差项。可加结构的好处是每个分量都能单独拟合、单独可视化、单独调参——预测出问题时,你能直接看出是趋势没学对,还是季节性没拟合住。

三、增长项 g(t):趋势怎么建模
3.1 饱和增长模型(非线性增长)
很多业务变量的增长存在自然上限(如手机出货量受人口限制、市场渗透率封顶 100%),Prophet 为此引入承载上限 C,用 logistic 函数刻画增长:
其中 k 是增长速度,m 是偏置项(增长的拐点位置)。
3.2 突变点:让增长速度"分段"起来
实际预测时,k 往往是不稳定的——例如暑假换机潮会突然拉高增速。Prophet 的解法是引入突变点(changepoints):在历史数据中指定 s 个时间点,相邻两个突变点之间增长速度保持稳定,突变点处增长速度发生跳变:
其中 \mathbf{a}(t) 是阶跃函数(突变点之前为 0、之后为 1),\boldsymbol{\delta} 是各突变点的增速调整量,\boldsymbol{\gamma} 是补偿偏移——它的作用是让曲线在突变点前后保持连续,不会断开。上限 C(t) 可以是常数,也可以是随时间线性变化的函数。
3.3 分段线性模型
如果业务增长没有明显的饱和上限(如用户早期的高速增长阶段),可以退而采用分段线性模型,只保留突变点机制、去掉 logistic 包络:
实操中还可以通过 changepoint_prior_scale 参数控制趋势的柔性:该值越大,模型越"敢"在历史中识别增速变化,曲线越贴合历史但也越容易过拟合;越小则趋势越平滑,越倾向于把波动交给周期项处理。
四、周期项 s(t):用傅立叶级数拟合季节性
业务指标的周期效应无处不在:一周工作 5 天的影响每周重复一次(本地生活 App 周五日活上涨),每年寒暑假的安排也会产生类似效果。Prophet 用傅立叶级数建立周期模型:
P 指周期:P=365.25 时即年季节性(yearly_seasonality),P=7 时即周季节性(weekly_seasonality)。傅立叶级数的好处是用少量参数就能拟合任意形状的周期曲线——季节性不一定是标准的正弦波,周末的"双峰效应"、春节前的持续爬坡,都可以通过足够多的谐波项逼近。年季节性默认取 N=10 阶,周季节性取 N=3 阶,且支持自动从数据中推断周期是否存在。
五、节假日项 h(t):把先验知识录进模型
国内用户在春节期间的使用时长、消费额度与其他日期有明显差异,而各个国家的假日安排差异更大——这类效应靠周期项很难覆盖(春节在公历上的日期每年漂移)。Prophet 的做法是直接提供一张节假日表,将这些回归项提前录入模型:
| 节日 | 国家 | 年份 | 时间 |
|---|---|---|---|
| 感恩节 | 美国 | 2015 | 2015.11.26 |
| 感恩节 | 美国 | 2016 | 2016.11.24 |
| 春节 | 中国 | 2021 | 2021.2.11 |
| 春节 | 中国 | 2022 | 2022.2.1 |
节假日项的形式为:
Z(t) 是指示函数矩阵(当天是否为某节日、或处于节日前后窗口),\mathbf{\kappa} 是每个节日的效应系数,服从正态先验——先验方差 \nu 默认取 10,意味着允许较大的节日效应,也可以调小来收缩极端假日的拟合空间。节日前后的影响(如大促预热期)还可以通过 lower_window/upper_window 参数额外建模。
一个实战中的坑值得单独记录:调休和"996"式的非常规工作安排会显著拉低预测准确度。Prophet 的周季节性默认按标准"工作五天、休息两天"学习,而五一调休把周末变成工作日、周末前后拼接错乱,模型无法自动识别——这类日期需要手工加入节假日表或单独处理。
六、模型结构:分析师参与的建模循环
Prophet 论文里最有价值的一张图,是它对预测工作流的定义。整个过程是一个分析师介入的循环(analyst-in-the-loop),而不是一次性的自动训练:

- 建模(Modeling):分析师根据预测问题建立合适的时间序列模型;
- 模型评估(Forecast Evaluation):用模型对历史数据做仿真回测,在参数不确定的情况下进行多种尝试,根据仿真效果评估哪种模型更合适;
- 暴露问题(Surface Problems):多次调参后效果仍差的(如一个未被录入的节日造成整段预测偏移),把问题暴露出来——有时问题不在模型,而在数据或业务流程;
- 可视化检查(Visually Inspect Forecasts):将预测结果可视化反馈,分析师根据经验进一步调整优化模型。
这个循环里,一部分工作由分析师完成(建模、解释、录入业务先验),一部分可以自动化(评估、回测、报警),Prophet 的设计目标正是让分析师把经验花在业务判断上,而不是花在调模型超参上。
七、落地建议:用预测区间做监控阈值
把 Prophet 用于指标监控的典型落地方式:
- 拟合 + 预测:用近 1
2 年的历史数据拟合,预测未来 714 天,得到预测均值和不确定性区间(默认 80%); - 动态阈值报警:实际值落在区间外即触发报警——区间随趋势和季节性逐日变化,天然解决了"周末基线低、工作日基线高"的固定阈值难题;
- 定期重训:每天滚动加入最新数据重训模型,让趋势和突变点及时更新;
- 监控模型本身:长期连续误报/漏报时优先怀疑突变点设置和节假日表缺失,而不是盲目调参。
选型上的经验法则:Prophet 在周期性强的数据上表现更好。业务指标通常带明显的周/年季节性和节假日效应,这正是 Prophet 的主场;而 ARIMA 系模型更依赖序列平稳性,适合周期性弱、自相关强的数据。
参考资料
- Taylor S J, Letham B. Forecasting at Scale. PeerJ Preprints / The American Statistician, 2017(论文地址即 PPT 引用的 https://peerj.com/preprints/3190.pdf)
- Prophet 官方文档与开源实现(Python/R):https://facebook.github.io/prophet/