内容简介:中心 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算法的工作流如下所示:
Prophet算法工作流
由建模和模型评估两部分组成。其优点在于可以结合领域专家的专业知识,在训练过程中不断对模型进行改进。后面会有详细的讲解。
Prophet预测模型
Prophet使用的是加性模型(additive model),分别用不同的部分来拟合时间序列不同的趋势,叠加起来则是整个时间序列模型:
趋势函数
g ( t )是趋势函数,表示时间序列上的非周期变化,在Prophet中有以下两种形式:
(1)
(2)
式(1)用于拟合非线性变化的增长趋势, C ( t )表示增长的上限,是 t 的函数,认为在不同时间段序列增长的上限可能是不同的。
式(1)和式(2)里的 表示增长速率, 表示线性的偏移。 a ( t )是一个指示函数,取值要么是0要么是1. 引入 a ( t ) 的目的是考虑到时间序列中可能的 changepoint ,这些changepoint会对趋势函数有所影响,\delta 和 \gamma 表示changepoint对趋势函数的斜率和偏移量影响的大小。算法中默认 ,由参数 \tau 控制模型改变斜率的灵活度。Prophet算法可以自动检测出这些changepoint,也可以由我们手动传入这些点。
周期(季节)函数
s ( t )用于刻画时间序列中的周期性(季节性)变化,其形式为傅立叶级数,如下所示:
P 是时间周期,当 P =7时刻画的是以周为周期, P =365.25则是年。 a _ n 和 b _ n 是需要学习的参数。由傅立叶级数的性质可知, N 越大越能刻画变化多的周期性模式,默认使用 N =10刻画以年为单位的周期性变化, N =3刻画以周为单位的周期性变化。
节假日函数
h ( t )即为holday,其用于拟合节假日和特殊日期,比如中国的双十一、美国的黑五等,函数形式为:
表示holiday的时长,\kappa刻画在整个趋势的改变程度。
最后是,它是拟合那些无法用模型描述的异常点。
优化
模型训练的过程其实就是一个优化求解的过程,Prophet采用了L-BGFS的方式进行优化求得各个参数的最大后验估计。
模型回顾
针对文章一开始提到的模型适用情况,每种特征都可以由其拟合函数解释,如“强大的多次的「人类规模级」的季节性”可以由周期性函数 s ( t )体现,“事先知道的以不定期的间隔发生的重要节假日”则是通过函数 h ( t )刻画,引入的可以保证模型不会因离群点产生较大的误差等。
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」,如下图所示:
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分别是预测的下界和上界,给出了一个置信区间,输出示例如下:
Prophet预测结果输出示例
此外,Prophet还提供了API,可以画出整体拟合的情况和单独的每个函数
fig1 = m.plot(forecast)
fig2 = m.plot_components(forecast)
预测结果整体拟合
黑色的点是真实数据,深蓝色是拟合的走向,浅蓝色是置信区间。
预测结果的每个部分
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的一半:
Prophet的cross validation
这样做的好处是能检测出历史数据是否存在异常点:
-
如果验证结果有较大偏差,可以手动调整模型趋势或者周期性;
-
某个时间段的结果有问题,可能有离群点,手动删除(离群点的删除不影响预测结果);
-
某个时间段error大,下个时间段小,可能需要手动添加changepoints。
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++网络通信协议分析与应用实现
汪晓平、钟军 / 人民邮电出版社 / 2003-2-1 / 60.00元
本书介绍了如何利用Visual一起来看看 《Visual C++网络通信协议分析与应用实现》 这本书的介绍吧!