ここまでモデルの改善を進めてきたのですが、目で予測値と実測値を比較して行ってきました。 これはもう少し機械的にしたくなります。
そこでProphetに用意されている、クロスバリデーション/評価指標のメソッドが使用します。
コード
from fbprophet.diagnostics import cross_validation from fbprophet.diagnostics import performance_metrics #開始点、CV df_cv = cross_validation(mdl, initial='240 days', period='30 days', horizon = '5 days')
モデルとデータを渡すと、cv用の分割と評価用の結果を返してくれます。
パラメータはこんな感じです。
initial
:学習データの範囲horizon
:テストデータの1頻度の範囲period
:テストデータを作る頻度
このデータをperformance_metrics
に渡すことで、cutoff×horizonごとの評価の平均を算出することができます。
df_p = performance_metrics(df_cv) #可視化 df_p[['horizon','mse','rmse','mae','mape']].set_index('horizon').T.plot.barh()
複数のモデルを評価する
上記とforを用いることで各種モデルの評価を知ることができます。
#一つのデータで複数のモデルを試す場合 params = [ { "yearly_seasonality":False, "weekly_seasonality":True, "daily_seasonality":False, }, #... ] mdls = [Prophet(**p) for p in params] #add_xxx系 for i,m in enumerate(mdls): if i >= 3: m.add_seasonality(name = '_25',period=25,fourier_order=10) #... #フィッティング preds = [] for m in mdls: m.fit(mdl_df) future = m.make_future_dataframe(periods=0,freq='D') future['cap'] = 2 pred = m.predict(future) pred.append(pred) # 評価 metrics = [] for m in mdls: df_cv = cross_validation(m, initial='120 days', period='30 days', horizon = '30 days') df_p = performance_metrics(df_cv) tmp = df_p[['mse','rmse','mae','mape']].mean() metrics.append(tmp) #可視化 res = pd.concat(metrics,axis=1) res.plot.bar()