1.prophet简介
prophet是facebook开源的一是序列预测模型,算法本身可以处理掉异常值和部分缺失值的情况,并可以通过广义的相性模型,分成周期项,趋势项,剩余项和节假日效应四项。
模型的输入数据有固定的格式,df[‘ds’]为时间序列,df[‘y’]为对映值。
- 适用场景
并非所有的预测问题都可以通过同一种程序(procedure)解决。Prophet 是为我们在 Facebook 所遇到的业务预测任务而优化的,这些任务通常具有以下特点:
- 有至少几个月(最好是一年)的每小时、每天或每周观察的历史数据;
- 有多种人类规模级别的较强的季节性趋势:每周的一些天和每年的一些时间;
- 有事先知道的以不定期的间隔发生的重要节假日(比如国庆节)。
- 缺失的历史数据或较大的异常数据的数量在合理范围内;
- 有历史趋势的变化;
- 对于数据中蕴含的非线性增长的趋势都有一个自然极限或饱和状态。
2.安装fbprophet
在windows中安装fbprophet的过程中,遇到了各种环境问题,网上找了很多资料,始终没解决。
于是重新创建了一个虚拟环境,直接通过conda来进行安装prephet。(在安装之前先conda update conda)。其依赖项非常多,其版本的要求也非常严格,Python版本建议3.6以上。
在mac上
3.prophet的参数设置
在forecaster.py中可以找到默认参数。
growth='linear',
changepoints=None,
n_changepoints=25,
changepoint_range=0.8,
yearly_seasonality='auto',
weekly_seasonality='auto',
daily_seasonality='auto',
holidays=None,
seasonality_mode='additive',
seasonality_prior_scale=10.0,
holidays_prior_scale=10.0,
changepoint_prior_scale=0.05,
mcmc_samples=0,
interval_width=0.80,
uncertainty_samples=1000,
3.1增长函数的设置
在 Prophet 里面,有两个增长函数,分别是分段线性函数(linear)和逻辑回归函数(logistic)。而 m = Prophet() 默认使用的是分段线性函数(linear),并且如果要是用逻辑回归函数的时候,需要设置 capacity 的值,i.e. df[‘cap’] = 100,否则会出错。
m = Prophet()
m = Prophet(growth='linear')
m = Prophet(growth='logistic')
3.2变点的设置
在 Prophet 里面,变点默认的选择方法是前 80% 的点中等距选择 25 个点作为变点,也可以通过以下方法来自行设置变点,甚至可以人为设置某些点。
m = Prophet(n_changepoints=25)
m = Prophet(changepoint_range=0.8)
m = Prophet(changepoint_prior_scale=0.05)
m = Prophet(changepoints=['2014-01-01'])
画图的方法
from fbprophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)
3.3周期性的设置
m = Prophet(weekly_seasonality=False)
m.add_seasonality(name='monthly', period=30.5, fourier_order=5)
m = Prophet(weekly_seasonality=True)
m.add_seasonality(name='weekly', period=7, fourier_order=3, prior_scale=0.1)
3.4节假日的设置
有的时候,由于双十一或者一些特殊节假日,我们可以设置某些天数是节假日,并且设置它的前后影响范围,也就是 lower_window 和 upper_window。
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, holidays_prior_scale=10.0)
4.画图
在预测操作之后,把时间序列的预测趋势画出来:
画出预测图:
m.plot(forecast)
画出时间序列的分量:
m.plot_components(forecast)
参考资料:
1.时间序列模型Prophet使用详细讲解
2.python-fbprophet总结