您的位置:首页 > 运维架构

Prophet(预言者)facebook时序预测----论文总结以及调参思路

2017-10-30 22:17 357 查看
Prophet是比较简单易用的,对于非时序预测和机器学习领域专家的是非常容易上手的。其参数大多数都是非常直观的参数。(Prophet的python包大量使用了pandas库,所以使用python做开发的需要首先了解pandas的使用。)

Prophet也是一种约定优于配置的思想,写代码只需要按照约定的套路定义好pandas中的dataframe就可以轻松进行预测。

下面我们来进行一个官方网站提供的Quick Start来进行学习了解。

import pandas as pd
import numpy as np
from fbprophet import Prophet
import matplotlib.pyplot as plt

# 数据文件请从github上的Prophet项目下载,并放在代码的对应目录
df = pd.read_csv('examples/example_wp_peyton_manning.csv')
df['y'] = np.log(df['y'])
print df.tail()

# 定义模型
m = Prophet()

# 训练模型
m.fit(df)

# 构建预测集
future = m.make_future_dataframe(periods=365)
print future.tail()

# 进行预测
forecast = m.predict(future)

print forecast.tail(10)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(10)
m.plot(forecast)
plt.show()




上图为最终的作图结果,其中蓝色线为预测结果,黑色点为原数据点。除此之外,由于Prophet使用的是加性模型,也就是把模型分为趋势模型、周期模型、节假日以及随机噪声的叠加。因为我们可以方便对各个成分进行作图观察。我们可以利用
m.plot_components(forecast)
,对各个成分进行作图观察,如下:


默认会画出趋势、年周期、星期周期成分(如果在定义模型时给出了holiday参数,还会做出holiday的成分图)

下面干货,从我的学到的经验中设计如何利用Prophet构建有效的预测模型。

首先我们去除数据中的异常点(outlier),直接赋值为none就可以,因为Prophet的设计中可以通过插值处理缺失值,但是对异常值比较敏感。

选择趋势模型,默认使用分段线性的趋势,但是如果认为模型的趋势是按照log函数方式增长的,可设置
growth='logistic'
从而使用分段log的增长方式

设置趋势转折点(changepoint),如果我们知道时间序列的趋势会在某些位置发现转变,可以进行人工设置,比如某一天有新产品上线会影响我们的走势,我们可以将这个时刻设置为转折点。

设置周期性,模型默认是带有年和星期以及天的周期性,其他月、小时的周期性需要自己根据数据的特征进行设置,或者设置将年和星期等周期关闭。

设置节假日特征,如果我们的数据存在节假日的突增或者突降,我们可以设置holiday参数来进行调节,可以设置不同的holiday,例如五一一种,国庆一种,影响大小不一样,时间段也不一样。

此时可以简单的进行作图观察,然后可以根据经验继续调节上述模型参数,同时根据模型是否过拟合以及对什么成分过拟合,我们可以对应调节seasonality_prior_scale、holidays_prior_scale、changepoint_prior_scale参数。

相关网站:

Prophet官方文档:https://facebook.github.io/prophet/

Prophet论文:https://peerj.com/preprints/3190/

Prophet-github:https://github.com/facebook/prophet
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息