结合 Prophet 的原理理解 Prophet 的使用

article/2025/9/20 4:11:32

结合 Prophet 的原理理解 Prophet 的使用

前言

本文也是时序领域工作学习过程中的一些学习笔记,将会结合 Prophet 的原理,讲一讲如何成为一个合格的 Prophet 调包侠 使用者。如果有任何理解不到位的地方,请多多指正。

Why Prophet?

Prophet 是Meta(Facebook)的一个开源时序预测算法工具,在工作中解决一些特定领域的时序预测问题时能够有非常好的效果,尤其是一些周期性明显的时序数据,如工业场景、运维场景的数据。

  • 优势在于准确度高、能够提供预测区间而非单个预测值、具有良好的可解释性、能够通过设置参数的方式方便地融入业务领域的专家知识

  • 缺点在于对比较复杂没什么规律的时序预测能力比较差,此外,一个 prophet 模型只能预测一条时序,如果有多条时序需要预测,则需要每条时序都训练一个 Prophet model,并且在预测时,每条时序的 Model 都应该重新训练再预测(尽管官方提供了 warm-starting 的方法,在面对大量时序需要预测的场景,不一定适合)

Prophet 的原理

简单来说,Prophet 把时序分为四个部分,认为任意时刻的值,就是这四个部分相加的结果(如果是四个部分相乘的情况,通过 log transform 也同样变为加法模式)。这四个部分分别是:

  • 趋势成分:时序最内核的一个增长趋势
  • 季节性成分:时序中跟时间强烈相关,周期性上升下降的成分
  • 节假日影响:时序中跟时间强烈相关,非周期性出现的影响
  • 不可预测的假设为正态分布的误差部分

在这里插入图片描述

接下来就看看每个成分分别是如何拟合的

趋势成分

prophet 把趋势成分分为两类,一类是受到人口增长模型启发的 logistics 增长函数,一类是更为简单的分段线性函数

基于人口增长模型的 logistics 增长函数

在这里插入图片描述

其中最关键的是增长上限C(t)增长变化率k

prophet 认为时序在每个时刻的增长上限都是不同的,而这是和时序代表的业务知识强烈相关的,比如产品的需求量的时序,在进行预测时,每个成熟的业务员,都比程序员更懂得如何推算这个产品未来的市场蛋糕到底有多大,天花板在哪里,所以这部分往往是需要业务人员帮助给出的专家经验。

同样,prophet 认为增长率 k 也不是一个固定的值,在某些事件出现的时刻,比如产品广告上线、产品活动,这些特殊的事件发生点,其增长率也不能用日常的情况来代表,这些时刻被称为 changepoints。这些 changepoints 可以由业务人员给出,prophet 也提供了自动寻找的功能,在自动寻找时,prophet 在整个时序上找到一些点标为 changepoints,然后在 Laplace 分布上采样,作为该 changepoints 对应的 k 的变化值,即 k 在这个 changepoint 上要变化多少。Laplace 分布和正态分布长得非常像,这里的方差可以人为调整,于是我们就能根据时序的实际情况,决定 changepoint 上的变化程度。

分段线性函数增长

分段线性函数则简单许多,同样确定了 changepoints 之后,只是在 changepoints 之间构建线性函数,保证它们连续即可,整体就是 y = kx + b,细节这里不详细叙述。

在这里插入图片描述

趋势成分的预测

涉及到 changepoints 的话,未来也同样是有 changepoints 的,同样地,可以通过人为给出,也可以依赖 prophet 的自动寻找能力。

prophet 的自动寻找是以“未来的 changepoints 和过去差不多”为前提的,比如我们的时序一共有 T 个点,其中有 S 个 changepoints,那么在预测未来的 H 个点时,每个点都有 S/T 的概率被标记为 changepoint,其相应的变化值也是从 Laplace 分布上采样而来,只是这里的 Laplace 分布的方差,则通过历史中 S 个 changepoints 的方差计算而来,当然也可以用其他更严谨的统计方法,计算历史 changepoints 对应 k 变化值的 Laplace 分布方差。

此时,如果采样多组,那么就能计算得到多个可能的趋势,这些趋势能够构成一定的区间,通过不同时刻的区间的相对宽窄,能够反映该时刻的预测的置信程度

季节性成分

Prophet 通过 Fourier 变换拟合季节性成分,这里我们只需要知道,季节性成分都是周期性的,一个时序最后呈现的形态,可能是多种不同周期的季节性成分作用到趋势成分上导致的结果,而每一种周期的季节性成分,都可以用一组正弦波的叠加去拟合

在这里插入图片描述

这样一组正弦波需要 2N 个参数,在变换的过程中都会算出来,但我们需要决定一个 N,来保证拟合的准确度的同时,防止过拟合,也减少算力的压力。Prophet 发现,对于以年为周期的成分,使用 N=10;对于以周为周期的成分,使用 N=3,都能在大部分问题上取得不错的效果,不过我们也可以通过 AIC 这类方法,辅助选择模型的超参数。此外,prophet 还对这 2N 个参数进行高斯平滑,这个平滑的程度也会决定季节性成分变化的速度,同样可以通过这个参数调控季节性成分的强度,即对时序最终的形态的影响
在这里插入图片描述在这里插入图片描述在这里插入图片描述

节假日成分

还有一些和时间紧密相关的事件,比如某些节假日,从漫长的时间尺度上来说,并不是周期性出现的,但是符合一定的出现规则。这样的重要影响则通过数据表的形式喂入模型,如一张列名为 [节假日的名字, 国家, 年份, 日期] 的表。

prophet 统计每个节假日出现的时间,给每种节假日都附加一个影响值 k (从正态分布采样),在每个节假日对应时刻(或节假日为中心的一个窗口内的所有时刻)都增加一个节假日的影响值,作为 h(t) 的值

模型的评估与分析

参考 Prophet 的官网,通过 Prophet 的 API 即可完成上述成分的拟合,但 prophet 还提供了后续分析模型效果的思路。

baseline

模型的评估都离不开 baseline 的比较,通常选择 last value 或者 sample mean 作为 baseline,这方面无需详述

评估指标

对于一个 H 个点的预测,它的误差等于这 H 个点构成的向量,和真实值向量之间的“距离”。“距离”的计算方式有很多,需要根据实际问题来选择,比如时序预测问题常用的 MAPE 就也算是一种计算的方式

可视化

prophet 推荐使用点的方式绘图,避免连线造成的插值感

  • SHF(simulated historical forecasts)

    prophet 提出,不光要算一个 H 下的准确度,还要算多个不同大小的 H 下的准确度,以求更全面的反映一个模型的表现,达到普通的机器学习任务中 cross-validation 同样的效果 (因为时序的先后顺序是严格约束的,不能像普通的机器学习任务一样,在全部的训练样本上随机的 cross-validation )

    SHF 就是在历史中的某几个点上,用点之前的数据 fit,对点之后的 H 个点进行 predict。比如设置 N 个点,我们称为 cutoff,每个 cutoff 处都用之前的数据训练,对之后的 H 个点预测,这 N 个地方的结果的期望,就是模型对于 H 这个 forecast horizon 时的比较客观的表现

在这里插入图片描述

通过多设置这样的 cutoff 时刻,记录每个 cutoff 处的 SHF,会有更多角度的分析:

  • 相比 baseline 模型有明显差距时,说明模型可能定义的参数不对
  • 某时刻,几乎所有模型都表现很差时,说明可能是异常值,需要重新处理训练数据
  • 当某一个 cutoff 处的“距离”相比上一个 cutoff 显著变大,说明可能这之间有一个没有被捕捉到的changepoints或者忽视了什么季节性成分、非周期事件影响,同样需要重新审视模型

Prophet 的使用

  1. 首先,大家可能会发现找不到 prophet 的 API reference,这可能是因为项目最初是围绕着 R 语言构建的,R 语言能够很方便地自动生成 API 文档:Prophet API 文档-R 语言

    因此,这里更推荐在 notebook 或者别的地方使用 prophet 的时候,使用 help() 的方式,查阅 API 的说明

在这里插入图片描述

比如不知道 cross-validation 怎么用于和官网不同的非日期间隔数据,就可以使用

help(prophet.diagnostics.cross_Validation)
  1. 可以看到几个参数都对应我们上面描述过的原理

    • growth : linear 还是 logistic,对应我们说的两类趋势成分的分类
    • C(t) 是通过在时序数据增加一列 ‘cap’ 实现的,给出每个时刻对应的增长上限,具体官网就有说明。值得注意的是,如果你添加了 cap 列,在使用 make_future_dataframe 的时候,也应该加上这一列
    • changepoints:list of dates,对应的就是人为指出 changepoints 的方式
    • n_changepoints 默认为25,changepoints_range默认为0.8,表示默认情况下,prophet 会在输入的数据的前百分之80个店里面选25个作为变点,变化值对应changepoint_prior_scale决定的Laplace分布上采样的值
    • changepoint_prior_scale:对应前面提到的 Laplace 分布的方差,调大会导致 changepoint 处的 k 的变化值比较容易出现大的值,从而导致整个 trend 变化比较大,导致趋势成分更 flexible
    • seasonality 部分我们提到 N 和平滑这些参数的正态分布的方差
      • yearly_seasonlaity, weekly_seasonality 等,都可以指定一个数值代表 N。如果我们的时序是非日期数据,还可以通过 Prophet().add_seasonlaity 函数添加一个成分,指定它的周期,并指定 N 表示要用多少阶 Fourier 去拟合它
      • 而平滑用的正态分布,对应 seasonality_prior_scale
    • 节假日影响则通过 holidays 参数给出,如前文所述,需要提供一个表示节假日的pd.DataFrame
      • holiday 列:如 ‘mid-autumn’ 这样的节假日名字
      • ds 列:日期,但需要是 date type 的数据,不能是字符串
      • [lower_window] ([]表示可选):整数,如 -2 表示日期之前的两天,也视为该节日,受到同等影响
      • [upper_window]: 同理
      • prior_scale:对应前文提到的“影响值 k 从正态分布中采样”,本参数就是确认这个正态分布的方差的
  2. 在可视化的时候,直接使用 prophet 提供的 plot,往往没有测试集的真实值在图上,因为我们一般在训练之前就会把测试集分出来,此时可以传入 ax,以供我们继续在 prophet 画的图上补真实值的线

    fig, ax_tar = plt.subplot()
    model.plot(res, figsize=(20, 10), ax=ax_tar)
    data[-periods:].plot(kind='scatter', x='ds', y='y', color='lightcoral', alpha=0.5, ax=ax_tar)
    

Reference

  1. Prophet doc

  2. Taylor SJ, Letham B. 2017. Forecasting at scale. PeerJ Preprints 5:e3190v2 https://doi.org/10.7287/peerj.preprints.3190v2


http://chatgpt.dhexx.cn/article/E1Hq7kpL.shtml

相关文章

大白话Prophet模型以及简单的应用(一)

Prophet 是基于加法模型预测时间序列数据。适合于具有季节性影响的时间序列和具有多个季节的历史数据。Prophet对数据中的异常值和缺失值以及趋势的强烈变化有着较好的鲁棒性(耐操性),所以通常情况下都不需要对数据进行处理。 优点&#xff1…

Prophet算法

Prophet简介 Prophet是FaceBook公司在2017年开源的一款时间序列建模工具。Prophet的方法是将时间序列看成是关于t的一个函数,用你和函数曲线的方法进行预测,所以这和传统的时间序列模型有本质上的区别,他更倾向于机器学习的建模方式。 Prop…

时间序列模型Prophet使用详细讲解

之前我们已经讲过了如何在Windows系统下安装Python版本的Prophet。详细见这里。 接下来的几个部分,我们说下如何使用Prophet,以此来体验下Prophet的丰富内容。内容会比较多,主要翻译自官方文档。教程中使用的数据集可在 Prophet 的 github 主…

Prophet拟合模型入门学习

先展示效果: Facebook 时间序列预测算法 Prophet 的研究 Prophet 简介 Facebook 去年开源了一个时间序列预测的算法,叫做 fbprophet,它的官方网址与基本介绍来自于以下几个网站: Github:https://github.com/facebo…

时间序列预测——Prophet模型

文章链接: 时间序列预测——ARIMA模型https://blog.csdn.net/beiye_/article/details/123317316?spm1001.2014.3001.5502 1、Propht模型概述 Prophet模型是Facebook于2017年发布开源的时间序列预测框架。Prophet适用于各种具有潜在特殊特征的预测问题包括广泛的业…

Prophet 时间序列预测框架入门实践笔记

1. Prophet时间序列预测框架概述 Prophet是Facebook开源的一种时间序列预测框架,旨在使时间序列分析更加容易和快速。Prophet可以处理具有多个季节性和突发事件的时间序列数据,并且在数据缺失或异常情况下仍然能够进行良好的预测。Prophet采用了一种基于…

Prophet的原理知识

目录 1、Prophet 简介 2、Prophet 适用场景 3、Prophet 算法的输入输出 4、Prophet 算法原理 5、Prophet 使用时可设置的参数 6、Prophet 学习资料参考 7、Prophet 模型应用 7.0 背景描述7.1 导入数据7.2 拟合模型7.3 预测(使用默认参数)7.4 趋势…

Prophet:一种大规模时间序列预测模型

前言 Prophet是由facebook开发的开源时间序列预测程序,擅长处理具有季节性特征大规模商业时间序列数据。本文主要介绍了Prophet模型的设计原理,并与经典的时间序列模型ARIMA进行了对比。 1. Prophet模型原理 Prophet模型把一个时间序列看做由3种主要成分…

Prophet模型的简介以及案例分析

目录 前言一、Prophet安装以及简介二、适用场景三、算法的输入输出四、算法原理五、使用时可以设置的参数六、学习资料参考七、模型应用7-1、股票收盘价格预测7-1-1、导入相关库7-1-2、读取数据7-1-3、数据预处理以及进行训练集和测试集的划分。7-1-4、实例化Prophet对象&#…

时序预测工具库(Prophet)介绍+代码

时序预测工具库(Prophet) 一、Prophet 简介二、Prophet 适用场景三、Prophet 算法的输入输出四、Prophet 算法原理五、与机器学习算法的对比六、代码6.1 依赖安装6.2 预测demo6.3 效果图 七、参考资料八、官方链接:九、案例链接: …

图的顺序存储及其深度优先遍历和广度优先遍历

图的基本概念 在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关&am…

算法模板-深度优先遍历

简介 深度优先遍历,顾名思义对于树或者图中的某个节点,尽可能往一个方向深入搜索下去。具体而言,从某个节点v出发开始进行搜索,不断搜索直到该节点的所有边都被遍历完。对于很多树、图和矩阵地搜索问题,深度优先遍历是…

图的深度优先遍历java代码详解

代码是根据矩阵来实现深度优先遍历的 邻接结点就是按照vertex中的顺序来一个一个来找的 if(edges[i][j]>0&&!isVisited[j]) { return j; } 就很好的说明了 如果没找到就return -1 回到dfs(i)这一层 再retur…

图(深度优先遍历、广度优先遍历)

文章目录 一、图的概述1.1 什么是图1.2 图对比线性表和树1.3 图的常见概念 二、图的存储方式2.1 邻接矩阵2.2 邻接表 三、图的遍历3.1 图的深度优先遍历3.1.1 什么是深度优先遍历3.1.2 深度优先遍历的步骤3.1.3 深度优先遍历代码实现 3.2 图的广度优先遍历3.2.1 什么是广度优先…

树与图的深度优先遍历

目录 一、概念 二、操作说明 1.树与图的深度优先遍历 2.树的DFS序 3.树的深度 4.树的重心 5.图的连通块划分 三、例题实践 1.树的重心例题实战 a.题目描述 b.解题思路 c.代码实现 一、概念 树与图的深度优先遍历:深度优先遍历,就是在每一个…

算法总结-深度优先遍历和广度优先遍历

深度优先遍历(Depth First Search,简称DFS) 与广度优先遍历(Breath First Search,简称BFS)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等。 一、深度优先遍历 深度优先…

图的两种遍历:深度优先遍历+广度优先遍历

一、深度优先遍历 1、简介 深度优先遍历是指按照深度方向搜索,它类似于树的先根遍历,是树的先根遍历的推广。 基本思想(通俗) 选一条路走到 底,直到 走不通,就 原路返回看看 是否还有路可走,如…

C++实现图的深度优先遍历和广度优先遍历

图的深度和广度优先遍历 图的深度优先遍历1、算法思想2、邻接矩阵构造图3、邻接表构造图 图的广度优先遍历1、算法思想2、邻接矩阵构造图 参考 图的深度优先遍历 1、算法思想 (1)从图中的某个初始点 v 出发,首先访问初始点 v.(…

深度优先遍历

1.先序序列为a,b,c,d 的不同二叉树的个数是 (14) 。 13 14 15 16 f(n)c(n 2n)/n1 2.在构建哈弗曼树时,要使树的带权路径长度最小,只需要遵循一个原则,那就是:权重越大的结点离树…

图的遍历——深度优先遍历与广度优先遍历

目录 何谓遍历? 图的遍历特点 图的遍历方式 深度优先搜索 过程分析 案例分析: 算法的代码实现 测试案例: 测试结果如下: 遍历非连通图 算法复杂度分析 额外补充 广度优先搜索 过程分析 辅助队列 算法的代码实现 队…