Prophet 之使用篇(五)——预测区间



0

本使用说明教程主要翻译整理自 Prophet 的官方说明文档之 “预测区间”

教程中使用的数据集可在 Prophet 的 github 主页 中的 examples 文件夹 内下载得到。

默认情况下, Prophet 的返回结果中会包括预测值 yhat 的预测区间。当然,预测区间的估计需建立在一些重要的假设前提下。

在预测时,不确定性主要来源于三个部分:趋势中的不确定性、季节效应估计中的不确定性和观测值的噪声影响。

趋势中的不确定性

预测中,不确定性最大的来源就在于未来趋势改变的不确定性。在之前教程中的时间序列实例中,我们可以发现历史数据具有明显的趋势性。 Prophet 能够监测并去拟合它,但是我们期望得到的趋势改变究竟会如何走向呢?或许这是无解的,因此我们尽可能地做出最合理的推断,假定 “未来将会和历史具有相似的趋势” 。尤其重要的是,我们假定未来趋势的平均变动频率和幅度和我们观测到的历史值是一样的,从而预测趋势的变化并通过计算,最终得到预测区间。

这种衡量不确定性的方法具有以下性质:变化速率灵活性更大时(通过增大参数 changepoint_prior_scale 的值),预测的不确定性也会随之增大。原因在于如果将历史数据中更多的变化速率加入了模型,也就代表我们认为未来也会变化得更多,就会使得预测区间成为反映过拟合的标志。

预测区间的宽度(默认下,是 80% )可以通过设置 interval_width 参数来控制:

1
2
3
4
# Python
m = Prophet(interval_width=0.95).fit(df)
future = m.make_future_dataframe(periods=365)
forecast = m.predict(future)
1
2
3
4
# R
m <- prophet(df, interval.width = 0.95)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)

由于预测区间估计时假定未来将会和过去保持一样的变化频率和幅度,而这个假定可能并不正确,所以预测区间的估计不可能完全准确。

季节效应中的不确定性

默认情况下, Prophet 只会返回趋势中的不确定性和观测值噪声的影响。你必须使用贝叶斯取样的方法来得到季节效应的不确定性,可通过设置 mcmc.samples 参数(默认下取 0 )来实现。下面使用 Prophet 之使用篇(一) 中佩顿 · 曼宁的数据为例:

1
2
3
4
# Python
m = Prophet(mcmc_samples=500).fit(df)
future = m.make_future_dataframe(periods=365)
forecast = m.predict(future)
1
2
3
4
# R
m <- prophet(df, mcmc.samples = 500)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)

上述代码将最大后验估计( MAP )取代为马尔科夫蒙特卡洛取样 ( MCMC ),并且将计算时间从 10 秒延长到 10 分钟。如果做了全取样,就能通过绘图看到季节效应的不确定性了:

1
2
# Python
m.plot_components(forecast);
1
2
# R
prophet_plot_components(m, forecast);


1


转载请注明来自 Vector Blog



当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器