5.8 点予測の正確性評価

訓練セットとテストセット

予測の正確性を評価するには、真正の予測を使うことが大切です。ですから、真の予測誤差がどれほどの大きさになりそうかについて、残差の大きさは信頼できる指標ではありません。モデル推計には使わなかった新しいデータで、モデルがどれだけ上手く機能するか検討しないと、予測の正確性は決められません。

モデルを選択する際、利用可能なデータを訓練データとテストデータに分けるのが普通です。訓練データは予測手法のパラメータ推計に使い、テストデータはその正確性を評価するのに使うのです。テストデータは予測生成に使っていませんから、モデルにとって新しいデータであり、予測性能の信頼できる指標を提供できるはずです。

全標本の約20%をテストセットに取っておくのが典型的ですが、標本期間や予測期間によっても変わります。理想的には、最短でも予測期間と同じ長さだけのテストセットは確保したいところです。以下の点に留意が必要です。

  • 訓練データによく当てはまっているモデルが、上手く予測できるとは限らない。
  • パラメータの数を十分に増やせば、完璧に当てはまるモデルにすることは常に可能。
  • モデルをデータに過剰に当てはめることは、データ中の系統的パターンを特定し損ねることと同じくらい、良くない。

テストセットのことを「ホールドアウト・セット」と言うこともあります。モデル推計の際には、「ホールドアウト(取りおき)」するからです。訓練セットを「インサンプル・データ」、テストセットを「アウトオブサンプル・データ」と呼ぶこともあります。本書では「訓練データ(セット)」、「テストデータ(セット)」の呼び方を使います。

時系列の一部を切り出す関数

訓練セットとテストセットを作る際に必要になる、時系列から一部を切り出す作業には、filter()関数が役に立ちます。データを評価セットに切り分ける際は、データのインデックス変数で抽出するのが特に便利です。例えば、

aus_production %>% filter(year(Quarter) >= 1995)

は、1995年とそれ以降の全てのデータを抽出します。同様に、

aus_production %>% filter_index("1995 Q1" ~ .)

とすることもできます。

もう一つ役に立つ関数は、slice()です。行番号インデックスを使って、各グループからその一部を切り出すことができます。例えば、

aus_production %>%
  slice(n()-19:0)

は、最後の20個の観測値(5年分)を抽出します。

slice()はグループに対しても機能しますので、各キーから観測値を切り出すことができます。例えば、

aus_retail %>%
  group_by(State, Industry) %>%
  slice(1:12)

とすれば、データ中の各時系列から最初の1年分のデータを切り出します。

予測誤差

予測「誤差」は、観測値とその予測との差です。ここでの「誤差」は、過ちという意味ではなく、観測値中の予測不能な部分、という意味です。以下のように、書けます。 \[ e_{T+h} = y_{T+h} - \hat{y}_{T+h|T} \] ただし、\(\{y_1,\dots,y_T\}\)は訓練データで、\(\{y_{T+1},y_{T+2},\dots\}\)はテストデータです。

予測誤差は2つの点で残差とは異なります。第一に、残差は訓練セットから計算されるのに対し、予測誤差はテストセットから計算されます。第二に、残差は1ステップ先予測のものだけですが、予測誤差は複数ステップ先予測のものもあります。

予測の正確性を測るには、予測誤差を要約しますが、要約にはいくつかの方法があります。

尺度依存の誤差

予測誤差はデータと同じ尺度になります。\(e_{t}\)だけに基づく正確性の指標は尺度に依存しており、従って、違う単位の系列とは比較できません。

最もよく使われる尺度依存の指標は、絶対誤差と平方誤差に基づく2つです。 \[\begin{align*} \text{平均絶対誤差 Mean absolute error: MAE} & = \text{mean}(|e_{t}|)\\ \text{平均2乗誤差の平方根 Root mean squared error: RMSE} & = \sqrt{\text{mean}(e_{t}^2)} \end{align*}\] 単一の時系列、もしくは、同じ単位の複数の時系列にいくつかの予測手法を適用して比較する際は、MAEが理解も計算も簡単なので人気があります。MAEを最小化する予測手法は中位数の予測になりますが、RMSEを最小化する予測手法は平均の予測になります。ですから、解釈はやや難しくなりますが、RMSEも広く使われています。

パーセント誤差

パーセント誤差は\(p_{t} = 100 e_{t}/y_{t}\)で表します。この指標には原データの単位に依存しないという利点があるので、異なるデータセット間で予測の性能を比較するのに頻繁に使われています。最も普通に使われている指標は、 \[ \text{平均絶対パーセント誤差 Mean absolute percentage error: MAPE} = \text{mean}(|p_{t}|) \] です。パーセント誤差に基づく指標の弱点は、もし分析期間中の、どこか1つの\(t\)\(y_{t}=0\)となるならばその値は無限や定義不能になり、またどこか1つの\(y_{t}\)がゼロに近ければ極端な値になることです。パーセント誤差のしばしば見過ごされているもう一つの問題点は、測定単位でのゼロに意味があると想定していることです。2例えば、華氏度と摂氏度のどちらの尺度の気温予測であれ、その正確性を測るのにパーセント誤差は意味がありません。気温のゼロ点は恣意的なものだからです。

正の誤差に比べて負の誤差のペナルティが重いことも弱点です。この認識から使われるになったのが、 Armstrong (1978, p. 348)が提案した、いわゆる「対称(symmetric)」MAPE(sMAPE)で、M3予測コンペでも使われました。この指標は、以下のように定義されます。 \[ \text{sMAPE} = \text{mean}\left(200|y_{t} - \hat{y}_{t}|/(y_{t}+\hat{y}_{t})\right) \] しかし、もし\(y_{t}\)がゼロに近ければ\(\hat{y}_{t}\)もゼロに近いでしょうから、この指標は計算を不安定にする、ゼロに近い値による割り算という欠点、を依然抱えています。また、sMAPEの値は負にもなり得るので、実際のところ「絶対パーセント誤差」の指標では全然ないのです。

Hyndman & Koehler (2006) はsMAPEを使わないよう薦めています。本書では使用しませんが、ここで紹介した訳は、単に広く利用されているからです。

尺度調整済み誤差

尺度調整済み誤差は、単位が異なる系列間で予測の正確性を比較する際に、パーセント誤差の代替として Hyndman & Koehler (2006) が提案したものです。単純な予測手法を使って計算した訓練データのMAEに基づいて誤差を尺度調整するという提案です。

季節性のない時系列では、尺度調整済み誤差を定義するのにナイーブ予測を使うのが有益です。 \[ q_{j} = \frac{\displaystyle e_{j}} {\displaystyle\frac{1}{T-1}\sum_{t=2}^T |y_{t}-y_{t-1}|} \] 分母、分子ともに元のデータの尺度なので、\(q_{j}\)はデータの尺度から独立しています。訓練データに対して1期先をナイーブ予測した場合よりも平均して良い予測であるなら、尺度調整済み誤差は1未満になります。逆に、訓練データに対して1期先をナイーブ予測した場合よりも平均して悪い予測であるなら、尺度調整済み誤差は1を上回ります。

季節性のある時系列では、尺度調整済み誤差は季節ナイーブ予測を使って定義できます。 \[ q_{j} = \frac{\displaystyle e_{j}} {\displaystyle\frac{1}{T-m}\sum_{t=m+1}^T |y_{t}-y_{t-m}|} \]

平均絶対尺度調整済み誤差 mean absolute scaled errorは単に、 \[ \text{MASE} = \text{mean}(|q_{j}|) \] 同様に、平均2乗尺度調整済み誤差の平方根 root mean squared scaled errorは、 \[ \text{RMSSE} = \sqrt{\text{mean}(q_{j}^2)} \] になります。ただし、 \[ q^2_{j} = \frac{\displaystyle e^2_{j}} {\displaystyle\frac{1}{T-m}\sum_{t=m+1}^T (y_{t}-y_{t-m})^2} \] で、季節性のないデータでは\(m=1\)と設定します。

事例

recent_production <- aus_production %>%
  filter(year(Quarter) >= 1992)
beer_train <- recent_production %>%
  filter(year(Quarter) <= 2007)

beer_fit <- beer_train %>%
  model(
    "平均" = MEAN(Beer),
    "ナイーブ" = NAIVE(Beer),
    "季節ナイーブ" = SNAIVE(Beer),
    "ドリフト" = RW(Beer ~ drift())
  )

beer_fc <- beer_fit %>%
  forecast(h = 10)

beer_fc %>%
  mutate(
    .model = factor(.model,
                    levels = c("ドリフト", "ナイーブ", "平均", "季節ナイーブ"))
  ) %>% 
  autoplot(
    aus_production %>% filter(year(Quarter) >= 1992),
    level = NULL
  ) +
  labs(
    y = "メガリットル",
    title = "四半期ビール生産量の予測"
  ) +
  guides(colour = guide_legend(title = "予測"))
オーストラリア四半期ビール生産量の2007年末までのデータを使った予測

図 5.21: オーストラリア四半期ビール生産量の2007年末までのデータを使った予測

5.21は、オーストラリア四半期ビール生産量に、2007年末までのデータを使って、4つの予測手法を適用したものです。2008–2010年の実績値も示しています。この期間の正確性指標を計算しましょう。

accuracy(beer_fc, recent_production)
手法 RMSE MAE MAPE MASE
季節ナイーブ手法 14.31 13.40 3.17 0.94
平均手法 38.45 34.83 8.28 2.44
ナイーブ手法 62.69 57.40 14.18 4.01
ドリフト手法 64.90 58.88 14.58 4.12

accuracy()関数は、さまざまな正確性指標を計算する際に、自動的にデータ(この例ではrecent_production)から対応する期間を取り出して予測とマッチさせます。

季節ナイーブ法がこのデータについては最良なことはグラフから明白ですが、後に見るように、まだ改善の余地があります。また、どの予測手法が最良か、正確性指標によって異なることが時々あります。しかし今回は、このデータセットについては4つの予測手法の中では季節ナイーブ法が最良であると、どの指標もそろって示しています。

季節性のないデータとして、Google株価データを考えてみましょう。以下のグラフは2015年1月からの株価終値と3つの異なる手法で得た2016年1月の予測です。

google_fit <- google_2015 %>%
  model(
    "平均" = MEAN(Close),
    "ナイーブ" = NAIVE(Close),
    "ドリフト" = RW(Close ~ drift())
  )

google_fc <- google_fit %>%
  forecast(google_jan_2016)
google_fc %>%
  autoplot(bind_rows(google_2015, google_jan_2016),
    level = NULL) +
  labs(y = "米ドル",
       title = "2015年1月以降のGoogle株価終値") +
  guides(colour = guide_legend(title = "予測"))
Google株価の2016年1月の予測

図 5.22: Google株価の2016年1月の予測

accuracy(google_fc, google_stock)
手法 RMSE MAE MAPE MASE
ナイーブ手法 43.43 40.38 5.67 5.67
ドリフト手法 53.07 49.82 6.99 6.99
平均手法 118.03 116.95 16.24 16.41

ここでは、ナイーブ法が(どの正確性指標を使ったとしても)最良となります。

参考文献

Armstrong, J. S. (1978). Long-range forecasting: From crystal ball to computer. John Wiley & Sons. [Amazon]
Hyndman, R. J., & Koehler, A. B. (2006). Another look at measures of forecast accuracy. International Journal of Forecasting, 22(4), 679–688. [DOI]

  1. つまり、パーセントは比例尺度では適切でも、間隔尺度では適切でない、ということです。比例尺度の変数だけがゼロに意味があるのです。↩︎