基礎編
学習と検証(過学習・交差検証)
訓練・検証・テストの三分割、交差検証、過学習と未学習。そして「探すほどテストの数字が甘くなる」こと。
この記事の要点
- データは訓練・検証・テストの 3 つに分けます。テストは最後に一度だけ使います。
- 時間の流れがあるデータを、ランダムに分けてはいけません。未来を見ながら過去を当てる形になります。
- 答えに由来する情報が入力に混ざると(データリーク)、検証成績だけが異常に良くなります。
なぜ分けるのか
学習に使ったデータでそのまま成績を測ると、実力より良い数字が出ます(楽観的に偏ります)。 暗記した問題集を解き直すようなもので、本番で解けるかどうかは分かりません。 逆に、ここでの成績が悪ければ、モデルが単純すぎるか設定が合っていない (=未学習)というサインになります。 そこでデータを分けて、学習に使っていない部分で成績を測ります。
| 区分 | 使い道 | 使う回数 |
|---|---|---|
| 訓練データ | モデルを学習させる | 何度でも |
| 検証データ | 設定(ハイパーパラメータ)や特徴量を選ぶ | 試行のたびに |
| テストデータ | 最終的な実力の確認 | 原則 1 回だけ |
テストデータを見ながら調整を繰り返すと、それは検証データと同じものになります。「最後に一度だけ」という約束がテストの価値を作っています。
過学習と未学習
- 過学習… 訓練データに合わせ込みすぎて、たまたまの偶然まで覚えてしまった状態。 訓練の成績は良いのに検証の成績が悪い。
- 未学習… モデルが単純すぎて、そもそも規則をつかめていない状態。 訓練の成績も検証の成績も悪い。
単純すぎる側の誤差をバイアス、 複雑すぎて学習データのばらつきに振り回される側の誤差をバリアンスと呼び、 両者の間のどこかに、ちょうどよい複雑さがあります (バイアスとバリアンスのトレードオフ)。 訓練と検証の成績を並べて眺め、差が開き始めたところが行き過ぎの目印です。 木の本数を増やしながら検証成績が悪化した時点で止める(早期終了 / early stopping)、 重みが大きくなりすぎないように罰則を掛ける(正則化)といった手当てがあります。
交差検証 ── ただし時系列は別
データが少ないとき、分け方の運で成績が上下してしまいます。 そこでデータを k 個に分割し、 1 つを検証・残りを訓練として k 回繰り返し、平均を取る方法があります(k 分割交差検証)。
データリーク(答えの漏れ込み)
検証の成績が不自然に良いときは、たいていこれです。本番では手に入らない情報が、入力に混ざっている状態を指します。 典型的な入り込み方は次の 3 つです。
- 未来の情報… 予測したい出来事より後に確定する値を特徴量に入れてしまう
- 答えに由来する情報… 結果から計算される値(結果を含む集計、事後に付けられたラベル)を入れてしまう
- 分割前の前処理… 全データの平均で標準化する、全期間の集計で特徴量を作る、といった処理を 分割の前に行うと、訓練側に検証側の情報がにじむ
対策はひとつずつ潰すしかありません。「この列は、予測する瞬間に本当に分かっているか」を列ごとに問い直すのが確実です。
探すほど、検証の数字は甘くなる
設定を何十通りも試して、いちばん検証成績が良かったものを選ぶ ── 普通の作業ですが、ここには落とし穴があります。 たくさん試せば、たまたま検証データに合っただけのものが 最良として選ばれやすくなるからです。
だから、選び終えたあとの数字は実力より少し良く出ていると考え、 最終確認は手を付けていないテストデータで行います。 この現象は多重比較の問題そのもので、試行回数を記録しておくと自衛できます。