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+e−x1,在prophet中使用的与之类似,添加一些参数,变为 f ( x ) = C 1 + e − k ( x − m ) f(x)=\frac{C}{1+e^{-k(x-m)}} f(x)=1+e−k(x−m)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, 1≤j≤S,以
δ
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 j≥sj, 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}\gamma_l)\times(1-\frac{k+\sum_{l<j}\delta_j}{k+\sum_{l\leq j}\delta_j})
γj=(sj−m−l<j∑γl)×(1−k+∑l≤jδ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=1∑N(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=1∑Lκi⋅I{∈Di}
其中L表示节假日的个数,
κ
i
\kappa_i
κi表示对应节假日的影响范围。
函数主要参数说明
参数 | 描述 |
---|---|
growth | "linear"或者"logistic"两种趋势函数 |
changepoints | 包括潜在突变点的日期列表 |
n_changepoints | 如果不手动指定突变点,需要设置内置自动识别突变点的突变点数目 |
changepoint_prior_scale | 突变点选择的灵活性,解决过拟合/欠拟合的问题,越大突变点的选择越灵活 |
cap | 在使用分段逻辑回归的时候需要设置的上限 |