モデリング●●●●○

過学習

Overfitting ・ かがくしゅう

モデルが手元のデータの偶然まで暗記し、新しいデータへの予測が悪化する現象

✦ 30秒で試す — 航海練習問題で満点のモデルほど、本番で外すことがあるデータを100個に増やし、同じ次数9で当てはめ直すと、新しいデータでの外れは?予想してみる

概要

過学習(オーバーフィッティング)は、モデルが手元のデータに合わせすぎた結果、そのデータでは高い精度を出すのに、新しいデータに対する予測が悪化してしまう現象です。手元のデータには「本当の規則性」と「たまたまそうなっただけの偶然のばらつき」が混ざっています。モデルを複雑にすればするほどデータへの当てはまりは必ず良くなりますが、それは規則性だけでなく偶然の部分まで暗記し始めているからかもしれません。試験勉強にたとえるなら、過去問の答えを丸暗記して過去問では満点を取れるのに、初見の問題が解けない状態です。

統計モデリングや機械学習の目的は、手元のデータをうまく説明することではなく、まだ見ていないデータをうまく予測・説明することにあります。この「未知のデータに対する性能」を汎化性能と呼びます。過学習は汎化性能を静かに蝕むため、回帰分析から深層学習まで、モデルを作るすべての場面でつきまとう最重要の落とし穴です。

なぜ生まれたか

「当てはまりの良さ」がそのままモデルの良さの指標として使われていた時代、変数や項を増やせば増やすほど決定係数などの指標は改善し続けるため、複雑なモデルほど良いモデルに見えてしまうという問題がありました。ところがそうして作られたモデルを新しいデータに適用すると、単純なモデルより成績が悪いという逆転が頻繁に起こります。手元のデータは母集団と標本の関係でいえばあくまで標本であり、標本特有の偶然のゆらぎを含んでいます。複雑なモデルはそのゆらぎまで律儀に再現してしまうため、別の標本ではゆらぎの向きが変わり、予測が外れるのです。

この「当てはまりと汎化は別物である」という認識が明確になったことで、統計学と機械学習は評価の考え方を根本から改めました。モデルの良さは学習に使ったデータではなく、学習に使っていないデータで測る——この原則から交差検証のような評価手法や、複雑さにペナルティを課す正則化、AICなどの情報量規準が生まれています。過学習という概念は、これらの技法すべての出発点にあたります。

詳細

当てはまりすぎるとはどういうことか

典型例が多項式回帰です。10個のデータ点に直線を当てはめると多少の残差が残りますが、9次多項式を使えば10点すべてを厳密に通る曲線が引けます。誤差ゼロ——しかしその曲線はデータ点の間で激しく波打ち、新しい点の予測はでたらめになります。データに含まれるノイズまで「説明」しようとした結果、本当の構造から離れてしまったのです。逆に、曲線的な関係に単純すぎるモデル(下の図の左では、平均値を表す水平な線)しか当てはめないと、規則性を捉えきれない「未学習(アンダーフィッティング)」になります。良いモデルはこの中間、構造は捉えるがノイズは追わない複雑さにあります。

未学習(単純すぎ)誤差: 訓練 0.19 / 新しい点 0.18適切な複雑さ誤差: 訓練 0.07 / 新しい点 0.01過学習(複雑すぎ)誤差: 訓練 0.00 / 新しい点 0.25白い点 = 訓練データ / 青緑の× = 新しいデータ / 破線 = 真の関係 / 赤い線 = 新しい点での外れ
未学習・適切・過学習 — 同じ7点への3通りの当てはめ。過学習の曲線は訓練点をすべて通るが、真の関係の近くに現れた新しい点(×)を大きく外す

図の3枚を、次数を連続的に動かしながら確かめてみましょう。はじめは新しいデータを隠したまま次数を上げ、訓練誤差だけを見ると「複雑なほど良い」と思えてしまうことを体験してから、新しいデータを開いてください。

⚡ 体験: 次数を上げて過学習させる
次数 1 の多項式を当てはめる新しいデータはまだ隠れています次数ごとの誤差
訓練誤差検証誤差(新しいデータ)当てはめた曲線
次数1訓練誤差0.169検証誤差?検証誤差が最小の次数?

右のグラフの金色のつまみを右へドラッグして、多項式の次数を上げてください。白い訓練点への当てはまり(訓練誤差)はどこまでも良くなっていきます。

白 = 訓練データ(学習に使う)、青緑 = 新しいデータ(学習に使わない)。右: 次数ごとの誤差(RMSE)

過学習の兆候をどう見つけるか

過学習の定義そのものが検出法を示しています。学習に使ったデータでの誤差(訓練誤差)と、使っていないデータでの誤差(検証誤差)を分けて測ればよいのです。モデルを複雑にしていくと、訓練誤差は単調に下がり続けますが、検証誤差はある点までは下がり、その先で上昇に転じます。訓練誤差と検証誤差の差が開き始めたら過学習のサインです。この分割評価を系統的に行う手法が交差検証で、検証誤差が最小になる複雑さを選ぶことがモデル選択の基本になっています。なぜ誤差がこのようなU字を描くのかは、バイアスとバリアンスの分解によって理論的に説明できます。

注意したいのは、検証データも「使えば減る資源」だということです。検証誤差を見ながら次数や変数の組み合わせを何十回も選び直すと、選ばれたモデルは検証データの偶然にまで合わせ込まれ、検証誤差そのものが楽観的になります。実務では、モデル選びに使う検証データとは別に、最後に一度だけ使うテストデータを取り置くのが定石です。また、データ量を変えながら訓練誤差と検証誤差を並べる学習曲線を描くと、「データを増やせば差が縮むのか(過学習)」「両方とも高止まりしているのか(未学習)」を見分ける手がかりになります。

過学習を抑える手立て

もっとも直接的な対策はデータを増やすことです。標本が大きくなるほど偶然のゆらぎは平均されて小さくなり、モデルが暗記できるノイズが減ります。それが難しい場合の代表的な手立てが正則化で、モデルの係数が大きくなりすぎることにペナルティを課し、当てはまりと単純さのバランス点を自動的に探させます。ほかにも、変数を減らす・モデルの次数を下げるといった複雑さの直接制御、決定木の枝刈り、ニューラルネットワークの早期終了やドロップアウトなど、分野ごとに多彩な手法がありますが、いずれも「手元のデータへの当てはまりを意図的に少し犠牲にして、汎化性能を守る」という同じ思想に立っています。

統計的推論における過学習

過学習は予測モデルだけの問題ではありません。重回帰分析で説明変数を増やしすぎれば、偶然の相関を「効果」として拾ってしまいますし、有意になる変数の組み合わせを探し回る行為はpハッキングと同じ構造——手元のデータの偶然への過剰適合——を持っています。また、検証用データの情報がうっかり学習側に混入するデータリーケージが起きると、検証誤差そのものが当てにならなくなり、過学習を見逃します。残差の確認などのモデル診断と合わせて、「このモデルは手元のデータの外でも通用するか」と問い続けることが、過学習との正しい付き合い方です。

試問

10個の訓練データ(白い点)に多項式の曲線を当てはめます。つまみで次数(1 = 直線、2 = 放物線、…)を上げるほど曲線はくねくね曲がれるようになり、訓練データへの誤差(訓練誤差)は下がっていきます。本当に大事なのは学習に使っていない新しいデータへの誤差ですが、新しいデータは次数を決めてボタンを押すまで隠れています。手がかりは訓練誤差のグラフだけです。

✦ 命題挑戦中

新しいデータを見る前に次数を1つに決め、新しいデータへの誤差を、最も良い次数の 1.25 倍以内に収めよ

  • 新しいデータを見る前に次数を決める
  • 決めた次数の新しいデータへの誤差が、最も良い次数の 1.25 倍以内
⚡ 体験: 次数を決めてから、新しいデータで確かめる
次数 1 の多項式を当てはめる新しいデータはまだ隠れています次数ごとの誤差
訓練誤差検証誤差(新しいデータ)当てはめた曲線
次数1訓練誤差0.169検証誤差?検証誤差が最小の次数?

右のグラフの金色のつまみを右へドラッグして、多項式の次数を上げてください。白い訓練点への当てはまり(訓練誤差)はどこまでも良くなっていきます。

白 = 訓練データ(学習に使う)、青緑 = 新しいデータ(学習に使わない)。右: 次数ごとの誤差(RMSE)