prophet:时间序列预测模型原理

版权声明:本文为博主原创文章,未经博主允许不得转载。作为分享主义者(sharism),本人所有互联网发布的图文均采用知识共享署名 4.0 国际许可协议(https://creativecommons.org/licenses/by/4.0/)进行许可。转载请保留作者信息并注明作者Jie Qiao专栏:http://blog.csdn.net/a358463121。商业使用请联系作者。 https://blog.csdn.net/a358463121/article/details/70194279

prophet:时间序列预测原理

介绍

prophet是Facebook 开源一款基于 Python 和 R 语言的数据预测工具即“先知”。Facebook 表示,Prophet 相比现有预测工具更加人性化,并且难得地提供 Python 和R的支持。它生成的预测结果足以和专业数据分析师媲美。

时间序列模型

基本模型

y(t)=g(t)+s(s)+h(t)+ϵt

这里,模型将时间序列分成3个部分的叠加,其中 g(t) 表示增长函数,用来拟合非周期性变化的。 s(t) 用来表示周期性变化,比如说每周,每年,季节等, h(t) 表示假期,节日等特殊原因等造成的变化,最后 ϵt 为噪声项,用他来表示随机无法预测的波动,我们假设 ϵt 是高斯的。事实上,这是generalized additive model(GAM)模型的特例,但我们这里只用到了时间作为拟合的参数。

这里写图片描述
prophet的工作流如上图所述,通过整合了建模-评估两大模块,实现了时间序列模型的快速迭代优化。

对于GAM的拟合,可以使用backfitting或L-BFGS来进行(我们偏向于选择L-BFGS)。

因此,对于时间序列的预测问题,这里是把该当做了曲线拟合的问题来完成,因此与传统时间序列的方法有所不同。传统时间序列更多的是考虑时间在结构上的依赖关系,比如ARIMA模型,通过放弃这一点有4个好处:

1.更灵活

2.ARIMA建模需要有连续的时间数据,而我们这个方法并不需要,因此我们可以不考虑缺失值的填充问题。

3.拟合非常快,使得交互式探索成为可能。

4.预测模型的参数非常容易解释,因此分析人员可以根据经验来设置一些参数。

增长项

非线性增长

我们将增长项 g(t) 定义为了一个逻辑函数:

g(t)=C1+exp(k(tb))

这一个函数实际上就是类似于人口增长函数,其中C是人口容量,k是增长率,b是偏移量。显然随着t的增加, g(t) 越趋于C,k越大,增长速度就越快。

但是如果仅使用这个模型是无法满足要求的,因为增长率是可能随着时间变化的。于是我们可以设一个change point用来表示增长率k变化的时间节点,当 tsj 的时候就是一个转折点

这里写图片描述
由于出现change point,为了使函数是连续的,需要做些处理:

这里写图片描述
我们设C也是随时间变化的

C(t)=KC(t)=Mt+K

于是最后我们可以得到

这里写图片描述
另外,我们也可以使用线性的增长函数:

这里写图片描述
k是增长率,δ是适应率,b是偏移量参数,γ设为 sjδj 是为了让这个函数连续

季节性

这里使用傅里叶级数来近似

这里写图片描述
因此,模型需要拟合这些cn系数,N越大,越能拟合复杂的季节性

若取N=10,可以写成
这里写图片描述

节假日

处理节日的方法很简单,就是将过去,将来的相同节假日设置一个虚拟变量

这里写图片描述
Di 表示第i个虚拟变量,如果属于这个就1,不属于就0.

模型拟合

最后模型的拟合用到了stan语言进行拟合,非常方便:

这里写图片描述
以上就是模型在stan上的定义。想了解更多stan,可以参考我另外一篇博客:R语言stan概率编程

参考资料

https://facebookincubator.github.io/prophet/

作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者a358463121专栏:http://blog.csdn.net/a358463121,如果涉及源代码请注明GitHub地址:https://github.com/358463121/。商业使用请联系作者。

猜你喜欢

转载自blog.csdn.net/a358463121/article/details/70194279