あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

pythonでProphetを使いたい(7:モデルの評価を行いたい

ここまでモデルの改善を進めてきたのですが、目で予測値と実測値を比較して行ってきました。 これはもう少し機械的にしたくなります。

そこで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()

f:id:esu-ko:20200913174036p:plain

複数のモデルを評価する

上記と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()

f:id:esu-ko:20200913174130p:plain