過学習の恐怖,またはいかにして私は1分間でランキングを50位も落としたか(要約)
データマイニングのコンペティンションサイトKaggle: Your Home for Data Scienceに投稿された記事であるThe Dangers of Overfitting or How to Drop 50 spots in 1 minute | No Free Hunchの自分用まとめ.
要約
- あるコンペにて「勝った!!!!!!!!!!!」と思ったが蓋を開けてみれば2位から52位に落ちてた
- 過学習ダメ絶対
- cross validation は適切に行わないといかん
そもそも
Kaggle で Online Privacy Foundation が主催していた,Twitterアカウントごとに0/1を予測するコンペに参加した.
Kaggle のランキングシステムは Public と Private で分かれていて,コンテストが終了するまではテストデータの一部だけを使った答え合わせによる public leaderboard が公開される.submissions は一日2回, submit した瞬間に public leaderboard は更新される.コンテスト終了時に,これまでの submissions の中から5つを選び,テストデータの全てを使ったスコアによって private leaderboard が公開され,ここで最終的な勝者が決定される.
筆者は public leaderboard で2位だったので勝利を確信して眠ったところ, private leaderboard では順位を一気に落とし52位になってしまった.こんなに順位を落としたのは自分だけではなく, public leaderboard の上位5人全てが 64位,52位,58位,16位,57位と順位を落としていた.
問題
何が起こったか確かめるため, submissions の回数と public/private leaderboard における順位との散布図を書いてみた. public leaderboard については submissions が多い方が高い順位になっているが, private leaderboard については, submissions がある回数を超えたあたりから順位が悪くなっているのが確認できた.これを見る限り, public leaderboard の上位は(自分も含め),過学習を行なっていたと考えられる.
分析
今度は自分のスコアを見ていく事にする.コンテスト中は 10-fold cross validation(CV) でパラメータ調整していたので, CV/public/privateのスコアをプロットしてみると
- CVのスコアは submit するにつれ改善している.
- しかし private のスコアはどんどん悪くなっている.一番最初に submit した2つが最も良かった.
といった事が分かった.
過去のコンテストなどからの経験上, public leaderboard は信頼できないという事はわかっていたので cross validation を行なってきた.また, cross validation によるスコアと private leaderboard のスコアには(public/private leaderboard のそれよりも)強い関係があると考えていた.
なので今度は散布図を書いてみた.すると, cross validation のスコアと private leaderboard のスコアには全く関係が無い事が分かった.
原因
ではなぜ cross validation が有効に作用しなかったのか.それは cross validation に変数選択や前処理を含めなかったたという古典的な過ちを犯したからである.具体的には,一度 cross validation で変数選択をした上で更にパラメータ調整を色々したせいで適切な評価ができず,過学習を引き起こしてしまった(詳細はこのスライドやThe Elements of Statistical Learning 7.10.2にある).
その結果,私自身を騙しながらパラメータチューニングを行なってしまった.更に悪い事に, public leaderboard は信頼できないと知っていたいのに,段々順位が上がるにつれ,私は public leaderboard を信頼してしまうという過ちまでやってしまった.