20240328-1-Prophet面试题

本文详细介绍了Prophet算法中的关键组成部分,包括时间序列分解、趋势项模型(基于逻辑回归的分段线性函数)、变点检测、季节性趋势(用傅立叶级数表示)以及节假日效应的处理。同时涵盖了参数设置及其影响。
摘要由CSDN通过智能技术生成

Prophet面试题

在这里插入图片描述

1. 简要介绍Prophet

常见的时间序列分解方法:

将时间序列分成季节项 S t S_t St,趋势项 T t T_t Tt,剩余项 R t R_t Rt,即对所有的 t ≥ 0 t≥0 t0
y t = S t + T t + R t y_{t}=S_{t}+T_{t}+R_{t} yt=St+Tt+Rt

y t = S t × T t × R t y_{t}=S_{t} \times T_{t} \times R_{t} yt=St×Tt×Rt

ln ⁡ y t = ln ⁡ S t + ln ⁡ T t + ln ⁡ R t \ln y_{t}=\ln S_{t}+\ln T_{t}+\ln R_{t} lnyt=lnSt+lnTt+lnRt

fbprophet 的在此基础上,添加了节日项。
y ( t ) = g ( t ) + s ( t ) + h ( t ) + ϵ t y(t)=g(t)+s(t)+h(t)+\epsilon_{t} y(t)=g(t)+s(t)+h(t)+ϵt

2. 趋势项模型

  • 基于逻辑回归

    sigmoid 函数为
    σ ( x ) = 1 / ( 1 + e − x ) \sigma(x)=1 /\left(1+e^{-x}\right) σ(x)=1/(1+ex)
    prophet在逻辑回归的基础上添加了随时间变化的参数,那么逻辑回归就可以改写成:
    f ( x ) = C ( t ) ( 1 + e − k ( t ) ( x − m ( t ) ) ) f(x)=\frac{C(t)}{\left(1+e^{-k(t)(x-m(t))}\right)} f(x)=(1+ek(t)(xm(t)))C(t)
    这里的 C C C 称为曲线的最大渐近值, k k k 表示曲线的增长率, m m m 表示曲线的中点。当 C = 1 , k = 1 , m = 0 C=1, k=1, m=0 C=1,k=1,m=0时,恰好就是大家常见的 sigmoid 函数的形式。

  • 基于分段线性函数
    g ( t ) = C ( t ) 1 + exp ⁡ ( − ( k + a ( t ) t δ ) ⋅ ( t − ( m + a ( t ) T γ ) g(t)=\frac{C(t)}{1+\exp \left(-\left(k+\boldsymbol{a}(t)^{t} \boldsymbol{\delta}\right) \cdot\left(t-\left(m+\boldsymbol{a}(t)^{T} \boldsymbol{\gamma}\right)\right.\right.} g(t)=1+exp((k+a(t)tδ)(t(m+a(t)Tγ)C(t)
    k k k表示变化量

    a j ( t ) a_{j}(t) aj(t)表示指示函数:
    a j ( t ) = { 1 ,  if  t ≥ s j 0 ,  otherwise  a_{j}(t)=\left\{\begin{array}{l}1, \text { if } t \geq s_{j} \\ 0, \text { otherwise }\end{array}\right. aj(t)={1, if tsj0, otherwise 
    δ j \delta_{j} δj表示在时间戳 s j s_{j} sj上的增长率的变化量

    γ j \gamma_{j} γj确定线段边界
    γ j = ( s j − m − ∑ ℓ < j γ ℓ ) ⋅ ( 1 − k + ∑ ℓ < j δ ℓ k + ∑ ℓ ≤ j δ ℓ ) \gamma_{j}=\left(s_{j}-m-\sum_{\ell<j} \gamma_{\ell}\right) \cdot\left(1-\frac{k+\sum_{\ell<j} \delta_{\ell}}{k+\sum_{\ell \leq j} \delta_{\ell}}\right) γj= sjm<jγ (1k+jδk+<jδ)
    其中:
    a ( t ) = ( a 1 ( t ) , ⋯   , a S ( t ) ) T , δ = ( δ 1 , ⋯   , δ S ) T , γ = ( γ 1 , ⋯   , γ S ) T \boldsymbol{a}(t)=\left(a_{1}(t), \cdots, a_{S}(t)\right)^{T}, \boldsymbol{\delta}=\left(\delta_{1}, \cdots, \delta_{S}\right)^{T}, \boldsymbol{\gamma}=\left({\gamma}_{1}, \cdots, \gamma_{S}\right)^{T} a(t)=(a1(t),,aS(t))T,δ=(δ1,,δS)T,γ=(γ1,,γS)T

3. 变点的选择

在 Prophet 算法中,需要给出变点的位置,个数,以及增长的变化率:

  • changepoint_range

    changepoint_range 指的是百分比,需要在前 changepoint_range 那么长的时间序列中设置变点

  • n_changepoint

    n_changepoint 表示变点的个数,在默认的函数中是 n_changepoint = 25

  • changepoint_prior_scale。

    changepoint_prior_scale 表示变点增长率的分布情况
    δ j ∼ Laplace ⁡ ( 0 , τ ) \delta_{j} \sim \operatorname{Laplace}(0, \tau) δjLaplace(0,τ)
    T \mathcal{T} T就是 change_point_scale

4. 对未来的预估

对于已知的时间序列,可以手动设置s个变点

对于预测的数据模型使用Poisson分布找到新增的变点,然后与已知的变点进行拼接

5. 季节性趋势

时间序列通常会随着天,周,月,年等季节性的变化而呈现季节性的变化,也称为周期性的变化

prophet算法使用傅立叶级数来模拟时间序列的周期性

P P P表示时间序列的周期, P = 365.25 P = 365.25 P=365.25表示以年为周期, P = 7 P = 7 P=7表示以周为周期。它的傅立叶级数的形式都是:
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}\left(a_{n} \cos \left(\frac{2 \pi n t}{P}\right)+b_{n} \sin \left(\frac{2 \pi n t}{P}\right)\right) s(t)=n=1N(ancos(P2πnt)+bnsin(P2πnt))

6. 节假日效应(holidays and events)

除了周末,同样有很多节假日,而且不同的国家有着不同的假期,不同的节假日可以看成相互独立的模型,并且可以为不同的节假日设置不同的前后窗口值,表示该节假日会影响前后一段时间的时间序列。
h ( t ) = Z ( t ) κ = ∑ i = 1 L κ i ⋅ 1 { t ∈ D i } h(t)=Z(t) \boldsymbol{\kappa}=\sum_{i=1}^{L} \kappa_{i} \cdot 1_{\left\{t \in D_{i}\right\}} h(t)=Z(t)κ=i=1Lκi1{tDi}
其中: Z ( t ) = ( 1 { t ∈ D 1 } , ⋯   , 1 { t ∈ D L } ) , κ = ( κ 1 , ⋯   , κ L ) T Z(t)=\left(1_{\left\{t \in D_{1}\right\}}, \cdots, 1_{\left\{t \in D_{L}\right\}}\right), \boldsymbol{\kappa}=\left(\kappa_{1}, \cdots, \kappa_{L}\right)^{T} Z(t)=(1{tD1},,1{tDL}),κ=(κ1,,κL)T κ ∼ Normal ⁡ ( 0 , v 2 ) \boldsymbol{\kappa} \sim \operatorname{Normal}\left(0, v^{2}\right) κNormal(0,v2)

并且该正态分布是受到 v v v = holidays_prior_scale 这个指标影响的。默认值是 10,当值越大时,表示节假日对模型的影响越大;当值越小时,表示节假日对模型的效果越小

7. 参数

在 Prophet 中,用户一般可以设置以下四种参数:

  1. Capacity:在增量函数是逻辑回归函数的时候,需要设置的容量值。

  2. Change Points:可以通过 n_changepoints 和 changepoint_range 来进行等距的变点设置,也可以通过人工设置的方式来指定时间序列的变点。

  3. 季节性和节假日:可以根据实际的业务需求来指定相应的节假日。

  4. 光滑参数:

    τ \tau τ = changepoint_prior_scale 可以用来控制趋势的灵活度

    σ \sigma σ = seasonality_prior_scale 用来控制季节项的灵活度,

    v v v = holidays prior scale 用来控制节假日的灵活度。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武昌库里写JAVA

您的鼓励将是我前进的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值