12.2 Prophet(預言者)モデル

最近提案されたのが、Prophetモデルです。fable.prophetパッケージを通じて利用可能です。このモデルは元々は、週次と年次の季節性と祝日の影響がある、日次データを予測するために、Facebook (S. J. Taylor & Letham, 2018) が導入したものです。後に、より多くのタイプの季節性をカバーできるよう拡張されました。過去のデータに強い複数の季節性がある時系列で最も上手く機能します。

Prophetは、以下のような表記の非線形回帰モデル(7章)と考えることができます。 \[ y_t = g(t) + s(t) + h(t) + \varepsilon_t \] ただし、\(g(t)\)は区分線形トレンド(もしくは、「成長項」)を表し、\(s(t)\)はさまざまな季節パターンを表し、\(h(t)\)は祝日の影響を取り込み、\(\varepsilon_t\)はホワイトノイズの誤差項です。

  • 区分線形トレンドのノット(もしくは、変化点)は、明示的に指定しないと自動選択されます。ロジスティック関数を使ってトレンドの上限を設定することもできます。
  • 季節成分は関連する周期のフーリエ項から成ります。デフォルトでは、年次季節性には次数10、週次季節性には次数3が使われます。
  • 祝日の影響は単純なダミー変数として加えられます。
  • モデルはベイズのアプローチを使って推計され、変化点などのモデルの特徴は自動選択されます。

このアプローチを2つのデータセットを使って例示します。まず単純な四半期の事例を、次に前節で述べた電力需要の事例を示します。

事例: 四半期セメント生産量

単純な四半期の事例として、9.10節の分析を繰り返しましょう。ARIMAモデルとETSモデルを比較していましたが、今回はProphetモデルを加えます。

library(fable.prophet)
cement <- aus_production %>%
  filter(year(Quarter) >= 1988)
train <- cement %>%
  filter(year(Quarter) <= 2007)
fit <- train %>%
  model(
    arima = ARIMA(Cement),
    ets = ETS(Cement),
    prophet = prophet(Cement ~ season(period = 4, order = 2,
                                    type = "multiplicative"))
  )

四半期や月次のデータでは、季節項のperiodを完全な形で指定しなければならないことに留意してください。デフォルトでは、データは少なくとも日次に観測される、と想定されているからです。

fc <- fit %>% forecast(h = "2 years 6 months")
fc %>% autoplot(cement) +
  labs(level = "区間予測")
セメント生産量データの10四半期のテストセットでのProphetのETS、ARIMAとの比較

図 12.9: セメント生産量データの10四半期のテストセットでのProphetのETS、ARIMAとの比較

この事例では、Prophet予測はETSやARIMAの予測よりも悪くなりました。

fc %>% accuracy(cement)
#> # A tibble: 3 × 10
#>   .model  .type    ME  RMSE   MAE   MPE  MAPE  MASE RMSSE  ACF1
#>   <chr>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 arima   Test  -161.  216.  186. -7.71  8.68  1.27  1.26 0.387
#> 2 ets     Test  -171.  222.  191. -8.07  8.85  1.30  1.29 0.579
#> 3 prophet Test  -176.  248.  216. -8.36  9.89  1.47  1.44 0.699

事例: 30分ごとの電力需要

前節の動学的ハーモニック回帰(DHR)モデルと似たモデルを適合させますが、今回はProphetモデルを使います。日次や日次より細かいデータでは、デフォルトで周期が正しく指定されるので、以下のように単語を使って簡単に周期を指定できます。

fit <- elec %>%
  model(
    prophet(Demand ~ Temperature + Cooling + Working_Day +
            season(period = "day", order = 10) +
            season(period = "week", order = 5) +
            season(period = "year", order = 3))
  )
fit %>%
  components() %>%
  autoplot()
ビクトリア州電力需要データに適合させたProphetモデルの成分

図 12.10: ビクトリア州電力需要データに適合させたProphetモデルの成分

12.10は、当てはめたモデルのトレンド成分と季節成分です。

モデルの仕様は前節のDHRモデルにとても似ていますが、結果はいくつか重要な形で異なります。Prophetモデルは区分線形トレンドを加えますが、実はここでは不適切です。長期予測が、系列の終わりの方の下降線形トレンドに従い続けるとは考えづらいからです。

また、残差には、以下のようにかなりの自己相関が残っています。

fit %>% gg_tsresiduals()
ビクトリア州電力需要のProphetモデルからの残差

図 12.11: ビクトリア州電力需要のProphetモデルからの残差

結果として、区間予測はおそらく狭すぎます。

fc <- fit %>%
  forecast(new_data = elec_newdata)
fc %>%
  autoplot(elec %>% tail(10 * 48)) +
  labs(x = "日", y = "需要 (MWh)", level = "区間予測")
ビクトリア州電力需要のProphetモデルからの2日分の予測

図 12.12: ビクトリア州電力需要のProphetモデルからの2日分の予測

Prophetには、前節のDHRモデルと比べ推計がずっと速く、完全に自動化されている、という利点があります。しかし、これら2つの事例が示す通り、他の使えるアプローチよりも正確な予測になることはめったにありません。

参考文献

Taylor, S. J., & Letham, B. (2018). Forecasting at scale. The American Statistician, 72(1), 37–45. [DOI]