【时间序列】详解Prophet模型以及代码示例

本文深入介绍了Facebook开源的时间序列预测模型Prophet,包括其核心组成部分:趋势项、季节性及节假日效应。并详细解析了如何使用Python实现Prophet模型,特别关注于模型的参数配置和效果评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者 | 追光者

研究 | 机器学习与时间序列

出品 | AI蜗牛车

一、模型

Propher模型使用一个可分解的时间序列模型,主要由趋势项(trend),季节项(seasonality)和假期因素(holidays)组成

是趋势函数,代表非周期变化的值, 表示周期性变化(如每周和每年的季节性), 表示在可能不规律的时间表上发生的假期的影响。误差项 代表模型不能适应的任何特殊变化,并假设其符合正态分布

优点

  1. 灵活性:我们可以很容易地适应季节性与多个时期,并让分析师对趋势做出不同的假设。

  2. 缺失处理:与ARIMA模型不同的是,测量不需要有规律的间隔,我们不需要插入丢失的值

  3. 速度快:拟合非常快,允许分析人员交互式地探索许多模型的特性

  4. 可解释性较强:预测模型有容易解释的参数

二、趋势项

Prophet实现了两个趋势模型,分别是基于逻辑回归的饱和增长模型和分段线性模型

首先是基于逻辑回归的趋势项:

为承载力, 为增长速率, 为偏移参数。

互联网时代,硬件的发展和信息量的升级,无论是承载力还是增长率都不会是恒定不变的,所以模型将固定的承载力和增长率修改为随时间变化的承载力和增长率函数,

现实中的时间序列通常会存在变点,也就是趋势发生变化的地方,当设置了变点,模型为分段逻辑回归模型:

其中

$$\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)="" $$="" 代表在时间 上发生的变化率

增长率为

其中

代码

prophet会默认使用linear模型进行预测。预测增长时,通常会有承载力限制:如市场总规模,人口总数等。此时预测应达到饱和。

import pandas as pd
from fbprophet import Prophet
df = pd.read_csv('examples/example_wp_log_R.csv')

#自定义cap
df['cap'] = 8.5

m = Prophet(growth='logistic')
m.fit(df)

另外也可以指定饱和最小值,设置列名为floor。

再来介绍分段线性模型:

其中 代表增长率, 表示增长率的变化量, 表示偏移参数

其中 ,目的是使得函数连续

2.1 突变点

prophet中有四个关于变点的参数,分别是

  • n_changepoints

  • changepoint_prior_scale

  • changepoints

  • changepoint_range

# 如果趋势的变化被过度拟合(即过于灵活)或者拟合不足(即灵活性不足),可以利用输入参数 changepoint_prior_scale 来调整稀疏先验的程度
# 将在时间序列的前90%中放置潜在的变更点。
m = Prophet(changepoint_range=0.9)
# 增加这个值,会导致趋势拟合得更加灵活

m = Prophet(changepoint_prior_scale=0.5)
forecast = m.fit(df).predict(future)
# 指定突变点位置

m = Prophet(changepoints=['2014-01-01'])
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)
# 突变点可视化

from fbprophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)

三、季节性

prophet用傅里叶级数(Fourier series)来建立周期模型:

代表周期,参数可以表示为

对N的调节起到了低通滤波(low-pass filter)的作用。作者发现对于年周期与星期周期,N分别选取为10和3的效果比较好。

当N=10

当N=3

最后季节项 ,其中 由seasonality_prior_scale控制

m = Prophet(seasonality_prior_scale=5,weekly_seasonality=False)
m.add_seasonality(name='monthly', period=30.5, fourier_order=5)
forecast = m.fit(df).predict(future)

四、事件

事件(节假日)对时间序列的影响通常是比较大的,例如国庆节。prophet中内置了很多国家的节假日,用户也可以自定义节假日。

其中

代码实例:

playoffs = pd.DataFrame({
  'holiday': 'playoff',
  'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16',
                        '2010-01-24', '2010-02-07', '2011-01-08',
                        '2013-01-12', '2014-01-12', '2014-01-19',
                        '2014-02-02', '2015-01-11', '2016-01-17',
                        '2016-01-24', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})
superbowls = pd.DataFrame({
  'holiday': 'superbowl',
  'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})
holidays = pd.concat((playoffs, superbowls))

m = Prophet(holidays=holidays)

lower_window 和 upper_window代表节假日影响时间区间

五、总结

业界对Prophet的评价褒贬不一,其优势很明显,不需要像机器学习算法一样构造特征,但是同时也是其短板,无法通过特征工程获得更多信息。Prophet的拟合速度较快,其拟合结果可以作为参考,或者将Prophet拟合的趋势或季节作为特征工程的一部分。

更多精彩内容(请点击图片进行阅读)

公众号:AI蜗牛车

保持谦逊、保持自律、保持进步

个人微信

备注:昵称+学校/公司+方向

如果没有备注不拉群!

拉你进AI蜗牛车交流群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值