接上…
Prophet 诊断
我们可以使用交叉验证、超参数调参来对模型进行诊断和调优。
交叉验证
我们需要确定预测期间(horizon),初始训练期间(initial)和这两者之间的时间跨度(period)。
df_store_2_item_28.shape
(1826, 2)
from fbprophet.diagnostics import cross_validation
df_cv = cross_validation(m, horizon='90 days')
# df_cv = cross_validation(m, initial='270 days', period='45 days', horizon = '90 days')
df_cv.head()
df_cv.tail()
from fbprophet.diagnostics import performance_metrics
df_p = performance_metrics(df_cv)
df_p.head()
from fbprophet.plot import plot_cross_validation_metric
plot3 = plot_cross_validation_metric(df_cv, metric='mae')
plot4 = plot_cross_validation_metric(df_cv, metric='mape')
上面第一张图中的蓝色线代表MAE;第二张图中蓝线代表MAPE,这两个均值是从每个点的滚动窗口中计算出来的。
超参调优
我们是否有方法使模型表现得更好呢?
可以使用网格搜索来进行超参数调优,下面我们将针对changepoint_prior_scale 和 seasonality_prior_scale进行参数搜索。前者决定了趋势的灵活性,也就是在趋势改变点上趋势变化多少,而后者控制了季节性的弹性。
import itertools
param_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 parameters
all_params = [dict(zip(param_grid.keys(), v)) for v in itertools.product(*param_grid.values())]
maes = [] # Store the MAE for each params here
mapes = [] # Store the MAPE for each params here
# Use cross validation to evaluate all parameters
for params in all_params:
m = Prophet(**params).fit(df_store_2_item_28) # Fit model with given params
df_cv = cross_validation(m, horizon='90 days')
df_p = performance_metrics(df_cv, rolling_window=1)
maes.append(df_p['mae'].values[0])
mapes.append(df_p['mape'].values[0])
# Find the best parameters
tuning_results = pd.DataFrame(all_params)
tuning_results['mae'] = maes
tuning_results['mape'] = mapes
…
tuning_results_df = pd.DataFrame(tuning_results)
tuning_results_df.sort_values(['mae','mape'])
tuning_results_df.sort_values(['mape','mae'])
我们选择产生最小的MAPE的参数。
best_params = all_params[np.argmin(mapes)]
print(best_params)
未完待续…