最近在做销售量预测模型相关的项目,重新拾起时间序列算法,包括AR(自回归模型)、MA(移动平均模型)、ARIMA(差分回归移动平均模型)等。综合预测效果想要特别记录时间序列中的Prophet算法,操作简单,效果显著。
Prophet是Facebook开源的python预测库,是工业级应用算法,并不是说在模型原理上相对于ARIMA模型有更好的突破,而是从模型使用体验上有所提升。即使没有统计学背景,也能快速上手使用。
以天气预测模型为例。训练数据集为历史三年北京地区每日最高气温,预测未来60天北京地区每日最高气温。
加载Prophet包
pip install fbprophet
在python中调用Prophet和Pandas就能满足最简单的时序预测模型,Pandas负责取数据和保存结果,Prophet负责进行预测。
import pandas as pd
from fbprophet import Prophet
df = pd.read_csv(r'./weather.csv')
df的数据结构:
值得注意的是,Prophet对于数据的要求比较刻板,时间字段必须为时间格式,且字段名为“ds”,数值字段名必须为“y”:
df.rename(columns={'rq':'ds','temp_max':'y'}, inplace=True)#将原来的命名修改为算法要求的命名
df['ds'] = pd.to_datetime(df['ds'],format='%Y-%m-%d')#修改日期字段格式
在建立预测模型之前,需要介绍各类参数的意义:
changepoint_range:设置寻找突变点的比例(默认为0.9,即从前90%的历史数据中学习突变点)
changepoints:设置制定突变点([‘2019-10-31’],不使用changepoint_range自动寻找突变点,可以手动指定日期)
changepoint_prior_scale:设置拟合跟随性(默认为0.05,值越大,拟合的跟随性越好,如果这个值过大,会有过拟合的风险)
interval_width:设置置信区间(默认为0.8,值越小,上下限的带宽越小)
另外,seasonality_mode可以设置模型学习的方式,默认为加法,seasonality_mode=‘multiplicative’可以设置为乘法。一般情况下,有规律的平稳序列用加法模型,有较大趋势变化的序列可以考虑用乘法模型。
除以上基本参数之外,Prophet特别好用的地方在于,通过设置内置参数,可以调节以“年”、“月”、“周”等周期性参数。
yearly_seasonality=True,设置年规律拟合(False选择关掉)
weekly_seasonality,设置周规律拟合
daily_seasonality,设置日规律拟合
seasonality_prior_scale,设置季度周期性突变的灵活度,值越高越约灵活
天气预测模型建模:
m = Prophet(changepoint_range=0.8
,changepoint_prior_scale = 0.5
,interval_width=0.4
#,seasonality_mode='multiplicative'
,yearly_seasonality=True
,seasonality_prior_scale=11
,weekly_seasonality=False)
m.add_seasonality(name='monthly', period=30.5, fourier_order=5)
forecast = m.fit(df).predict()
m.add_seasonality目的也是为了指定学习月规律。
查看模型学习效果图:
from fbprophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)
图中红色的虚线即模型自动检测到的突变点,红色的实线为模型学习到的整体趋势。
预测未来60天最高气温:
periods:设置预测长度
freq:设置最小时间颗粒
future = m.make_future_dataframe(periods=60,freq='d')
forecast = m.predict(future)
对于参数freq,我分享一个表格可以查找指定的时间单位:
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
yhat为预测结果,yhat_lower为预测下限,yhat_upper为预测上限。
画出预测结果图:
fig1 = m.plot(forecast)
本文没有设置训练集与测试集计算具体预测的准确率,主要是想分享模型预测过程。在实际运用时,需要参考模型预测结果与业务实际情况,调整各参数,得到可信的预测值。
Prophet可以查看模型各维度分别的趋势图,包括长期趋势、季节趋势、月趋势等。这个功能对于分析结果有特别大的帮助。
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].to_csv('./weather_further.csv',index=False)
Prophet甚至可以指定特殊日期,进行针对性学习。下例子我在另一个模型中设置year_put和virus两种类型的特殊日期,学习特殊日期期间的变化
playoffs = pd.DataFrame({
'holiday': 'year_put',
'ds': pd.to_datetime(['2019-2-28', '2020-01-31','2018-01-31']),
'lower_window': 0,
'upper_window': 2,
})
superbowls = pd.DataFrame({
'holiday': 'virus',
'ds': pd.to_datetime(['2019-10-31','2018-10-31']),
'lower_window': 0,
'upper_window': 2,
})
holidays = pd.concat((playoffs, superbowls))
m = Prophet(holidays=holidays)
forecast = m.fit(df).predict()
1、https://github.com/facebook/prophet
2、https://blog.csdn.net/u014710355/article/details/97265517