预测是一项常见的数据科学任务,可帮助组织进行容量规划,目标设置和异常检测。 尽管它很重要,但是要生成可靠的高质量预测仍面临着严峻的挑战,尤其是在存在各种时间序列且具有时间序列建模专业知识的分析师相对较少的情况下。 为了解决这些挑战,描述了一种实用的“大规模”预测方法,该方法将可配置模型与环路分析员绩效分析相结合。论文中提出了一种模块化回归模型,该模型具有可解释的参数,可以由具有分析能力的分析师直观地调整有关时间序列的知识,描述绩效分析以比较和评估预测程序,并自动为预测进行人工审查和调整,帮助分析师最有效地利用其专业知识的工具可以对业务时间序列进行可靠,实用的预测。
业务预测问题种类繁多,但是其中一些具有许多共同点。 下图显示了Facebook活动的代表性Facebook时间序列。Facebook用户可以使用“事件”平台以各种方式创建事件页面,邀请其他人以及与事件进行交互。 下图显示了在Facebook上创建的事件数的每日数据。 在这个时间序列中,有几个明显的季节性影响:每周和每年的周期,以及圣诞节和新年前后的明显下降。 这些类型的季节性影响自然而然地出现,并且可以在人类行为产生的时间序列中预期到。 时间序列还显示了过去六个月中趋势的明显变化,可能会在受新产品或市场变化影响的时间序列中出现。 最后,实际数据集通常具有离群值,并且此时间序列也不例外。
此时间序列的特征代表了许多业务时间序列:多个强烈的季节性因素,趋势变化,离群值和假日影响。
以下显示了R语言中预测包中几种自动化程序对上述时间序列进行的预测结果:
上图中采用的方法分别是:auto.arima,它是一系列的ARIMA模型(AR,MA等)并且会自动选择拟合数据最好的那个模型;ets,指数平滑模型;snaive,一个随机游走模型,可以每周进行季节性预测;tbats,一个具有每周和每年季节性的TBATS模型。
上图中的方法通常很难产生于这些时间序列的特征相匹配的预测,当截止期附近的趋势发生变化,ARIMA的自动预测容易出现大的趋势误差且无法捕获任何季节性趋势。指数平滑法和snaive预测捕获了每周的季节性,但却错过了长期的季节性。 所有方法对年末下降反应过度,因为它们不能充分模拟年度季节性。
当预测不佳的时候,我们希望能够针对当前问题调整参数,调整这些参数需要彻底了解基础时间序列模型是如何工作的。例如,自动ARIMA的输入参数是求差的最大阶数,自回归分量和移动平均值分量。这些往往是难以扩展的专业知识类型。
现在,描述一个时间序列预测模型----Prophet,该模型旨在处理上图中的业务时间序列的共同特征,并且该模型还具有直观的参数,可以在不了解底层模型细节的情况下进行调整,这对于分析人员有效的的调整模型参数至关重要。
首先使用一个时间序列分解模型,将时间序列分成三个主要模型组成部分:趋势、季节性和假日:
是我们的原始之间序列数据;是趋势函数,可对时间序列值的非周期性变化进行建模;代表周期性变化(例如,每周和每年的季节性变化);表示假期的影响,这些假期可能在一天内或者多天之内出现不定期的时间;误差项表示任何不适应模型的特有变化,假设其为正态分布。
该规范与广义加性模型(GAM)相似,该模型是一类具有潜在非线性平滑器的回归模型。
优点:
1). 灵活性:可以轻松的适应多个时期的季节性变化,并让分析师对趋势做出不同的假设;
2). 与ARIMA模型不同,测量结果无需规则间隔,并且不需要内插缺失值,以及处理异常值
3). 拟合非常快,允许分析师以交互方式探索许多模型规范;
4). 预测模型中的参数易于解释,分析师可以更改这些参数以对预测施以假设,此外,分析人员通常具有回归经验,能够轻松扩展模型以容纳新的组件。
以下介绍对分解序列中的处理。
已经实现了涵盖许多Facebook应用程序的两个趋势模型:饱和增长模型和分段线性模型。
1. 非线性、饱和增长模型
在Facebook上对增长进行建模通常类似于自然生态系统中的人口增长,其中非线性增长以承载能力达到饱和。例如,特定区域内Facebook中用户量的承载能力可能是可以访问Internet的人数,这种增长模型通常使用逻辑增长模型来建模,其最基本的形式是:
其中C为承载能力,k为增长率,m为偏移参数。
注意:承载能力不是恒定的(随着世界上可以使用互联网的人数增加,增长上线也会随机增加),因此,固定容量C替换为随时间变化的容量C(t);另外,增长率也不是很定的,新铲平可以极大的改变一个地区的增长率,因为,该模型必须能够合并变化的增长率以获取历史数据。
通过明确定义允许增长率变化的变化点,将趋势变化纳入增长模型。则分段逻辑增长为:
依靠傅里叶级数来提供周期效应的可行模型,假设P是我们希望时间序列具有的常规时间段(例如,当以天为单位缩放时间变量时,年度数据P=365或者每周数据为P=7)。用以下标准傅里叶级数近似任意平滑的季节性效应:
假期和事件给许多业务时间序列带来了巨大的,可预测的冲击,并且通常不遵循周期性模式,因此,其效果不能通过平稳的周期很好地建模。特定假期对时间序列的影响通常年复一年,因此将其纳入预测很重要。以下为一些节假日期。
通过假设假日的影响是独立的,可以很容易的将该假日列表纳入模型中,对于每个假期i,令为该假期的过去和将来日期。增加一个指标函数,用以表示时间t是否在假期i起见,并为每个假期分配了一个参数(表示在预测中的相对变化):
并且:
其中。
这里的具体内容建议去看源代码。
以上是拟合的结果,对比于前面几种方法,发现Prophet预测模型更加准确。以下是上图中预测的各个组件。
论文链接:https://peerj.com/preprints/3190/
源码链接:https://github.com/facebook/prophet
官方网站:https://facebook.github.io/prophet/
更加详细解释:https://www.zhihu.com/question/56585493