12.5 ブートストラップとバギング

時系列のブートストラップ

前節と5.5節では、時系列の残差をブートストラップして、モデルを使って系列の将来値をシミュレートしました。

別のタイプのブートストラップを使えば、より広く、観測系列に似た新しい時系列を生成できます。

まず、必要なら時系列を変換し、次にSTLを使ってトレンド、季節性、残差の各成分に分解します。それから、残余成分をシャッフルして、ブートストラップした残差系列を得ます。STLの残余成分には自己相関があり得るので、5.5節で述べた単純に再抽出する手順は使えません。替わりに、時系列の連続した部分をランダムに選んで一緒に並べる「ブロック化ブートストラップ」を使います。こうしてブートストラップした残差系列をトレンドと季節性の成分に加え、逆変換して、元の時系列の変形を得ます。

オーストラリアのセメント四半期生産量の1988 Q1から2010 Q2までを考えてみましょう。まず、図12.19で、分解がトレンドと季節性を適切に取り込んでいるか、残差系列に明らかなしシグナルが残っていないか、をチェックします。

cement <- aus_production %>%
  filter(year(Quarter) >= 1988) %>%
  select(Quarter, Cement)
cement_stl <- cement %>%
  model(stl = STL(Cement))
cement_stl %>%
  components() %>%
  autoplot()
オーストラリアのセメント四半期生産量のSTL分解

図 12.19: オーストラリアのセメント四半期生産量のSTL分解

次に、データのブートストラップ版をいくつか生成します。generate()は通常、モデルから将来を生成します。しかし、ここでは過去データ期間のシミュレーションが欲しいので、new_data引数に元のデータを渡し、シミュレートするデータでも同じ期間が使われるようにします。規模8のブロックを使って、データ2年分をカバーします。

cement_stl %>%
  generate(new_data = cement, times = 10,
           bootstrap_block_size = 8) %>%
  autoplot(.sim) +
  autolayer(cement, Cement) +
  guides(colour = "none") +
  labs(title = "セメント生産量: ブートストラップ系列",
       y="トン (千)")
オーストラリアのセメント四半期生産量のブートストラップ版10個(色付き)と元のデータ(黒色)

図 12.20: オーストラリアのセメント四半期生産量のブートストラップ版10個(色付き)と元のデータ(黒色)

バギングした予測

これらブートストラップで作成した時系列の使い道の一つは、予測の正確性を改善することです。追加作成した時系列それぞれから予測を生成して、それら予測を平均すれば、直接元の時系列を単純に予測するよりも良い予測が得られます。これを”bootstrap aggregating”(ブートストラップ集計)、略して「バギング(bagging)」と言います。

cementデータを使って、このアイディアを実演します。まず、上で述べたブロック化ブートストラップを使って、元のデータに似た時系列を数多くシミュレートします。

sim <- cement_stl %>%
  generate(new_data = cement, times = 100,
           bootstrap_block_size = 8) %>%
  select(-.model, -Cement)

これら系列それぞれにETSモデルを適合させます。各ケースで異なるETSモデルが選択される可能性もありますが、系列が似ているのでおそらく同じモデルを選択するでしょう。しかし、パラメータの推計値は異なるので、たとえ選択されたモデルは同じでも予測は違ってきます。時系列の数が多いので、これは時間のかかるプロセスです。

ets_forecasts <- sim %>%
  model(ets = ETS(.sim)) %>%
  forecast(h = 12)
ets_forecasts %>%
  update_tsibble(key = .rep) %>%
  autoplot(.mean) +
  autolayer(cement, Cement) +
  guides(colour = "none") +
  labs(title = "セメント生産量: ブートストラップ予測",
       y="トン (千)")
100個のブートストラップ系列のETSモデルを使った予測

図 12.21: 100個のブートストラップ系列のETSモデルを使った予測

最後に、時系列ごとのこれら予測を平均し、元のデータの「バギングした予測」を得ます。

bagged <- ets_forecasts %>%
  summarise(bagged_mean = mean(.mean))
cement %>%
  model(ets = ETS(Cement)) %>%
  forecast(h = 12) %>%
  autoplot(cement) +
  autolayer(bagged, bagged_mean, col = "#D55E00") +
  labs(title = "オーストラリアのセメント生産量",
       y="トン (千)", level = "区間予測")
バギングしたETS予測(100個のブートストラップ予測の平均、オレンジ色)とデータに直接ETSを適用した予測(黒色)の比較

図 12.22: バギングしたETS予測(100個のブートストラップ予測の平均、オレンジ色)とデータに直接ETSを適用した予測(黒色)の比較

Bergmeir et al. (2016) は、平均的には、バギングする方が直接ETS()を適用するだけよりも良い予測になるとしています。もちろん、バギングにはずっと多くの計算が必要なので、より時間がかかります。

参考文献

Bergmeir, C., Hyndman, R. J., & Benítez, J. M. (2016). Bagging exponential smoothing methods using STL decomposition and Box-Cox transformation. International Journal of Forecasting, 32(2), 303–312. [DOI]