💡说明

安装

快速开始

饱和预测

趋势变化点

季节性、假日效应和额外回归

不确定区间

异常值

非日数据

模型诊断

https://facebook.github.io/prophet/docs/diagnostics.html

模型诊断

Prophet包括时间序列交叉验证(cross validation)的功能,以使用历史数据测量预测误差。这是通过选择历史上的截止点来实现的,对于每个截止点,只使用到该截止点的数据来拟合模型,然后我们可以将预测值与实际值进行比较。然后我们可以将预测值与实际值进行比较。本图展示了对佩顿-曼宁数据集的模拟历史预测,模型被拟合到5年的初始历史中,并在一年的时间范围内进行预测。

https://facebook.github.io/prophet/static/diagnostics_files/diagnostics_3_0.png

png

Prophet论文对模拟历史预测做了进一步的描述。

这个交叉验证过程可以使用cross_validation函数对一系列历史截止日期自动完成。我们指定预测范围(horizon),然后选择初始训练期的大小(initial)和截止日期之间的间隔(period)。默认情况下,初始训练期设置为horizon的三倍,每半个horizon进行一次截断。

cross_validation的输出是一个dataframe,其中包括每个模拟预测日期和每个截止日期的真实值y和样本外预测值yhat。特别地,对 cutoffcutoff + horizon之间的每个观测点进行预测。然后,可利用这一数据框架计算 yhaty的误差测量。

.

在这里,我们做交叉验证来评估365天的horizon上的预测性能,从第一个截止点的730天的训练数据开始,然后每180天做一次预测。在这个8年的时间序列上,这相当于11次总的预测。

# Rdf.cv <- cross_validation(m, initial = 730, period = 180, horizon = 365, units = 'days')head(df.cv)
# Pythonfrom fbprophet.diagnostics import cross_validationdf_cv = cross_validation(m, initial='730 days', period='180 days', horizon = '365 days')
# Pythondf_cv.head()

Untitled Database

在R中,参数 units 必须是as.difftime接受的类型,即周或更短。在Python中,initial, periodhorizon 的字符串应该是Pandas Timedelta使用的格式,它接受天或更短的单位。

自定义截止日期也可以以日期列表的形式提供给Python和R中cross_validation函数中的cutoffs关键字,例如,三个截止日期相隔6个月,需要传递给cutoffs参数,日期格式如下:

# Rcutoffs <- as.Date(c('2013-02-15', '2013-08-15', '2014-02-15'))df.cv2 <- cross_validation(m, cutoffs = cutoffs, horizon = 365, units = 'days')
# Pythoncutoffs = pd.to_datetime(['2013-02-15', '2013-08-15', '2014-02-15'])df_cv2 = cross_validation(m, cutoffs=cutoffs, horizon='365 days')

performance_metrics实用程序可用于计算预测性能的一些有用统计数据(yhatyhat_loweryhat_uppery相比),作为与截止点的距离(预测在未来多远)的函数。计算的统计数字是平均平方误差(MSE)、平均平方根误差(RMSE)、平均绝对误差(MAE)、平均绝对百分比误差(MAPE)、中位绝对百分比误差(MDAPE)和yhat_loweryhat_upper估计的覆盖率。这些都是在按地平线排序(dscutoff)后,在df_cv中的预测的滚动窗口上计算的。默认情况下,每个窗口将包括10%的预测,但可以用rolling_window参数改变。

# Rdf.p <- performance_metrics(df.cv)head(df.p)
# Pythonfrom fbprophet.diagnostics import performance_metricsdf_p = performance_metrics(df_cv)df_p.head()

Untitled Database

交叉验证性能指标可以用plot_cross_validation_metric进行可视化,这里显示的是MAPE。点表示df_cv中每个预测的绝对误差百分比。蓝线显示的是MAPE,其中平均值是在点的滚动窗口上取的。我们看到,对于这种预测,对于未来一个月的预测,典型的误差是5%左右,对于一年后的预测,误差增加到11%左右。

# Rplot_cross_validation_metric(df.cv, metric = 'mape')
# Pythonfrom fbprophet.plot import plot_cross_validation_metricfig = plot_cross_validation_metric(df_cv, metric='mape')

https://facebook.github.io/prophet/static/diagnostics_files/diagnostics_16_0.png

png

图中滚动窗口的大小可以通过可选的参数rolling_window来改变,它指定了每个滚动窗口中使用的预测比例。默认值是0.1,相当于每个窗口中包含的 df_cv行的10%;增加这个比例将使图中的平均曲线更加平滑。initial 期应该足够长,以捕获模型的所有组成部分,特别是季节性因素和额外的回归因子:年季节性至少一年,周季节性至少一周,等等。

并行交叉验证

交叉验证也可以在Python中以并行模式运行,通过设置指定parallel关键字。支持四种模式

对于不太大的问题,我们建议使用parallel="process"。如果能在一台机器上完成并行交叉验证,将达到最高性能。对于大型问题,可以使用Dask集群在多台机器上进行交叉验证。你需要单独安装Dask,因为它不会和fbprophet一起安装。

from dask.distributed import Clientclient = Client()  # connect to the clusterdf_cv = cross_validation(m, initial='730 days', period='180 days', horizon='365 days',                         parallel="dask")

超参数调整

交叉验证可用于调整模型的超参数,如 changepoint_prior_scaleseasonality_prior_scale。下面给出了一个Python例子,这两个参数的网格为4x4,在截止点上进行并行化。这里的参数是以30天范围内的RMSE平均值来评估的,但不同的性能指标可能适合不同的问题。

# Pythonimport itertoolsimport numpy as npimport pandas as pdparam_grid = {    'changepoint_prior_scale': [0.001, 0.01, 0.1, 0.5],    'seasonality_prior_scale': [0.01, 0.1, 1.0, 10.0],}# Generate all combinations of parametersall_params = [dict(zip(param_grid.keys(), v)) for v in itertools.product(*param_grid.values())]rmses = []  # Store the RMSEs for each params here# Use cross validation to evaluate all parametersfor params in all_params:    m = Prophet(**params).fit(df)  # Fit model with given params    df_cv = cross_validation(m, cutoffs=cutoffs, horizon='30 days', parallel="processes")    df_p = performance_metrics(df_cv, rolling_window=1)    rmses.append(df_p['rmse'].values[0])# Find the best parameterstuning_results = pd.DataFrame(all_params)tuning_results['rmse'] = rmsesprint(tuning_results)
 changepoint_prior_scale  seasonality_prior_scale      rmse
0                     0.001                     0.01  0.757489
1                     0.001                     0.10  0.745049
2                     0.001                     1.00  0.753315
3                     0.001                    10.00  0.763111
4                     0.010                     0.01  0.536260
5                     0.010                     0.10  0.538103
6                     0.010                     1.00  0.544326
7                     0.010                    10.00  0.520970
8                     0.100                     0.01  0.524669
9                     0.100                     0.10  0.521302
10                    0.100                     1.00  0.520692
11                    0.100                    10.00  0.515338
12                    0.500                     0.01  0.532103
13                    0.500                     0.10  0.528939
14                    0.500                     1.00  0.525256
15                    0.500                    10.00  0.524619
# Pythonbest_params = all_params[np.argmin(rmses)]print(best_params)
{'changepoint_prior_scale': 0.1, 'seasonality_prior_scale': 10.0}

另外,也可以通过上面的循环并行化来实现跨参数组合的并行化。

Prophet模型有许多输入参数,可以考虑对其进行调整。下面是一些超参数调整的一般建议,可能不错呦。

可调整的参数

也许可以调整的参数

可能不要被调整的参数