先展示效果:


Facebook 时间序列预测算法 Prophet 的研究
Prophet 简介
Facebook 去年开源了一个时间序列预测的算法,叫做 fbprophet,它的官方网址与基本介绍来自于以下几个网站:
Github:https://github.com/facebook/prophet
官方网址:https://facebook.github.io/prophet/
论文名字与网址:Forecasting at scale,https://peerj.com/preprints/3190/
从官网的介绍来看,Facebook 所提供的 prophet 算法不仅可以处理时间序列存在一些异常值的情况,也可以处理部分缺失值的情形,还能够几乎全自动地预测时间序列未来的走势。从论文上的描述来看,这个 prophet 算法是基于时间序列分解和机器学习的拟合来做的,其中在拟合模型的时候使用了 pyStan 这个开源工具,因此能够在较快的时间内得到需要预测的结果。除此之外,为了方便统计学家,机器学习从业者等人群的使用,prophet 同时提供了 R 语言和 Python 语言的接口。从整体的介绍来看,如果是一般的商业分析或者数据分析的需求,都可以尝试使用这个开源算法来预测未来时间序列的走势。
Prophet 的算法原理
Prophet 数据的输入和输出
首先让我们来看一个常见的时间序列场景,黑色表示原始的时间序列离散点,深蓝色的线表示使用时间序列来拟合所得到的取值,而浅蓝色的线表示时间序列的一个置信区间,也就是所谓的合理的上界和下界。prophet 所做的事情就是:
1、输入已知的时间序列的时间戳和相应的值;
2、输入需要预测的时间序列的长度;
3、输出未来的时间序列走势。
4、输出结果可以提供必要的统计指标,包括拟合曲线,上界和下界等。
就一般情况而言,时间序列的离线存储格式为时间戳和值这种格式,更多的话可以提供时间序列的 ID,标签等内容。因此,离线存储的时间序列通常都是以下的形式。其中 date 指的是具体的时间戳,category 指的是某条特定的时间序列 id,value 指的是在 date 下这个 category 时间序列的取值,label 指的是人工标记的标签(‘0’ 表示异常,'1‘ 表示正常,‘unknown’ 表示没有标记或者人工判断不清)。


而 fbprophet 所需要的时间序列也是这种格式的,根据官网的描述,只要用 csv 文件存储两列即可,第一列的名字是 ‘ds’, 第二列的名称是 ‘y’。第一列表示时间序列的时间戳,第二列表示时间序列的取值。通过 prophet 的计算,可以计算出 yhat,yhat_lower,yhat_upper,分别表示时间序列的预测值,预测值的下界,预测值的上界。两份表格如下面的两幅图表示。
Prophet 的算法实现

趋势项模型 [公式]





在 Prophet 里面,是需要设置变点的位置的,而每一段的趋势和走势也是会根据变点的情况而改变的。在程序里面有两种方法,一种是通过人工指定的方式指定变点的位置;另外一种是通过算法来自动选择。在默认的函数里面,Prophet 会选择 n_changepoints = 25 个变点,然后设置变点的范围是前 80%(changepoint_range),也就是在时间序列的前 80% 的区间内会设置变点。通过 forecaster.py 里面的 set_changepoints 函数可以知道,首先要看一些边界条件是否合理,例如时间序列的点数是否少于 n_changepoints 等内容;其次如果边界条件符合,那变点的位置就是均匀分布的,这一点可以通过 np.linspace 这个函数看出来。
m = Prophet(growth='logistic')
df['cap'] = 6
m.fit(df)
future = m.make_future_dataframe(periods=prediction_length, freq='min')
future['cap'] = 6
变点的选择(Changepoint Selection)

对未来的预估(Trend Forecast Uncertainty)
从历史上长度为 [公式] 的数据中,我们可以选择出 [公式] 个变点,它们所对应的增长率的变化量是 [公式] 。此时我们需要预测未来,因此也需要设置相应的变点的位置,从代码中看,在 forecaster.py 的 sample_predictive_trend 函数中,通过 Poisson 分布等概率分布方法找到新增的 changepoint_ts_new 的位置,然后与 changepoint_t 拼接在一起就得到了整段序列的 changepoint_ts。
changepoint_ts_new = 1 + np.random.rand(n_changes) * (T - 1)
changepoint_ts = np.concatenate(

Facebook的Prophet是一款开源的时间序列预测算法,它能处理异常值和部分缺失值,适用于商业分析和数据分析。Prophet基于时间序列分解和机器学习,内置PyStan用于快速拟合,并提供R和Python接口。算法包括趋势项、季节性、节假日效应等组件,通过自动或手动设置变点来适应数据变化。用户可调整参数如变点数量、季节性周期等。Prophet的使用涉及数据预处理、模型训练和预测,其结果包括预测值及置信区间。适用于具有明显趋势或周期性的时间序列预测。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



