%matplotlib inline
from fbprophet import Prophet
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
import logging
logging.getLogger('fbprophet').setLevel(logging.ERROR)
import warnings
warnings.filterwarnings("ignore")
df = pd.read_csv('examples/example_wp_log_peyton_manning.csv')
df = df.loc[:180,] # Limit to first six months
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=60)
默认情况下,Prophet将返回预测的不确定性区间–yhat
。这些不确定性区间背后有几个重要的假设。
预测中存在三个不确定性来源:趋势的不确定性,季节性估计的不确定性以及额外的观测噪声。
趋势中的不确定性
预测中最大的不确定性来源是未来趋势的变化。我们在本文档中已经看到的时间序列显示了历史上明显的趋势变化。Prophet能够发现和适应这些,但我们预期的趋势变化会是什么?我们无法确切地知道,所以我们做了最合理的事情–我们假设未来会看到与历史相似的趋势变化。特别是,我们假设未来趋势变化的平均频率和幅度将与我们在历史中观察到的相同。我们预测这些趋势变化并通过计算它们的分布来获得不确定性区间。
这种测量不确定性的方法之一是通过增加changepoint_prior_scale
来允许更高的灵活性,这将增加预测的不确定性。这是因为如果我们在历史中模拟更多的变化,那么我们将来期望未来更多的不确定性,并使不确定性区间成为过度拟合的有用指标。
可以使用参数设置不确定区间的宽度(默认为80%)interval_width
:
forecast = Prophet(interval_width=0.95).fit(df).predict(future)
同样,这些区间假设未来将看到与过去相同的频率变化频率和幅度。这种假设可能不正确,因此您不应期望在这些不确定区间内得到准确的覆盖。
季节性的不确定性
默认情况下,Prophet只会返回趋势和观察噪声的不确定性。为了获得季节性的不确定性,您必须进行完整的贝叶斯抽样。这是使用参数mcmc.samples
(默认为0)完成的。我们在这里用快速启动例子中的Peyton Manning数据的前六个月做示范:
m = Prophet(mcmc_samples=300)
forecast = m.fit(df).predict(future)
WARNING:pystan:n_eff / iter for parameter beta_m[1] is nan!
WARNING:pystan:n_eff / iter for parameter beta_m[2] is nan!
WARNING:pystan:n_eff / iter for parameter beta_m[3] is nan!
WARNING:pystan:n_eff / iter for parameter beta_m[4] is nan!
WARNING:pystan:n_eff / iter for parameter beta_m[5] is nan!
WARNING:pystan:n_eff / iter for parameter beta_m[6] is nan!
WARNING:pystan:n_eff / iter below 0.001 indicates that the effective sample size has likely been overestimated
WARNING:pystan:Rhat for parameter beta_m[1] is nan!
WARNING:pystan:Rhat for parameter beta_m[2] is nan!
WARNING:pystan:Rhat for parameter beta_m[3] is nan!
WARNING:pystan:Rhat for parameter beta_m[4] is nan!
WARNING:pystan:Rhat for parameter beta_m[5] is nan!
WARNING:pystan:Rhat for parameter beta_m[6] is nan!
WARNING:pystan:Rhat above 1.1 or below 0.9 indicates that the chains very likely have not mixed
这用MCMC采样取代了的型MAP估计,并且可能需要更长的时间,具体取决于有多少观测值 - 期望几分钟而不是几秒钟。如果您进行完整采样,那么在绘制它们时,您将看到季节性成分的不确定性:
fig = m.plot_components(forecast)
您可以使用m.predictive_samples(future)
方法在Python中访问原始后验预测样本。
PyStan for Windows中存在问题,这使得MCMC采样速度极慢。Windows中MCMC采样的最佳选择是在Linux VM中使用R或Python。