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 趋势突变点
  • 7.5 季节性、假期效应
  • 7.6 模型诊断(内置方法)
  • 7.7 模型评估

正文

1、Prophet 简介

fbprophet是facebook开源的一个时间序列预测算法。

prophet库可以做的

  • Saturating Forecasts
  • Trend Changepoints
  • Seasonality, Holidays Effects
  • Multiplicative Seasonality
  • Uncertainty Intervals
  • Outliers
  • Non-Daily Data
  • Diagnostics

2、Prophet 适用场景

Prophet适用于具有明显的内在规律的商业行为数据,例如:有如下特征的业务问题:

  • a.有至少几个月(最好是一年)的每小时、每天或每周观察的历史数据;
  • b.有多种人类规模级别的较强的季节性趋势:每周的一些天和每年的一些时间;
  • c.有事先知道的以不定期的间隔发生的重要节假日(比如国庆节);
  • d.缺失的历史数据或较大的异常数据的数量在合理范围内;
  • e.有历史趋势的变化(比如因为产品发布);
  • f.对于数据中蕴含的非线性增长的趋势都有一个自然极限或饱和状态。

3、Prophet 算法的输入输出

 上图为一个时间序列场景:

  • 黑色表示原始的时间序列离散点

  • 深蓝色的线表示使用时间序列来拟合所得到的取值

  • 浅蓝色的线表示时间序列的一个置信区间,也就是所谓的合理的上界和下界

prophet 所做的事情就是: 

  • 输入已知的时间序列的时间戳和相应的值;

  • 输入需要预测的时间序列的长度;

  • 输出未来的时间序列走势。

  • 输出结果可以提供必要的统计指标,包括拟合曲线,上界和下界等。

传入prophet的数据

分为两列 dsy,   【 ds表示时间序列的时间戳,y表示时间序列的取值 】

其中:

  • ds是pandas的日期格式,样式类似与 YYYY-MM-DD for a date or YYYY-MM-DD HH:MM:SS

  • y列必须是数值型,代表着我们希望预测的值。

通过 prophet 的计算,可以计算出:

  • yhat,表示时间序列的预测值

  • yhat_lower,表示预测值的下界

  • yhat_upper,表示预测值的上界

4、Prophet 算法原理

算法模型:

y\left ( t \right ) = g\left ( t \right ) + s\left ( t\right ) + h\left ( t \right ) + \varepsilon \left ( t \right )

  模型整体由三部分组成:

  • growth(增长趋势)
  • seasonality(季节趋势)
  • holidays(节假日对预测值的影响)

其中:

  • g(t) 表示趋势项,它表示时间序列在非周期上面的变化趋势;
  • s(t) 表示周期项,或者称为季节项,一般来说是以周或者年为单位;
  • h(t) 表示节假日项,表示时间序列中那些潜在的具有非固定周期的节假日对预测值造成的影响;
  • \varepsilon \left ( t \right )即误差项或者称为剩余项,表示模型未预测到的波动,\varepsilon \left ( t \right )服从高斯分布; 

Prophet 算法就是通过拟合这几项,然后最后把它们累加起来就得到了时间序列的预测值。

4.1 趋势项模型

趋势项有两个重要的函数,一个是基于逻辑回归函数的(非线性增长),另一个是基于分段线性函数的(线性增长)

4.1.1 基于逻辑回归的趋势项:

 g\left ( t \right ) = \frac{C\left ( t \right )}{1+exp\left ( -\left ( k+ a\left ( t \right ) ^{T} \delta \right )\cdot \left ( t - \left ( m+a\left ( t \right ) ^{T} \gamma \right ) \right ) \right )}

\boldsymbol{a}(t) = (a_{1}(t),\cdots,a_{S}(t))^{T}, \boldsymbol{\delta} = (\delta_{1},\cdots,\delta_{S})^{T}, \boldsymbol{\gamma} = (\gamma_{1},\cdots,\gamma_{S})^{T}

其中,

  • C(t)表示承载量:

    • 它是一个随时间变化的函数,限定了所能增长的最大值
    • 在使用 Prophet 的 growth = ‘logistic’ 的时候,需要提前设置好 C(t) 的取值才行
  • k 表示增长率:

    • 在现实的时间序列中,曲线的走势肯定不会一直保持不变,在某些特定的时候或者有着某种潜在的周期曲线会发生变化,模型定义了增长率k发生变化时对应的点,将其称作changepoints。

    • 在 Prophet 里面,是需要设置变点的位置的,而每一段的趋势和走势也是会根据变点的情况而改变的。在程序里面有两种方法,一种是通过人工指定的方式指定变点的位置;另外一种是通过算法来自动选择。在默认的函数里面,Prophet 会选择 n_changepoints = 25 个变点,然后设置变点的范围是前 80%,也就是在时间序列的前 80% 的区间内会设置变点。之后还要看一些边界条件是否合理,例如时间序列的点数是否少于 n_changepoints 等内容;其次如果边界条件符合,那变点的位置就是均匀分布的。

    • 下面假设已经放置了 S 个变点,并且变点的位置是在时间戳s_{j},1\leq j \leq S上,那么在这些时间戳上,就需要给出增长率的变化,也就是在时间戳s_{j}上发生的 change in rate。可以假设有这样一个向量:\boldsymbol{\delta}\in\mathbb{R}^{S}, 其中\delta _{i}表示在时间戳s_{j}上的增长率的变化量。如果一开始的增长率使用 k 来代替的话,那么在时间戳 t 上的增长率就是
      k + \sum_{j:t>s_{j}} \delta_{j},通过一个指示函数\mathbf{a}(t)\in \{0,1\}^{S} , 就是a_{j}(t) = \begin{cases} 1, \text{ if } t\geq s_{j},\\ 0, \text{ otherwise.} \end{cases} 在时间戳 t 上面的增长率就是k+a(t)^{T}\delta.

  • m 表示偏移量:

    • 当增长率k调整后,每个changepoint点对应的偏移量m也应该相应调整以连接每个分段的最后一个时间点,表达式如下:
    • \gamma_{j} = \bigg(s_{j} - m - \sum_{\ell <j} \gamma_{\ell} \bigg) \cdot \bigg( 1- \frac{k + \sum_{\ell < j} \delta_{\ell}}{k + \sum_{\ell\leq j}\delta_{\ell}} \bigg)

4.1 2 基于分段线性函数的趋势项:

g(t)=(k+\boldsymbol{a}(t)^{T}\boldsymbol{\delta})\cdot t+(m+\boldsymbol{a}(t)^{T}\boldsymbol{\gamma})

其中,

  • k 表示增长率
  • \boldsymbol{\delta} 表示增长率的变化量
  • m 表示偏移量
  • 分段线性函数与逻辑回归函数最大的区别就是\boldsymbol{\gamma}的设置不一样,在分段线性函数中\boldsymbol{\gamma}=(\gamma_{1},\cdots,\gamma_{S})^{T}, \gamma_{j}=-s_{j}\delta_{j}. 这与之前逻辑回归函数中的设置是不一样的。
  • 在分段线性函数中,是不需要 capacity 这个指标的,因此 m = Prophet() 这个函数默认的使用 growth = ‘linear’ 这个增长函数,也可以写作 m = Prophet(growth = ‘linear’);

4.1.3 变点的选择

在 Prophet 算法中,有三个比较重要的指标,分别为:

  • changepoint_range:变点的位置
  • n_changepoint:变点的个数
  • changepoint_prior_scale:增长的变化率

其中:

  • changepoint_range 指的是百分比,需要在前 changepoint_range 那么长的时间序列中设置变点,在默认的函数中是 changepoint_range = 0.8。
  • n_changepoint 表示变点的个数,在默认的函数中是 n_changepoint = 25。
  • changepoint_prior_scale 表示变点增长率的分布情况,在论文中,\delta_{j} \sim Laplace(0,\tau),这里的\tau就是 change_point_scale。 

在默认的场景下,变点的选择是基于时间序列的前 80% 的历史数据,然后通过等分的方法找到 25 个变点,而变点的增长率是满足 Laplace 分布\delta_{j} \sim Laplace (0,0.05)的。因此,当\tau趋近于零的时候,\delta_{j}也是趋向于零的,此时的增长函数将变成全段的逻辑回归函数或者线性函数。

4.1.4 对未来的预估

  • 从历史上长度为T的数据中,可以选择出 S 个变点,它们所对应的增长率的变化量是\delta_{j} \sim Laplace(0,\tau)
  • 此时我们需要预测未来,因此也需要设置相应的变点的位置,此时通过 Poisson 分布等概率分布方法找到新增的changepoint_ts_new 的位置,
  • 然后与 changepoint_t 拼接在一起就得到了整段序列的 changepoint_ts。

4.2 季节性趋势 s(t)

由于时间序列中有可能包含多种天,周,月,年等周期类型的季节性趋势,因此,傅里叶级数可以用来近似表达这个周期属性。

  • 使用傅立叶级数来模拟时间序列的周期性:假设 P 表示时间序列的周期,P = 365.25 表示以年为周期,P = 7 表示以周为周期。

  • 它的傅立叶级数的形式都是:

  • N表示希望在模型中使用的这种周期的个数,较大的N值可以拟合出更复杂的季节性函数,然而也会带来更多的过拟合问题。

  • 按照经验值,对于以年为周期的序列(P = 365.25)而言,N = 10;对于以周为周期的序列(P = 7 )而言,N = 3

    • 当 N = 10 时,

X(t) = \bigg[\cos(\frac{2\pi(1)t}{365.25}),\cdots,\sin(\frac{2\pi(10)t}{365.25})\bigg]

    • 当 N = 3 时,

X(t) = \bigg[\cos(\frac{2\pi(1)t}{7}),\cdots,\sin(\frac{2\pi(3)t}{7})\bigg]

因此时间序列的季节项就是:

s(t) = X(t) \boldsymbol{\beta}

其中,

  • \beta的初始化是\boldsymbol{\beta} \sim Normal(0,\sigma^{2})
  • 这里的\sigma是通过 seasonality_prior_scale 来控制的,也就是说 \sigma= seasonality_prior_scale。这个值越大,表示季节的效应越明显;这个值越小,表示季节的效应越不明显。
  • 在代码里面,seasonality_mode 也对应着两种模式,分别是加法和乘法,默认是加法的形式。

4.3 节假日效应h(t)

  • 在现实环境中,节假日或者是一些大事件都会对时间序列造成很大影响,而且这些时间点往往不存在周期性,对这些点的分析是极其必要的.
  • 在 Prophet 里面,收集了各个国家的特殊节假日。除了节假日之外,用户还可以根据自身的情况来设置必要的假期,例如双十一.
  • 由于每个节假日或者某个已知的大事件对时间序列的影响程度不一样,例如春节,国庆节则是七天的假期,对于劳动节等假期来说则假日较短.
  • 因此,节假日模型将不同节假日在不同时间点下的影响视作独立的模型,并且可以为不同的节假日设置不同的前后窗口值,表示该节假日会影响前后一段时间的时间序列.
  • 对于第 i 个节假日来说,D_{i}表示该节假日的前后一段时间.
  • 为了表示节假日效应,需要一个相应的指示函数,同时需要一个参数\kappa_{i}来表示节假日的影响范围.

假设有 L 个节假日,那么节假日效应模型就是:

h(t)=Z(t) \boldsymbol{\kappa}=\sum_{i=1}^{L} \kappa_{i}\cdot 1_{\{t\in D_{i}\}}

其中Z(t)=(1_{\{t\in D_{1}\}},\cdots,1_{\{t\in D_{L}\}})\boldsymbol{\kappa}=(\kappa_{1},\cdots,\kappa_{L})^{T}.

其中,

  • \boldsymbol{\kappa}\sim Normal(0,v^{2})并且该正态分布是受到 v = holidays_prior_scale 这个指标影响的。
  • 默认值是 10,当值越大时,表示节假日对模型的影响越大;当值越小时,表示节假日对模型的效果越小。
  • 该参数可自行调整。

5、Prophet 使用时可设置的参数

  • growth:增长趋势模型。分为两种:”linear”与”logistic”,分别代表线性与非线性的增长,默认值:”linear”.

  • Capacity:在增量函数是逻辑回归函数的时候,需要设置的容量值,表示非线性增长趋势中限定的最大值,预测值将在该点达到饱和.

  • Change Points:可以通过 n_changepoints 和 changepoint_range 来进行等距的变点设置,也可以通过人工设置的方式来指定时间序列的变点,默认值:“None”.

  • n_changepoints:用户指定潜在的”changepoint”的个数,默认值:25。

  • changepoint_prior_scale:增长趋势模型的灵活度。调节”changepoint”选择的灵活度,值越大,选择的”changepoint”越多,从而使模型对历史数据的拟合程度变强,然而也增加了过拟合的风险。默认值:0.05。

  • seasonality_prior_scale(seasonality模型中的):调节季节性组件的强度。值越大,模型将适应更强的季节性波动,值越小,越抑制季节性波动,默认值:10.0.

  • holidays_prior_scale(holidays模型中的):调节节假日模型组件的强度。值越大,该节假日对模型的影响越大,值越小,节假日的影响越小,默认值:10.0。

  • freq:数据中时间的统计单位(频率),默认为”D”,按天统计.

  • periods:需要预测的未来时间的个数。例如按天统计的数据,想要预测未来一年时间内的情况,则需填写365。

  • mcmc_samples:mcmc采样,用于获得预测未来的不确定性。若大于0,将做mcmc样本的全贝叶斯推理,如果为0,将做最大后验估计,默认值:0。

  • interval_width:衡量未来时间内趋势改变的程度。表示预测未来时使用的趋势间隔出现的频率和幅度与历史数据的相似度,值越大越相似,默认值:0.80。当mcmc_samples = 0时,该参数仅用于增长趋势模型的改变程度,当mcmc_samples > 0时,该参数也包括了季节性趋势改变的程度。

  • uncertainty_samples:用于估计未来时间的增长趋势间隔的仿真绘制数,默认值:1000。

6、Prophet 学习资料参考

官方链接:

案例链接:



作者:小小孩儿的碎碎念
链接:https://www.jianshu.com/p/218757bee516
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>好的,我现在要回答用户关于Prophet的问题。首先,我需要确定用户对Prophet的了解程度。用户可能是在数学建模竞赛中接触到了Prophet模型,现在想了解它的基本概念、用途和优势。用户之前的问题是关于研究生复试中可能被问到的数学建模问题,所以需要确保回答内容与他们的应用场景相关。 接下来,我需要回顾Prophet的基本信息。Prophet是由Facebook开发的时间序列预测工具,适用于具有强烈季节性影响的数据。用户可能想知道Prophet的核心原理,比如它是如何处理趋势、季节性和节假日的。此外,用户可能关心Prophet在数学建模中的应用,比如销量预测,这可能涉及到时间序列分析。 然后,我需要考虑如何结构化回答。用户之前提供的总结框架比较详细,所以回答也应该层次分明。可能需要分为几个部分,比如核心功能、数学模型、优势、应用场景、使用步骤和局限与改进。这样用户能逐步理解Prophet的不同方面。 在数学公式部分,用户强调使用$$...$$格式,并且正确使用LaTeX。需要确保Prophet的模型公式正确无误,比如加法模型中的趋势、季节性和节假日项,以及可能的参数说明。例如,趋势部分可能使用逻辑增长或分段线性模型,季节性用傅里叶级数表示,节假日作为额外回归项。 还要注意用户提到的数据特征,比如处理促销日期、节假日等外生变量。Prophet的优势之一就是能够方便地纳入这些因素,所以在回答中要突出这一点。同时,用户可能在建模中结合了Prophet和LSTM,需要说明Prophet在其中的角色,比如捕捉已知的季节性和节假日因素,而LSTM处理非线性模式。 用户可能也需要知道Prophet的优缺点,特别是在数学建模中的实际应用。比如,Prophet对缺失数据和异常值的鲁棒性,但可能在处理长期依赖或复杂模式时不如LSTM。需要指出这些点,并建议结合其他模型,如用户之前提到的熵权法组合预测。 在语言表达上,要保持口语化,但结构清晰,分点说明。避免使用过于专业的术语,但必要时给出解释。例如,解释傅里叶级数在季节性建模中的作用,或者逻辑增长模型与分段线性模型的区别。 最后,检查是否符合用户的所有要求:使用正确的中文,行内公式用$...$,独立公式用$$...$$,结构清晰,层次分明。确保回答覆盖Prophet的定义、原理、应用场景、使用步骤、优缺点,以及与其他模型的对比,如LSTM。 可能需要添加示例,比如销量预测中的具体步骤,或者如何在Prophet中设置节假日参数。此外,提醒用户在实际应用中的注意事项,如参数调优、模型验证等,以增强实用性。 总结来说,回答需要全面覆盖Prophet的各个方面,结合用户之前的建模经验,突出其在处理时间序列问题中的优势和应用方法,同时指出局限性和改进方向,帮助用户在面试中能够层次分明、逻辑清晰地阐述相关知识。</think>以下是关于Prophet模型的层次化解析,结合数学建模应用场景的说明: --- ### **一、Prophat 的核心定义** **Prophet** 是由Facebook核心数据科学团队(现Meta)开发的**开源时间序列预测工具**,主要解决**商业领域**中具有强季节性、节假日效应的时间序列预测问题。其名称意为“预言家”,突出其预测能力。 --- ### **二、数学模型原理** #### 1. **基础模型结构** Prophet采用**加法模型**(Additive Model): $$ y(t) = g(t) + s(t) + h(t) + \epsilon_t $$ 其中: - $g(t)$:**趋势项**(Trend),描述长期变化 - 可选**逻辑增长**(带饱和上限)或**分段线性**模型 - 数学表达示例(分段线性): $$ g(t) = \left( k + \mathbf{a}(t)^\intercal \boldsymbol{\delta} \right) t + \left( m + \mathbf{a}(t)^\intercal \boldsymbol{\gamma} \right) $$ - $s(t)$:**季节性项**(Seasonality),用傅里叶级数拟合周期性 - 周周期公式示例($N=3$阶): $$ s(t) = \sum_{n=1}^{N} \left( a_n \cos\left(\frac{2\pi nt}{7}\right) + b_n \sin\left(\frac{2\pi nt}{7}\right) \right) $$ - $h(t)$:**节假日项**(Holidays),通过二值向量标记特殊日期 - $\epsilon_t$:误差项(假设服从正态分布) #### 2. **关键参数设置** - `changepoint_prior_scale`:控制趋势变化的灵敏度 - `seasonality_prior_scale`:调节季节性强度 - `holidays_prior_scale`:调整节假日影响幅度 --- ### **三、核心优势** 1. **易用性强** - 自动处理缺失值 - 内置节假日数据库(支持自定义) - 无需复杂特征工程 2. **可解释性高** - 可分解出趋势、季节性、节假日分量(可视化如右图) - 参数具有明确业务含义 3. **计算效率** - 基于Stan的底层优化,百万级数据分钟级训练 --- ### **四、在数学建模中的典型应用** #### 1. **销量预测场景** - **输入数据**:历史日销量(时间序列)+ 促销日期标记 - **建模步骤**: ```mermaid graph TD A[加载数据] --> B[定义节假日/促销日] B --> C[拟合Prophet模型] C --> D[生成未来30天预测] D --> E[计算置信区间] ``` - **输出结果**: - 基准预测值 - 不同促销方案的敏感度分析 #### 2. **与LSTM的对比** | 维度 | Prophet | LSTM | |-------------|----------------------------------|-------------------------------| | **数据需求** | 小样本即可(>1周期) | 需要大量数据防止过拟合 | | **可解释性** | 高(明确分量分解) | 黑箱模型 | | **计算成本** | 低(适合快速迭代) | 高(需GPU加速) | | **优势场景** | 强季节性+已知外部事件 | 复杂非线性模式+长期依赖 | --- ### **五、使用示例(Python)** ```python from prophet import Prophet import pandas as pd # 数据格式要求:ds(日期列), y(目标变量) df = pd.read_csv('sales_data.csv') # 添加促销日(自定义节假日) promotions = pd.DataFrame({ 'holiday': 'promotion', 'ds': pd.to_datetime(['2023-01-01', '2023-06-18']), 'lower_window': 0, 'upper_window': 1 # 促销影响持续2天 }) # 建模预测 model = Prophet(holidays=promotions, yearly_seasonality=8) model.fit(df) future = model.make_future_dataframe(periods=30) forecast = model.predict(future) # 可视化组件 fig = model.plot_components(forecast) ``` --- ### **六、局限性及改进方向** 1. **主要局限** - 难以捕捉**突变型异常值**(需手动添加干预项) - 对**长期趋势**(>1年)预测能力较弱 2. **改进策略** - **混合建模**:Prophet + LSTM(如原C题方案) - **引入外部变量**:通过`add_regressor()`添加天气/经济指标 - **贝叶斯调参**:使用Optuna优化超参数 --- ### **七、面试应答技巧** 当被问及Prophet时,建议采用**技术-业务结合**的表达: 1. **技术层面**:解释模型结构+参数含义 2. **业务层面**:举例说明在销量预测中的价值 3. **反思层面**:客观分析其适用边界 **示例回答**: “我们在C题中使用Prophet主要处理**已知节假日与促销影响**。比如通过傅里叶级数拟合周销量波动,再添加‘双十一’‘春节’等自定义节假日参数。但发现它对**突发性销量激增**(如极端天气)预测不足,因此后续用LSTM捕捉这类非线性模式,最终通过熵权法融合两者预测结果。” --- 以上内容可根据面试时间灵活调整为1分钟速览版或3分钟详解版。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值