Prophet Model Details Introduction

Prophet1 is a procedure for forecasting time series data based on an additive model where non-linear trends are fit with yearly, weekly, and daily seasonality, plus holiday effects. It works best with time series that have strong seasonal effects and several seasons of historical data. Prophet is robust to missing data and shifts in the trend, and typically handles outliers well.

前言

Prophet模型的主要有四个部分组成,如下:
y ( t ) = g ( t ) + s ( t ) + h ( t ) + e ( t ) y(t) = g(t) + s(t) + h(t) + e(t) y(t)=g(t)+s(t)+h(t)+e(t)

即:growth(增长趋势)、seasonality(季节趋势)、holidays(节假日对预测值的影响)、以及模型未预测到的噪声。

参数 含义
y(t) 时间序列在时间 t 的观测值
g(t) 增长函数,它模拟目标序列的一种变化趋势
s(t) 以加法形式实现灵活组合各种季节性变化趋势,其还可以通过对数变换适应乘法季节性
h(t) 一个比较特殊的组件,有效纳入了不规则假期或特殊事件对数据序列的影响贡献值
e(t) 假设其服从正态分布的噪声因子

Prophet 仅使用时间作为自变量,将时间作为组件的几个线性和非线性函数,明确解释了目标序列的时间依赖结构。

增长趋势

FaceBook Applications 主要应用到两种增长趋势:饱和增长(saturating
growth model)、分阶段线性增长(piecewise linear model)。

  • Nonlinear, Saturating Growth

数据生成过程的核心是增长模式以及预期如何继续生长;
g ( t ) = C 1 + e − k ( t − m ) g(t) = \frac{C}{1+e^{-k(t-m)}} g(t)=1+ek(tm)C

参数 含义
g ( t ) g(t) g(t) 增长趋势值
C C C 趋势值的上限值
k k k 增长率, k k k 越大,增长速度也就越快
m m m 偏移量

显然,随着时间 t t t 的发展, g ( t ) g(t) g(t)将越趋于 C C C,非线性增长趋势将会达到自然极限或饱和。首先,上式中承载上限不是固定不变的,我们用 C ( t ) C(t) C(t)代表 C C C;其次,增长率 k k k 也不是一成不变的。

对于增长率的变化,我们通过明确定义所有的拐点 s j s_j sj j = 1 , 2 , ⋯   , S j = 1, 2, \cdots, S j=1,2,,S)来表示,其中 S S S代表拐点的数量,即由 S S S个时间拐点构成拐点向量S。定义增长率变化向量 δ ∈ R S \delta \in R^S δRS,其中 δ j \delta_j δj 代表在时间点 s j s_j sj的速率变化;在任意时刻 t t t 的增长率为增长率初始值 k k k 和历史增长率变化值的累加: k + ∑ j : t ≥ s j δ j k + \sum_{j:t \geq s_j}\delta_j k+j:tsjδj.

若不自定义设置,将自动从历史样本的前80%数据量中确定25个均匀分布的点为拐点。 δ ∈ L a p l a c e ( 0 , τ ) \delta \in Laplace(0, \tau) δLaplace(0,τ) 从而进行平滑,参数 τ \tau τ 负责控制增长率的调节强度,较大的值允许模型以适应更大的增长趋势波动,默认值设置为0.05,该值一般能满足大多数应用场景的增长趋势波动。

定义向量 a ( t ) ∈ { 0 , 1 } S a(t) \in \lbrace0,1\rbrace^S a(t){0,1}S,即:
a j ( t ) = { 1 , i f    t ≥ s j , 0 , otherwise. a_j(t)= \begin{cases} 1,& {if \ \ t\geq s_j,}\\ 0,& \text{otherwise.} \end{cases} aj(t)={1,0,if  tsj,otherwise.

则在任意时间点 t t t,增长率 k k k 可以表示为 k + α ( t ) T δ k+α (t)^T\delta kα(t)Tδ 2

为了保持 g ( t ) g(t) g(t)在拐点处保持连续性,对于偏置项需要做出调整, 则在拐点 s j s_j sj j = 1 , 2 , ⋯   , S j = 1, 2, \cdots, S j=1,2,,S),通过下式自适应调整偏移量项:
γ j = ( s j − m − ∑ l < j γ l ) ( 1 − k + ∑ l < j γ l k + ∑ l ≤ j γ l ) \gamma_j=(s_j-m-\sum_{l<j}\gamma_l)(1-\frac{k+\sum_{l<j}\gamma_l}{k+\sum_{l\leq j}\gamma_l}) γj=(sjml<jγl)(1k+ljγlk+l<jγl)


g ( t ) = C ( t ) 1 + e ( − ( k + a ( t ) T δ ) ) ( t − ( m + a ( t ) T δ ) ) g(t)=\frac{C(t)}{1+e^{(-(k+a(t)^T\delta))(t-(m+a(t)^T\delta))}} g(t)=1+e((k+a(t)Tδ))(t(m+a(t)Tδ))C(t)

  • Linear Trend with Changepoints

对于线性增长趋势,通常以一个更简约的模型来定义线性的增长函数,如下式所示:
g ( t ) = ( k + a ( t ) T δ ) t + ( m + a ( t ) T γ ) g(t)=(k+a(t)^T\delta)t+(m+a(t)^T\gamma) g(t)=(k+a(t)Tδ)t+(m+a(t)Tγ)

k k k, a ( t ) a(t) a(t), δ \delta δ, m m m等与前文保持一致; γ j = − s j δ j \gamma_j=-s_j\delta_j γj=sjδj,作用为在拐点处使函数保持连续性。

季节周期性

众多业务因“人类行为”季节性而产生的各种季节性,比如每年的季节性、每周的季节性、每日的季节性以及节假日这样的不规则周期,灵活地组合这些趋势成分才可能更精确地建模季节性,从而更准确地预测结果。

通过使用周期序列的离散傅里叶级数建模季节分量:

s ( t ) = ∑ n = − N N c n e i 2 π n t P s(t) = \sum_{n=-N}^{N} c_ne^\frac{i2{\pi}nt}{P} s(t)=n=NNcnePi2πnt

参数 含义
P 目标序列的周期
c n c_n cn 要估计的系数参数
2N 设定的近似项个数

N 越大,越能拟合复杂的季节性,但可能起不到很好的滤波效果,N的设定需要结合P进行考虑,对于年的周期性,设定P为365.25,N为10;对于每周的季节性,P设置为7,N则设置为3。

如果令
x ( t ) = [ e i 2 π ( − N ) t P , ⋯   , e i 2 π N t P ] x(t) = [e^\frac{i2{\pi}(-N)t}{P}, \cdots ,e^\frac{i2{\pi}Nt}{P} ] x(t)=[ePi2π(N)t,,ePi2πNt]

则,
s ( t ) = x ( t ) β s(t) = x(t)\beta s(t)=x(t)β

β \beta β 是对模型季节性进行平滑的参数,服从 β \beta β ∼ \sim Normal(0, σ 2 \sigma^2 σ2) 分布, σ \sigma σ 越大则允许模型以适应更大的季节性波动,较小的值则抑制季节性,默认值设定为10。

假日和特殊事件影响

很多实际经验告诉我们,节假日或者是一些大事件都会对时间序列造成很大影响,而且这些时间点往往不存在周期性。对这些点的分析是极其必要的,甚至有时候它的重要度远远超过了平常点。

根据中国人们的生活和工作习惯,将这些影响因素作为先验知识纳入模型,对模型准确率的提升具有重大意义。鉴于每个节假日(或者某个已知的大事件)的日期与影响程度存在差异,节假日模型将不同节假日在不同时间点下的影响视作独立的模型。同时为每个模型设置了时间窗口,这主要是考虑到节假日的影响有窗口期(例如中秋节的前几天与后几天),模型将同一个窗口期中的影响设置为相同的值。

假日 i i i相对应的日期列表为 D i D_i Di。添加1 个指示函数表示时间 t t t是否在假期 i i i期间,该指示函数主要由参数 k i k_i ki决定, k i k_i ki取值为{0,1},L 则代表假日和定义的特殊事件的总个数,如下式所示:

h ( t ) = ∑ i = 1 L k i 1 ( t ∈ D i ) h(t) = \sum_{i=1}^{L}k_i1(t \in D_i) h(t)=i=1Lki1(tDi)

其中 k i k_i ki表示在t时刻,第 i i i个节假日的影响。同季节性趋势的模型,这里可以定义:
Z ( t ) = [ 1 ( t ∈ D 1 ) , ⋯   , 1 ( t ∈ D L ) ] Z(t) = [1(t \in D_1), \cdots, 1(t \in D_L)] Z(t)=[1(tD1),,1(tDL)]

则:
h ( t ) = Z ( t ) k h(t) = Z(t)k h(t)=Z(t)k

其中, k k k ∈ \in Normal(0, ν 2 \nu^2 ν2), ν \nu ν默认值设定为10, ν \nu ν越大,则允许模型以适应更大的波动,较小的值则抑制影响力。


  1. Prophet is open source software released by Facebook’s Core Data Science team. It is available for download on CRAN and PyPI. ↩︎

  2. 注意:此处的 δ \delta δ为向量。 ↩︎

你可能感兴趣的:(Prophet Model Details Introduction)