説明変数 x と目的変数 y との間で数理モデル y = f(x) を構築するとき、構築されたモデルがオーバーフィッティングしているかどうか気になるときがあります。
もちろんトレーニングデータとテストデータに分割してテストデータで検証したり、ダブルクロスバリデーションで検証したりしたあとに、扱っているデータセットに対して最適な回帰分析方法やクラス分類手法を選択して用いているわけですが、
最終的に構築されたモデルが、実際どの程度オーバーフィッティングしているかは、モデルが構築されるまでわかりません。オーバーフィッティングの原因は x と y の間の偶然の相関 (chance correlation) であり、その程度を調査する方法が y-randomization (もしくは y-scrambling) です。
y だけサンプルの値をシャッフルして、x と y の間に相関のない (おかしな) データセットにしたあとに、モデルを構築します。このフィッティングの結果、本来であれば (おかしなデータセットなので) y をまったく説明できないのが普通なのに、説明できてしまった場合は、その分は偶然の相関が原因であり、元のデータセットでも同程度の偶然の相関、すなわちオーバーフィッティングが起きていますよ、ということです。例えば回帰分析において、元の r2 が 0.9 のとき、y-randomization で r2 が 0.3 とでてしまったときには、0.9 − 0.3 で 0.6、すなわち 60 % くらいしか実際の y の変動を説明できていない、といったイメージです。
もちろん y-randomization でも相関の影響は考慮できますが、y ではなく x をシャッフルすることもできます。x の特徴量ごとにサンプルの値をシャッフルし、おかしくさせたデータセットを用いてモデルを構築します。あとは y-randomization のときの議論と同じです。
y をシャッフルするのか、x をシャッフルするのか、y と x の両方をシャッフルするのか、どれがよいのか色々と議論はありますが、実用的には、相手に伝えやすいやり方でよいと思います。「こんなデータセットでも r2 が 0.99 になってしまいました!このモデルを使用するのは危険です。もう少しサンプルを集めましょう!」、といった感じです。「こんなデータセット」 としたときに相手に伝わりやすいようなシャッフルをするとよいでしょう。
y-randomization をはじめとする乱数を用いてサンプルをシャッフルする検証方法は、偶然の相関の程度を確認できるだけではありません。いろいろな使い方があります。例えば、サンプル数が小さい中で変数の重要度を計算したとき、それをどのくらい信用してよいか迷うときもあると思います。こんなときは、シャッフルしたデータセットでもどれくらい変数の重要度が大きくなってしまうのか、検討するとよいと思います。元のデータセットにおける変数の重要度より大きくなってしまったら、その変数の重要度は参考にならないでしょう。
他にも、特にサンプル数が小さいとき、ダブルクロスバリデーションによる予測性能をどこまで信用してよいのか、クラス分類において ROC 曲線や AUC をどれくらい信じてよいのか、検証したい場合は、サンプルをシャッフルしてまったく同じことをしてみると良いと思います。
サンプル数が少ないときには、結果がよく見えてしまうことが多く、本当にそれが真実を示しているのか、それだけではわかりません。乱数を用いたシャッフルを活用して、結果を評価するとよいでしょう。
以上です。
質問やコメントなどありましたら、twitter, facebook, メールなどでご連絡いただけるとうれしいです。