时间序列算法Prophet代码实现——以天气预测模型为例

最近在做销售量预测模型相关的项目,重新拾起时间序列算法,包括AR(自回归模型)、MA(移动平均模型)、ARIMA(差分回归移动平均模型)等。综合预测效果想要特别记录时间序列中的Prophet算法,操作简单,效果显著。

一、算法简介

Prophet是Facebook开源的python预测库,是工业级应用算法,并不是说在模型原理上相对于ARIMA模型有更好的突破,而是从模型使用体验上有所提升。即使没有统计学背景,也能快速上手使用。
时间序列算法Prophet代码实现——以天气预测模型为例_第1张图片

二、Prophet代码实现

以天气预测模型为例。训练数据集为历史三年北京地区每日最高气温,预测未来60天北京地区每日最高气温。

1、数据源处理

加载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代码实现——以天气预测模型为例_第2张图片
值得注意的是,Prophet对于数据的要求比较刻板,时间字段必须为时间格式,且字段名为“ds”,数值字段名必须为“y”:

df.rename(columns={'rq':'ds','temp_max':'y'}, inplace=True)#将原来的命名修改为算法要求的命名
df['ds'] = pd.to_datetime(df['ds'],format='%Y-%m-%d')#修改日期字段格式

2、建立预测模型

在建立预测模型之前,需要介绍各类参数的意义:

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)

时间序列算法Prophet代码实现——以天气预测模型为例_第3张图片
图中红色的虚线即模型自动检测到的突变点,红色的实线为模型学习到的整体趋势。

3、模型预测效果

预测未来60天最高气温:

periods:设置预测长度
freq:设置最小时间颗粒

future = m.make_future_dataframe(periods=60,freq='d')
forecast = m.predict(future)

对于参数freq,我分享一个表格可以查找指定的时间单位:

时间序列算法Prophet代码实现——以天气预测模型为例_第4张图片
查看预测结果:

forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

yhat为预测结果,yhat_lower为预测下限,yhat_upper为预测上限。
时间序列算法Prophet代码实现——以天气预测模型为例_第5张图片
画出预测结果图:

fig1 = m.plot(forecast)

时间序列算法Prophet代码实现——以天气预测模型为例_第6张图片
本文没有设置训练集与测试集计算具体预测的准确率,主要是想分享模型预测过程。在实际运用时,需要参考模型预测结果与业务实际情况,调整各参数,得到可信的预测值。
Prophet可以查看模型各维度分别的趋势图,包括长期趋势、季节趋势、月趋势等。这个功能对于分析结果有特别大的帮助。

时间序列算法Prophet代码实现——以天气预测模型为例_第7张图片
最后,将模型预测结果保存到CSV表中就能使用。

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

你可能感兴趣的:(算法,python,机器学习,统计学,pandas)