Prophet:Facebook 简单高效的时间序列模型

阿泽 将门创投 今天

作者:复旦大学计算机硕士&高级算法工程师-阿泽

本次要跟大家分享一篇来自TechBeat社区的最新文章——《Prophet:Facebook 简单高效的时间序列模型》。本文从商业预测的实际问题出发,阐述了Prophet模型的优势以及不足。希望能给对时序预测感兴趣的朋友一些帮助~

TechBeat社区,还有更多干货文章、技术Talk与你分享~
网址:www.techbeat.com

导读:


时序预测是一个很常见的数据科学任务,可以帮助组织或个人进行目标规划或者异常检测等。


本文介绍的是 Facebook 2017 年的工作——Prophet,这是一个适用于大规模的时序预测模型。它不仅解决了时序预测的建模问题,还解决了模型的可解释性问题。


此外,Facebook 提供了 Prophet 的开源代码,并且将模型封装的非常简单且友好,极大地降低了分析人员的入门门槛,同时也提供了各种接口以便分析人员灵活地调整模型。


1 为什么有 Prophet

构建一个高质量的预测不是一件容易事,而在商业预测的实践过程中通常会出现两个问题:


  • 完全自动的预测技术不够灵活,过于死板;
  • 分析师通常有较高的专业知识,但是在时序模型预测方面一无所知;


预测是一个需要大量专业经验的任务,因此,如何能够提供一个高质量且简单易用的预测模型成了一个亟需解决的问题。


为此,Facebook 的研究员进行了大量的研究,并提出了 Prophet 模型,该模型非常简单灵活,适用于没有进行过时序预测的人员,同时也提供了非常人性化的配置。


下图展示了大规模商业分析中的循环方法,其由自动化建模和人工干预两部分组成:

  • Modeling:首先分析师会使用制定的参数对时间序列进行建模
  • Foreca and Evaluation:然后由模型产生预测并对其进行评估;
  • Surface Problems:当性能不佳时可以进行人工干预,并将问题标记给分析师;
  • Visually Inspect Forecasts:分析师进行检查并根据反馈调整模型。


2 Prophet 预测模型


在介绍模型之前,我们先看一张图:

这是 Facebook 的真实数据集,每一天都有一个点,点的颜色按照星期进行编码,以展示一个星期的周期性。

从这张图中我们可以看到:这个时间序列具有周期性 (weekly、yearly)、趋势变化性 (Trend)、异常点 (outliers) 和节假日效应 (holiday)。

我们可以使用时间序列分解将其分解为趋势、季节性、节假日:


其中,g(t)建模时间序列值非周期变化的趋势函数;s(t)建模周期性变换,包括 weekly、yearly;h(t)建模不规律的假期影响;误差项 表示模型不适应的任何特殊变化;后面我们会假设这个参数服从正态分布。


这类规范类似于广义可加模型 (Generalized additive model,GAM),这是一种非线性的回归模型。这里 Prophet 只使用时间作为回归因子,并用几个线性和非线性的时间函数作为分量。

GAM 不具备 ARIMA 重要的推论优势,但其也具备其他方面的优势:

  • 灵活性强,易于分解,且在必要时也可以容纳新的成分;
  • 拟合速度快,允许用户进行交互式探索;
  • 测量值不需要有规则的间隔,也不需要对缺失值进行处理;
  • 参数的可解释性强,方便用户更改。

接下来我们关注模型分解后的不同模块。

3.1 趋势模型


首先是趋势模型 g(t)。

在 Prophet 算法里,趋势模型有两个选择,一个是基于饱和增长模型 (saturating growth model),另一个是基于分段线性函数 (piecewise linear model)。


3.1.1 饱和增长模型

Prophet 使用如下形式的饱和增长模型:



其中,C 为承载能力(如可上网人数、可处理事件等),k 为增长率,m 为偏移参数。

当 C=1,k=1,m=0 时就是大家常见的 Sigmoid 函数的形式。

在现实生活中,承载能力、增长率和偏移参数并不是一成不变的,所以作者将其转换为随时间变化的函数:


除此之外,现实中的时间序列其走势也不是不变的,在某些特定的时候会发生改变,这就需要用户去研究变点检测 (change points)。

在 Prophet 中,变点的位置是需要设置的,每一段的趋势和走势也会随着变点的设置而改变。目前有两种方法去设置变点,一种是人工指定的方式,另一种是通过算法来自动选择。
‍‍‍
‍‍‍‍‍假设现在有 S 个变点,变点的时间戳为 , 每个变点都会出现增长率的变化  。如果初始增长率为 k 的话,那么时间戳 t 上的增长率为:


其中为指示函数:


一旦初始增长率 k 确定,那么偏移参数 m 也会随之确定。

既然是分段函数,我们也需要处理好分段边界:


所以分段逻辑回归模型为:


此外我们含有一个重要参数 C(t),该参数需要用户根据市场规模来进行调整。

3.1.2 分段线性模型

我们再来看一下分段线性函数,根据给出基本模型:


其中 k 表示增长率,表示增长率的变化量,m 为偏移参数,


值得注意的是,分段线性函数并没有表示承载能力的参数。

3.1.3 序列中的变点

变点可以由分析师人工设定,相应的参数有变点的位置、个数、增长的变化率。

当然,也可以根据候选对象进行自动选择。自动选择主要是利用了先验知识
,参数控制模型变换的灵活性,当趋于 0 时,增长函数将蜕变为 Logistic 函数或者线性函数。默认情况下,Prophet 会在时间序列前 80% 的范围里,通过等份的方法找到 25 个变点,而变点的增长率满足 Laplace 分布


3.1.4 趋势预测

现在,历史 T 个数据点中有 S 个变点,且对应的增长率的变化量服从
,但预测未来也需要考虑未来的变点位置。

作者通过历史数据推断出方差,从而替换来模拟未来的速率变化。在一个完全贝叶斯框架下,可以通过先验知识来获得它的后验概率,或者我们也可以用最大似然估计来评估速率尺度参数:


未来变点位置将通过随机抽样的方法使变点的平均频率与历史数据相匹配:


因此,我们保证了未来和历史具有相同平均频率和变点变化率,从而衡量预测未来趋势中的不确定性,一旦从数据中推断出了 λ ,我们便可以使用生成模型来模拟未来可能的趋势,并使用模拟的趋势来计算不确定区间。

3.2 季节性模型


季节性(这里指周期性)是大部分时间序列都会考虑其中的,因为时间序列通常会随着天、周、月、年等的变化而呈现周期性变化。为了拟合和预测这些数据,作者制定了季节模型。

作者利用傅立叶级数来提供一个灵活的周期性影响:


其中,P 为周期(一年 P=365.25,一个星期 P=7);N 为经验所得(年 N=10,周N=3)。

我们另傅立叶级数的参数为
,则可以用这个来构造一个季节性向量矩阵。

例如当 N=10 时:


季节项表示为:


作者用标准化对参数进行初始化, σ 为可设置参数,值越大,季节效应越明显;值越小,季节效应越不明显。

3.3 节假日和突发事件模型


除了季节性影响,节假日或者某些事件也会对时间序列产生很大的冲击,并且往往也不遵循周期模式。所以我们需要单独的拿出来进行设置。

Prophet 允许用户设置过去和未来的假日或者事件,并且设置节假日影响的时间长短。

考虑回归矩阵:


其中,为指示函数。

于是,我们便有:


其中,。v 可以自行设置,默认为10,值越大,节假日对模型的影响越大;值越小,节假日对模型的影响越小。

3.4 模型拟合


通过上面的趋势、季节和事件后,我们便可以将其通过加法模型进行累加:


作者使用 pyStan 中的 L-BFGS 方法来对函数进行优化拟合。

下图展示了一周的周期性:


下图展示了 Prophet 拟合过去值和预测未来值的效果:


下图为数据的分解,包括趋势、周期(周、年):


放一个 Prophet 与其他模型的精度对比:


4 代码实践


我们使用沃尔玛股票的历史数据来进行分析。
import pandas as pdfrom fbprophet import Prophetimport matplotlib.pyplot as plt
wmt = pd.read_csv('data/WMT.csv', usecols=[0, 5])
# 看一下数据wmt.head().append(wmt.tail())
(左右滑动查看全部内容)


# 需要修改为制定列名wmt.columns = ['ds','y']wmt.head()


# 画图wmt.set_index(['ds']).plot(figsize=(18,7))
(左右滑动查看全部内容)


# 初始化模型m = Prophet()
# 拟合数据m.fit(wmt)
# 准备预测值,我们要预测未来一年future = m.make_future_dataframe(periods=365)future.tail()
(左右滑动查看全部内容)


# 预测数据forecast = m.predict(future)# 画出预测图:m.plot(forecast)


# 画出时间序列的分量m.plot_components(forecast)


这里做的比较简单,还有很多参数没有加。


给出调参经验:

  • Capacities:用户可以通过调整该参数,来适配经验所得的容纳量;

  • Change points:直接指定变点;

  • Holidays and seasonality:调整节假日与事件及其影响;

  • Smoothing parameters:通过调整来控制模型增长率的全局或者局部平滑;季节性和假日的平滑参数可以来估计未来的季节性变化。


5 总结


简单做个总结:Prophet 是 Facebook 开源的自动化预测的时间序列模型,其非常简单且速度非常快。Prophet 基于线性可加模型,分量包括趋势、季节性、节假日效应及误差。其非常适用于具有强烈季节效应的时间序列任务。Prophet 简单之处还表现于对缺失值和异常点的健壮性,即使是不懂时间序列建模的人员也可以很快上手。

Prophet 有以下优势:

  • 速度快且性能好:Prophet 已经应用于 Facebook 的许多场景并提供可靠的预测。在大多数情况下,它的效果都比其他方法要好;
  • 全自动:Prophet 对于异常值、丢失的数据具有健壮性,可以对杂乱的数据进行合理的预测,无需人工介入;
  • 灵活性高:Prophet 程序为用户提供了许多调整接口,可以通过添加领域知识来改进预测;
  • 简单方便:可以使用 Python 或者 R,非常方便。

但 Prophet 也有以下局限:

  • 无法人为加特征;
  • 模型过于简单,常常处于欠拟合状态;
  • 不适合长期预测。

6 参考资料


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

[2] Github: Prophet

[3] Intro to Facebook Prophet



来扫我呀



关于我“


将门是一家以专注于发掘、加速及投资技术驱动型创业公司的新型创投机构,旗下涵盖将门创新服务、将门技术社群以及将门创投基金。将门成立于2015年底,创始团队由微软创投在中国的创始团队原班人马构建而成,曾为微软优选和深度孵化了126家创新的技术型创业公司。


将门创新服务专注于使创新的技术落地于真正的应用场景,激活和实现全新的商业价值,服务于行业领先企业和技术创新型创业公司。


将门技术社群专注于帮助技术创新型的创业公司提供来自产、学、研、创领域的核心技术专家的技术分享和学习内容,使创新成为持续的核心竞争力。


将门创投基金专注于投资通过技术创新激活商业场景,实现商业价值的初创企业,关注技术领域包括机器智能物联网、自然人机交互企业计算在近四年的时间里,将门创投基金已经投资了包括量化派、码隆科技、禾赛科技宽拓科技、杉数科技、迪英加科技等数十家具有高成长潜力的技术型创业公司。


如果您是技术领域的初创企业,不仅想获得投资,还希望获得一系列持续性、有价值的投后服务,欢迎发送或者推荐项目给“门”: 

bp@thejiangmen.com

    

点击右上角,把文章分享到朋友圈
 

将门创投

让创新获得认可!

微信:thejiangmen

bp@thejiangmen.com


点击“❀在看”,让更多朋友们看到吧~