JA EN
体系機械学習の基礎
·★ 会員·9分で読めます

過学習と評価設計 — 精度99%を疑え

訓練データに合わせすぎたモデルはなぜ現場で壊れるのか。train/validation/testの役割分担、交差検証、実務で最も多い失敗であるデータリーク、不均衡データで精度が嘘をつく仕組みと、適合率・再現率・F1の使い分けまで。

対象textタスクbasicsevaluation

「精度99%出ました」ほど危ない報告はない

チームから「新しいモデル、精度99%です」と報告が来たとします。喜ぶ前に確認すべきことが3つあります。どのデータで測ったのか。正解の内訳はどうなっているのか。そして、測る前にそのデータを一度でも学習に使っていないか。

この3つを外すと、手元で99%だったモデルが本番で60%になります。厄介なのは、原因がモデルではなく評価のやり方の側にあるため、モデルをいくら改良しても直らないことです。

前の記事(損失関数と最適化)では損失を下げる仕組みを見ました。しかし損失を下げること自体は目的ではありません。訓練データの損失は、下げすぎると害になるからです。

過学習とは、何が起きているのか

過学習(overfitting)とは、モデルがデータの中の「本当の規則」だけでなく、「そのデータにたまたま乗っていたノイズ」まで忠実に再現してしまった状態です。

散布図に点が10個あるとします。全体はゆるやかに右肩上がりで、各点は測定ゆらぎで少し上下している。直線を当てると点からのズレは残りますが、傾向は掴めます。一方9次の多項式なら10点すべてを寸分違わず通過でき、訓練誤差はゼロ。しかしその曲線は点と点の間で激しく波打っており、新しい点は大きく外します。

つまり過学習は「性能が悪い」のではなく、訓練データに対して良すぎることで起きます。モデルの表現力(容量)が、手持ちのデータ量に対して大きすぎるときの症状です。

下の部品で多項式の次数を上げてみてください。訓練誤差は次数とともに単調に下がり続けるのに、テスト誤差はある次数を境に反転して上がり始めます。

FIG 1次数(モデルの複雑さ)を上げると訓練誤差は下がり続けるが、テスト誤差はある点から上昇に転じる

逆に、直線しか引けないモデルで複雑な関係を学ばせようとすると、訓練誤差もテスト誤差も高いまま止まります。こちらは未学習(underfitting)です。診断は2つの数字の関係だけでつきます。両方高いなら未学習、訓練だけ低くて差(汎化ギャップ)が開いていれば過学習。

この2種類の誤りには名前があります。単純すぎて傾向を捉えられない分をバイアス、データのゆらぎに振り回される分をバリアンスと呼び、モデルを複雑にするほどバイアスは減ってバリアンスは増えます。上の図でテスト誤差が最小になる点は、このトレードオフの底です。実務では、まず十分な容量のモデルで訓練誤差を下げきり、そのうえで正則化やデータ追加でギャップを詰める、という順で進めるのが定石になっています。

そして最適な複雑さは「訓練誤差が最小の点」ではなく「テスト誤差が最小の点」にある。となれば、次の問題は1つです。そのテスト誤差を、どうやって正しく測るのか。ここからが本題です。

訓練・検証・テスト — 3つに分ける理由

データは2つではなく3つに割ります。役割が違うからです。

分割 割合の目安 何に使うか 見てよい回数
訓練(train) 60〜80% パラメータを学習させる 無制限
検証(validation) 10〜20% ハイパーパラメータ選択・早期終了 何度でも
テスト(test) 10〜20% 最終的な性能の見積もり 最後に1回

なぜ検証とテストを分けるのか。学習率や層の数といったハイパーパラメータ(学習では決まらない設定値)は検証スコアを見て選びますが、選ぶ行為自体が検証セットへの適合です。50通り試して最良を選べば、それは検証セットのノイズに合っていただけかもしれない。だから選択に一度も使っていないデータを封印しておきます。テストは、報告のために1回だけ開ける封筒です。

数百件しかないデータから20%を検証に切り出すと、たまたまの当たり外れでスコアが数ポイント動き、モデル比較になりません。そこでk分割交差検証(k-fold cross-validation)です。

この先にあるもの

§

ここから先は会員限定です

解説記事371本・教科書26章・学生モード48単元・論文精読6本が、月額¥490ですべて読み放題になります。新しい解説は毎日3本ずつ増えます。いつでも解約でき、解約後も期間の終わりまで読めます。

会員の方はログインすると続きが表示されます

コメント

コメントにはログインが必要です