Prophet⽂档中⽂翻译--diagnostics
%matplotlib inline
from fbprophet import Prophet
import pandas as pd
from matplotlib import pyplot as plt
import logging
import warnings
warnings.filterwarnings("ignore")
df = pd.read_csv('examples/example_wp_log_peyton_manning.csv')
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=366)
Prophet包括时间序列交叉验证功能,以使⽤历史数据测量预测误差。这是通过选择历史中的截⽌点来完成的,并且对于每个截⽌点,使⽤截⽌点之前的数据拟合模型。然后我们可以将预测值与实际值进⾏⽐较。该图说明了Peyton Manning数据集的模拟历史预测,其中该模型⽤5年历史数据训练模型,并且在接下来的⼀年的时间范围内进⾏预测。
from fbprophet.diagnostics import cross_validation
df_cv = cross_validation(
m,'365 days', initial='1825 days', period='365 days')
cutoff = df_cv['cutoff'].unique()[0]
df_cv = df_cv[df_cv['cutoff'].values == cutoff]
fig = plt.figure(facecolor='w', figsize=(10,6))
ax = fig.add_subplot(111)
ax.plot(m.history['ds'].values, m.history['y'],'k.')
fontweight属性boldax.plot(df_cv['ds'].values, df_cv['yhat'], ls='-', c='#0072B2')
ax.fill_between(df_cv['ds'].values, df_cv['yhat_lower'],
df_cv['yhat_upper'], color='#0072B2',
alpha=0.2)
ax.axvline(_datetime(cutoff), c='gray', lw=4, alpha=0.5)
ax.set_ylabel('y')
ax.set_xlabel('ds')
<(_datetime('2010-01-01'),y=12, s='Initial', color='black',
fontsize=16, fontweight='bold', alpha=0.8)
<(_datetime('2012-08-01'),y=12, s='Cutoff', color='black',
fontsize=16, fontweight='bold', alpha=0.8)
ax.axvline(_datetime(cutoff)+ pd.Timedelta('365 days'), c='gray', lw=4,
alpha=0.5, ls='--')
<(_datetime('2013-01-01'),y=6, s='Horizon', color='black',
fontsize=16, fontweight='bold', alpha=0.8);
进⼀步描述了模拟历史预测。
可以使⽤cross_validation函数⾃动为⼀系列历史截⽌值完成此交叉验证过程。我们指定预测范围(horizon),然后可选地指定初始训练期(initial)的⼤⼩和截⽌⽇期(period)之间的间隔。默认情况下,初始训练周期设置为预测范围的三倍,并且每半个预测周期进⾏⼀次截⽌。
cross_validation的输出是⼀个数据框,其中包含真实值y和在每⼀个截⽌点(cutoff)对应的每⼀个预测值yhat及其置信区间(原句:The output of cross_validation is a dataframe with the true values y and the out-of-sample forecast values yhat, at each simulated forecast date and for each cutoff date)。特别是,对截⽌点(cutoff)和截⽌点+预测范围之间的每个观察点进⾏预测。然后可以使⽤该数据帧来计算yhat与y的误差测量值。
在这⾥,我们进⾏交叉验证,以评估365天的预测性能,⽤730天的训练数据然后设置第⼀个截⽌点,然后每180天进⾏⼀次预测。在这8年的时间序列中,这相当于11个总预测。
from fbprophet.diagnostics import cross_validation
df_cv = cross_validation(m, initial='730 days', period='180 days', horizon ='365 days')
df_cv.head()
ds yhat yhat_lower yhat_upper y cutoff
02010-02-168.9546948.4491369.4495508.2424932010-02-15
12010-02-178.7210648.1996649.2337328.0080332010-02-15
22010-02-188.6047308.1310169.1281008.0452682010-02-15
32010-02-198.5265438.0396539.0285877.9287662010-02-15
42010-02-208.2684147.8206738.7872857.7450032010-02-15
在Python中,initial,period和horizon的字符串应采⽤Pandas Timedelta使⽤的格式,该格式接受天或更短的单位。
performance_metrics⽅法可⽤于计算预测性能的⼀些有⽤统计数据(yhat,yhat_lower和yhat_upper与y作⽐较),这个函数计算从截⽌点开始包含整个预测范围的的统计量(原句:The performance_metrics utility can be used to compute some useful statistics of the prediction performance (yhat, yhat_lower, and yhat_upper compared to y), as a function of the distance from the cutoff (how far into the future the prediction was).)。计算的统计量是均⽅误差(MSE),均⽅根
误差(RMSE),平均绝对误差(MAE),平均绝对百分⽐误差(MAPE)以及yhat_lower和yhat_upper估计的覆盖范围。这些是按范围排序(ds减去cutoff),然后
在df_cv数据框中的滚动时间序列窗⼝计算统计量。默认情况下,每个窗⼝中都会包含10%的预测,但可以使⽤rolling_window参数进⾏更改。
from fbprophet.diagnostics import performance_metrics
df_p = performance_metrics(df_cv)
df_p.head()
horizon mse rmse mae mape coverage
329737 days0.4806200.6932670.5014300.0581790.683417
3537 days0.4796410.6925610.5005030.0580690.685930
220737 days0.4795810.6925180.5004150.0580630.685930
293437 days0.4800960.6928890.5014740.0581970.685930
39337 days0.4826790.6947510.5019000.0582990.685930
可以使⽤plot_cross_validation_metric⽅法显⽰交叉验证性能指标,此处显⽰为MAPE。点显⽰df_cv中每个预测的绝对百分⽐误差。蓝线显⽰MAPE,其中平均值取⾃点的滚动窗⼝。我们看到这个预测,对于未来⼀个⽉的预测,⼤约5%的典型的误差,并且对于⼀年的预测,误差增加到⼤约11%。
from fbprophet.plot import plot_cross_validation_metric
fig = plot_cross_validation_metric(df_cv, metric='mape')
可以使⽤可选参数rolling_window更改图中滚动窗⼝的⼤⼩,该参数指定在每个滚动窗⼝中使⽤的预测⽐例。默认值为0.1,对应于每个窗⼝中包含的df_cv的10%⾏数据;增加这将导致图中平均曲线更平滑。
initial阶段应该⾜够长,以捕获模型的所有组成部分,特别是季节性和额外的回归量:年季节性⾄少⼀年数据,周季节性⾄少⼀周数据。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论