Facebook 的 Prophet 算法简介与使用

栏目: 编程工具 · 发布时间: 5年前

内容简介:中心 xueminsi 给大家带来的 Prophet 算法的简介和使用。Prophet是Facebook开源的一款针对时间序列基于Python和R语言的数据预测工具,其工作发表在论文《Forecasting at scale》(Taylor S J, LethamB. Forecasting at scale[J]. The American Statistician, 2018, 72(1): 37-45)。这里的“at scale”并不是常说的数据存储和计算复杂度,而是指数据的复杂度(如数据中存在大量异

中心 xueminsi 给大家带来的 Prophet 算法的简介和使用。

Prophet是Facebook开源的一款针对时间序列基于 Python 和R语言的数据预测工具,其工作发表在论文《Forecasting at scale》(Taylor S J, LethamB. Forecasting at scale[J]. The American Statistician, 2018, 72(1): 37-45)。这里的“at scale”并不是常说的数据存储和计算复杂度,而是指数据的复杂度(如数据中存在大量异常点)和预测结果的评估复杂度。用于预测的时间任务常具有以下特征:

  • 对于历史在至少几个月(最好是一年)的每小时、每天或每周的观察

  • 强大的多次的「人类规模级」的季节性:每周的一些天和每年的一些时候

  • 事先知道的以不定期的间隔发生的重要节假日(如,双十一)

  • 合理数量的缺失的观察或大量异常

  • 历史趋势改变,比如因为产品发布或记录变化

  • 非线性增长曲线的趋势,其中有的趋势达到了自然极限或饱和

Prophet算法的工作流如下所示:

Facebook 的 Prophet 算法简介与使用

Prophet算法工作流

由建模和模型评估两部分组成。其优点在于可以结合领域专家的专业知识,在训练过程中不断对模型进行改进。后面会有详细的讲解。

Prophet预测模型

Prophet使用的是加性模型(additive model),分别用不同的部分来拟合时间序列不同的趋势,叠加起来则是整个时间序列模型:

Facebook 的 Prophet 算法简介与使用

趋势函数

g ( t )是趋势函数,表示时间序列上的非周期变化,在Prophet中有以下两种形式:

Facebook 的 Prophet 算法简介与使用 (1)

Facebook 的 Prophet 算法简介与使用 (2)

式(1)用于拟合非线性变化的增长趋势, C ( t )表示增长的上限,是 t 的函数,认为在不同时间段序列增长的上限可能是不同的。

式(1)和式(2)里的 Facebook 的 Prophet 算法简介与使用 表示增长速率, Facebook 的 Prophet 算法简介与使用 表示线性的偏移。 a ( t )是一个指示函数,取值要么是0要么是1. 引入 a ( t ) 的目的是考虑到时间序列中可能的 changepoint ,这些changepoint会对趋势函数有所影响,\delta 和 \gamma 表示changepoint对趋势函数的斜率和偏移量影响的大小。算法中默认 Facebook 的 Prophet 算法简介与使用 ,由参数 \tau 控制模型改变斜率的灵活度。Prophet算法可以自动检测出这些changepoint,也可以由我们手动传入这些点。

周期(季节)函数

s ( t )用于刻画时间序列中的周期性(季节性)变化,其形式为傅立叶级数,如下所示:

Facebook 的 Prophet 算法简介与使用

P 是时间周期,当 P =7时刻画的是以周为周期, P =365.25则是年。 a _ nb _ n 是需要学习的参数。由傅立叶级数的性质可知, N 越大越能刻画变化多的周期性模式,默认使用 N =10刻画以年为单位的周期性变化, N =3刻画以周为单位的周期性变化。

节假日函数

h ( t )即为holday,其用于拟合节假日和特殊日期,比如中国的双十一、美国的黑五等,函数形式为:

Facebook 的 Prophet 算法简介与使用

表示holiday的时长,\kappa刻画在整个趋势的改变程度。

最后是,它是拟合那些无法用模型描述的异常点。

优化

模型训练的过程其实就是一个优化求解的过程,Prophet采用了L-BGFS的方式进行优化求得各个参数的最大后验估计。

模型回顾

针对文章一开始提到的模型适用情况,每种特征都可以由其拟合函数解释,如“强大的多次的「人类规模级」的季节性”可以由周期性函数 s ( t )体现,“事先知道的以不定期的间隔发生的重要节假日”则是通过函数 h ( t )刻画,引入的可以保证模型不会因离群点产生较大的误差等。

Prophet算法使用加性模型的好处是可以刻画时间序列的不同变化部分:整体走势、周期性变化、节假日影响和异常点。下面两张图分别展现了模型整体拟合和单独每个函数部分的情况:

Facebook 的 Prophet 算法简介与使用

模型拟合与预测

Facebook 的 Prophet 算法简介与使用

Prophet模型中的每一部分

而且,因为Prophet的参数较多,可调性较大,也可以加入较多的先验和领域知识,如我们可以手动加入模型走势的上限和changepoint、holiday等,这些改变点的影响也可以由参数调整。

Prophet使用

Prophet现在已经开源,Facebook提供了R和Python语言版,这里以Python语言为例,介绍下Prophet的基本使用方法。更加详细用法参考https://facebook.github.io/prophet/docs/quick_start.html 。

基本使用

首先导入所需要的包


 

from fbprophet import Prophet

import pandas as pd

读需要拟合的数据,并创建模型和拟合


 

df = pd.read_csv('../examples/example_wp_log_peyton_manning.csv') # read data

# create model and fit data

m = Prophet()

m.fit(df)

Prophet是单特征模型,输入只有两列,日期列必须被称为「ds」,数值列被称为「y」,如下图所示:

Facebook 的 Prophet 算法简介与使用

Prophet算法输入示例

接着指定需要预测的日期

future = m.make_future_dataframe(periods=365)

默认是以天为单位,这里是创建了接下来365天的「ds」列,即365条日期输入。

接下来就可以直接预测了


 

forecast = m.predict(future)

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

其中yhat为预测的结果,yhat_lower和yhat_upper分别是预测的下界和上界,给出了一个置信区间,输出示例如下:

Facebook 的 Prophet 算法简介与使用

Prophet预测结果输出示例

此外,Prophet还提供了API,可以画出整体拟合的情况和单独的每个函数


 

fig1 = m.plot(forecast)

fig2 = m.plot_components(forecast)

Facebook 的 Prophet 算法简介与使用

预测结果整体拟合

黑色的点是真实数据,深蓝色是拟合的走向,浅蓝色是置信区间。

Facebook 的 Prophet 算法简介与使用

预测结果的每个部分

SHF交叉验证与异常点删除

看了Prophet的论文和使用方法下来,我对Prophet这部分特性印象深刻,但看网上的一些博客和参考资料很少有提及这部分,所以特地展开介绍一下。

SHF全称是Simulated Historical Forecasts,是时间序列的一种交叉验证方法。是以历史数据作为训练集,然后取紧接着后面的一段时间为验证集,用以判断模型的好坏。用滑动窗口的方式不断推近训练数据和验证数据的时间序列。


 

from fbprophet.diagnostics import cross_validation

df_cv = cross_validation(m, initial='730 days', period='180 days', horizon = '365 days')

这里的initial是指从开始传入的时间序列到多久作为训练集,period指多久为一个cutoff,horizon为预测的时间段长度。这里为取第1-730为训练集,731~(731+365)天为验证集,看模型效果如何,然后往后推延cufoff天,即再取第(1+180)~(730+180)天为训练集,(731+180)~(731+180+365)天的数据为验证集,依次往后推,直到整个时间序列的最后一天。一般cutoff为horizon的一半:

Facebook 的 Prophet 算法简介与使用

Prophet的cross validation

这样做的好处是能检测出历史数据是否存在异常点:

  • 如果验证结果有较大偏差,可以手动调整模型趋势或者周期性;

  • 某个时间段的结果有问题,可能有离群点,手动删除(离群点的删除不影响预测结果);

  • 某个时间段error大,下个时间段小,可能需要手动添加changepoints。

Prophet的另一个优点是对缺失点不敏感,如果人工发现一些异常点,那么可以直接将其删除,不影响训练过程,如下图所示,左图是有异常点的模型拟合结果,右图是删除异常点后的结果:

Facebook 的 Prophet 算法简介与使用

删除异常点前后的拟合结果

总结

Prophet算法原理简单,多参数便于加入领域知识和进行数据分析,适用于周期性和趋势性较强的数据。数据只有两列,其中只有一列是特征,对特征的要求比较高。

参考资料

[1] Taylor S J, Letham B. Forecasting at scale[J]. The American Statistician, 2018, 72(1): 37-45

[2] https://facebook.github.io/prophet/

[3] https://github.com/facebook/prophet

[4] https://medium.com/open-machine-learning-course/open-machine-learning-course-topic-9-part-3-predicting-the-future-with-facebook-prophet-3f3af145cdc

附:微信公众号不能打公式,大多公式都是以插图替代,还有部分特殊符号只能用latex形式表示,阅读不变,还请见谅。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Visual C++网络通信协议分析与应用实现

Visual C++网络通信协议分析与应用实现

汪晓平、钟军 / 人民邮电出版社 / 2003-2-1 / 60.00元

本书介绍了如何利用Visual一起来看看 《Visual C++网络通信协议分析与应用实现》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器