Python爬虫与Stata应用能力提升与实证前沿 寒假工作坊
Author: Greg Rafferty Title: Forecasting in Python with Facebook Prophet-How to tune and optimize Prophet using domain knowledge to add greater control to your forecasts. Site https://towardsdatascience.com/forecasting-in-python-with-facebook-prophet-29810eb57e66
网络上有很多prophet教程,但大多都比较肤浅,没有教程教我们如何优化Prophet模型,也没有说清楚如何结合分析师经验进行分析预测。在本篇教程中,我试图在这两个问题上多下点功夫。
之前我分享过用ARIMA算法来预测美国商业飞行市场乘客数。ARIMA能很好的预测短期趋势,但是Facebook的工程师构建的Prophet框架还能做ARIMA做不了的事情。Prophet底层是STAN语言,这是一种概率编程语言。这使Prophet具有贝叶斯统计提供的许多优势,包括季节性,领域知识的和使用置信区间来进行风险估计。
安装
!pip3 install fbprophet
文章末尾会有jupyter notebook下载方式
航空乘客数据集
prophet需要传入的时间序列数据有两个字段
ds 日期
y 所在日期对应的值
import pandas as pd
passengers = pd.read_csv('data/AirPassengers.csv',
header=0,
names=['ds', 'y'])
passengers['ds']=pd.to_datetime(passengers['ds'])
passengers.head()
import matplotlib.pyplot as plt
import seaborn as sns
sns.lineplot(x='ds', y='y', data=passengers)
简单的绘图,趋势是上升的,我们想了解更多,这里就需要用到prophet库。
Prophet参数解读
这里看不懂可以先跳过去,之后看到实际例子再回来瞅瞅
Prophet(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.8,
uncertainty_samples=1000)
growth: 趋势默认为线性增长'linear', 还有 'logistic'
changepoints: 默认不指定改变点,prophet会根据趋势自动搜寻潜在的改变点
n_changepoints:如果changepoints设置了,该参数不起作用;如果changepoints没有设置,那么改变点将在changepointrange范围内搜寻。默认设置为25
changepoint_range: 范围0-1,表示改变点落在趋势中的可能的范围。
yearly_seasonality: 即数据存在年度周期性变化,拟合年度趋势。参数有'auto', 参数有'auto'、True和False
weekly_seasonality: 同上,拟合周度趋势,默认为auto, 参数有'auto'、True和False
daily_seasonality: 同上,拟合日度趋势,默认为auto, 参数有'auto'、True和False
holidays:默认为None,如果要指定传入节假日数据,数据格式为dataframe,有两个指定的字段holiday和ds,其中holiday列的数据为字符串, ds列为date数据类型
seasonality_mode: 趋势模式有'additive'和'multiplicative',默认为加法'additive'
seasonality_prior_scale: 趋势缩放系数,如果该参数大,会让后续趋势波动变大。如果系数较小,会抑制趋势甚至熨平趋势。默认参数设置为10
holiday_prior_scale: 类似于seasonalitypriorscale参数的作用,主要用于解释节假日对趋势波动幅度起到熨平或者加大波动强度对作用。默认也是10
changepoint_prior_scale:类似于seasonalitypriorscale参数的作用,主要用于解释改变点对趋势波动幅度起到熨平或者加大波动强度对作用。默认是0.05
mcmc_samples:参数为整数。如果大于0, 模型使用贝叶斯推断;如果设置为0,使用最大后验概率估计(MAP)
interval_width:浮点数类型,为预测提供不确定性区间的宽度。如果mcmcsamples = 0,则模型使只使用MAP估计得出的趋势中的不确定性;如果mcmc.samples> 0,则将对所有模型参数进行积分,其中将包括季节性不确定性。
uncertainty_samples:用于估计不确定性间隔的模拟次数,默认为1000
趋势分解
我们想看看乘客出行的规律,比如
乘客出行的总体趋势是上升还是下降
每周的星期几是出行高峰
12个月份是否存在季度或者月份区别
这里我做一个6年的预测,频率是月份,即未来 6*12=72
期的预测。
from fbprophet import Prophet
import matplotlib.pyplot as plt
#Prophet默认禁用了周度,这里将其打开,设置为True
prophet = Prophet(weekly_seasonality=True)
#prophet模型对passengers数据进行拟合
prophet.fit(passengers)
#构造未来72期(12年,月度,共72期)
future = prophet.make_future_dataframe(periods=12*6, freq='M')
fig = prophet.plot_components(forecast)
plt.show()
看图总结
航空出行的总体趋势是稳步发展。
每周的周五是出行高峰期,这跟我们的常识一致。
每年年度范围内,2月, 678航空乘客较多。
还有一个要注意的地方, 而且我们发现在1954-1956之前趋势有转折,在此之后增长加快了一些。这说明在1954-1956年区间段有较大的转折,可能是政策发生改变。
标注改变
add_changepoints_to_plot(ax,
m,
fcst)
在趋势图中加入改变的标注
ax: 趋势图,这里我们输入的fig.gca() gca是get current axis的意思
m:prophet模型
fcst: prophet的预测
这里我们可以在图中标注改变点,使用到 addchangepointsto_plot 函数
from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot
#Prophet默认禁用了周度和,这里将其打开,设置为True
prophet = Prophet(weekly_seasonality=True)
#prophet模型对passengers数据进行拟合
prophet.fit(passengers)
#构造未来72期(12年,月度,共72期)
future = prophet.make_future_dataframe(periods=12*6, freq='M')
#预测
forecast = prophet.predict(future)
#forecast趋势中有过去真实对数据,也有未来72期的预测值
fig = prophet.plot(forecast)
#在趋势图中加入断点标注
a = add_changepoints_to_plot(fig.gca(), prophet, forecast)
a
近期文章
Python爬虫与Stata应用能力提升与实证前沿 寒假工作坊
课件获取方式,请在公众号后台回复关键词“20191214”
觉得本文有用,请不吝点赞评论转发~谢谢支持~