作者 | 追光者
研究 | 机器学习与时间序列
出品 | AI蜗牛车
一、模型
Propher模型使用一个可分解的时间序列模型,主要由趋势项(trend),季节项(seasonality)和假期因素(holidays)组成
是趋势函数,代表非周期变化的值, 表示周期性变化(如每周和每年的季节性), 表示在可能不规律的时间表上发生的假期的影响。误差项 代表模型不能适应的任何特殊变化,并假设其符合正态分布
优点
灵活性:我们可以很容易地适应季节性与多个时期,并让分析师对趋势做出不同的假设。
缺失处理:与ARIMA模型不同的是,测量不需要有规律的间隔,我们不需要插入丢失的值
速度快:拟合非常快,允许分析人员交互式地探索许多模型的特性
可解释性较强:预测模型有容易解释的参数
二、趋势项
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蜗牛车交流群