Prophet模型详细原理

Prophet模型详细原理

主要是为了自己以后可以及时查看笔记,如果有小伙伴有什么想法非常欢迎一起讨论。

模型形式

prophet模型原理是 y ( t ) = g ( t ) + s ( t ) + h ( t ) + ϵ y(t) = g(t)+s(t)+h(t)+\epsilon y(t)=g(t)+s(t)+h(t)+ϵ
其中 g ( t ) g(t) g(t)是趋势函数, s ( t ) s(t) s(t)表示周期性函数, h ( t ) h(t) h(t)表是节假日、假期函数, ϵ \epsilon ϵ表示误差或者是噪声等。

prophet模型依据的是时间序列的分解,有两种基本的形式:
y = g ( t ) + s ( t ) + h ( t ) + ϵ y=g(t)+s(t)+h(t)+\epsilon y=g(t)+s(t)+h(t)+ϵ y = g ( t ) × s ( t ) × h ( t ) × ϵ y=g(t)\times s(t)\times h(t)\times\epsilon y=g(t)×s(t)×h(t)×ϵ
但是对于第二种形式,当我们考虑取对数时,很自然的就转化为第一种形式: l n ( y ) = l n ( g ( t ) ) + l n ( s ( t ) ) + l n ( h ( t ) ) + l n ( ϵ ) ln(y) = ln(g(t))+ln(s(t))+ln(h(t))+ln(\epsilon) ln(y)=ln(g(t))+ln(s(t))+ln(h(t))+ln(ϵ),所以两种形式可以都作为可加模型(additive model)进行讨论。

趋势函数 g ( t ) g(t) g(t)

对于趋势函数 g ( t ) g(t) g(t),有两种常用的构造方式:分段线性和分段逻辑回归。

分段logistic

先来看分段逻辑回归,对于普通的logistic,对应的响应函数是 1 1 + e − x \frac{1}{1+e^{-x}} 1+ex1,在prophet中使用的与之类似,添加一些参数,变为 f ( x ) = C 1 + e − k ( x − m ) f(x)=\frac{C}{1+e^{-k(x-m)}} f(x)=1+ek(xm)C其中C表示函数的最大渐进值,k表示增长率,m表示曲线的中点。

在时间序列问题中,三个参数我们一般认为是随着t变化而变化的,在现实的时间序列中,曲线的走势肯定不会一直保持不变,在某些特定的时候或者有着某种潜在的周期曲线会发生变化,存在变点, i . e . i.e. i.e. change point。在实际应用prophet模型时,变点可以认为设置,也可以使用prophet自带的参数,默认prophet是25个变点。

对于设置好的S个变点, s j ,   1 ≤ j ≤ S s_j,\ 1\leq j\leq S sj, 1jS,以 δ j \delta_j δj表示在 s j s_j sj时间戳上发生的增长率的变化量,则对于初始增长率是k,在时间 t t t时刻的增长率应该等于 k + ∑ j : t > s j δ j k+\sum_{j:t>s_j}\delta_j k+j:t>sjδj,如果设置指示函数 a : = { 1 ,   f o r   j ≥ s j 0 ,   o t h e r w i s e \bm{a}:=\left\{\begin{aligned} 1&,\ for\ j\geq s_j\\ 0&,\ otherwise\\ \end{aligned}\right. a:={10, for jsj, otherwise,也就是 k + a T δ k+\bm{a}^T\bm{\delta} k+aTδ,每次k确定了的话参数m也要跟着确定:
γ j = ( s j − m − ∑ l < j γ l ) × ( 1 − k + ∑ l < j δ j k + ∑ l ≤ j δ j ) \gamma_j=(s_j-m-\sum_{lγj=(sjml<jγl)×(1k+ljδjk+l<jδj)
得到对应的分段logistic函数: g ( t ) = C ( t ) 1 + e x p ( − ( k + a ( t ) T δ ) × ( t − ( m + a ( t ) T γ ) ) ) g(t)=\frac{C(t)}{1+exp(-(k+\bm{a(t)}^T\bm{\delta})\times(t-(m+\bm{a(t)}^T\bm{\gamma})))} g(t)=1+exp((k+a(t)Tδ)×(t(m+a(t)Tγ)))C(t)
C(t)是需要人为限定的上线。

分段线性

分段线性使用的就是线性可加模型(LAM),对应的模型形式是:
g ( t ) = ( k + a ( t ) T δ ) × ( t + ( m + a ( t ) T γ ) ) g(t)=(k+\bm{a(t)^T\delta})\times(t+(m+\bm{a(t)^T\gamma})) g(t)=(k+a(t)Tδ)×(t+(m+a(t)Tγ))

周期函数 s ( t ) s(t) s(t)

s(t)基于傅里叶级数提供了一个灵活的模型:
s ( t ) = ∑ n = 1 N ( a n cos ⁡ ( 2 π n t P ) + b n sin ⁡ ( 2 π n t P ) ) s(t)=\sum_{n=1}^{N}(a_n\cos(\frac{2\pi nt}{P})+b_n\sin(\frac{2\pi nt}{P})) s(t)=n=1N(ancos(P2πnt)+bnsin(P2πnt))
其中P表示周期的时间,如果是年的话P就是365.25,如果是周的话P就是7

节假日效应 h ( t ) h(t) h(t)

prophet最大的创新点就是可以把涉及到的节假日单独考虑,因为节假日呈现的趋势会与平日数据呈现的规律不同。

对应的节假日效应模型形式为:
h ( t ) = Z ( t ) κ = ∑ i = 1 L κ i ⋅ I { ∈ D i } h(t)=Z(t)\kappa=\sum_{i=1}^{L}\kappa_i\cdot I_{\{\in D_i\}} h(t)=Z(t)κ=i=1LκiI{Di}
其中L表示节假日的个数, κ i \kappa_i κi表示对应节假日的影响范围。

函数主要参数说明

参数 描述
growth "linear"或者"logistic"两种趋势函数
changepoints 包括潜在突变点的日期列表
n_changepoints 如果不手动指定突变点,需要设置内置自动识别突变点的突变点数目
changepoint_prior_scale 突变点选择的灵活性,解决过拟合/欠拟合的问题,越大突变点的选择越灵活
cap 在使用分段逻辑回归的时候需要设置的上限

你可能感兴趣的:(时间序列,python,机器学习,算法)