13.8 訓練セットとテストセットでの予測

典型的には、1期先予測は訓練データで(「当てはめ値」に当たります)、複数期先予測はテストデータで計算します。しかし、ときには複数期先予測を訓練データで、あるいは、1期先予測をテストデータで計算したくなるかもしれません。

訓練データでの複数期先予測

当てはめ値は訓練セットでの1期先予測と定義する(5.3節、参照)のが普通ですが、似たアイディアは複数期先予測にも使えます。オーストラリアの外食支出のARIMAモデルを使って、この手法を例示します。最近の5年をテストセットに使い、予測は図13.9にプロットします。

training <- auscafe %>% filter(year(Month) <= 2013)
test <- auscafe %>% filter(year(Month) > 2013)
cafe_fit <- training %>%
  model(ARIMA(log(Turnover)))
cafe_fit %>%
  forecast(h = 60) %>%
  autoplot(auscafe) +
  labs(title = "オーストラリアの外食支出",
       y = "10億ドル", level = "区間予測")
オーストラリアのカフェ、レストラン、テイクアウト・サービスへの月次支出の適合ARIMAモデルからの予測

図 13.9: オーストラリアのカフェ、レストラン、テイクアウト・サービスへの月次支出の適合ARIMAモデルからの予測

fitted()関数のh引数で、訓練セットでの\(h\)期先「当てはめ値」が得られます。図13.10は、訓練セットでの12ステップ(1年)先予測をプロットしたものです。このモデルには季節差分(ラグ12)と一つ目差分(ラグ1)の両方があるので、最初のいくつかの観測値ではこれらの予測を計算できません。

fits12 <- fitted(cafe_fit, h = 12)
training %>%
  autoplot(Turnover) +
  autolayer(fits12, .fitted, col = "#D55E00") +
  labs(title = "オーストラリアの外食支出",
       y = "10億ドル")
オーストラリアの外食支出の適合ARIMAモデルからの訓練データでの12期先当てはめ値

図 13.10: オーストラリアの外食支出の適合ARIMAモデルからの訓練データでの12期先当てはめ値

テストデータでの1期先予測

訓練データを使ってモデルを適合させ、次にテストデータセットでその性能を評価するのが普通行うことです。これを通常行うやり方では、テストデータでの比較は異なる予測期間を混ぜて使うことになります。上の例では、最近の60観測値をテストデータに使い、訓練データで予測モデルを推計しました。すると、予測誤差は、1期先、2期先、…、60期先になります。予測分散は予測期間とともに広がるのが普通なので、もし単純にテストセットからの絶対誤差か2乗誤差を平均すると、異なる分散を持つ結果を合算したことになります。

この問題への解決策の一つが、テストデータでの1期先誤差を得ることです。つまり、訓練データを使ってパラメータを推計するところまでは同じですが、テストデータで予測を計算する際、各観測値よりも前のデータ全て(訓練データとテストデータの両方)を使います。つまり、訓練データを\(1,2,\dots,T-60\)時点のものとします。これらのデータでモデルを推計しますが、次に\(h=1,\dots,T-1\)での\(\hat{y}_{T-60+h|T-61+h}\)を計算します。テストデータはパラメータ推計には使わないので、これでも「公正な」予測になります。

上と同じARIMAモデルを使って、モデルをテストデータに適用します。

cafe_fit %>%
  refit(test) %>%
  accuracy()
#> # A tibble: 1 × 10
#>   .model            .type      ME  RMSE   MAE    MPE  MAPE  MASE RMSSE    ACF1
#>   <chr>             <chr>   <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>   <dbl>
#> 1 ARIMA(log(Turnov… Traini… -2.49  20.5  15.4 -0.169  1.06 0.236 0.259 -0.0502

この場合、モデルを再推計していないことに留意してください。替わりに、以前に得た(そして、cafe_fitとして保存されていた)モデルをtestデータに適用します。モデルは再推計しないので、ここで得られた「残差」は実際には1期先予測誤差です。従って、accuracy()コマンドから生成された結果は(出力は”Training set”と言っていますが)実際にはテストセットでのものです。このアプローチは、異なるモデルからの1期先予測を比較することに使えます。