こんな人に向けて書きました
- Trust your CVの前に、正しいCVのやり方を知りたい
- Nested CVについて理解したい
- わずかなリークにも注意を払う必要があるようなタスクをしている
ハイパーパラメータのチューニング後のスコア評価に気を付けよう
まず、結論についてですが。以下のようなクロスバリデーションをしてしまうと、得られたモデルのスコアは不当に高くなってしまいます。
ハイパーパラメータのチューニングは、そもそも検証データに対するスコアを最大化させる(=検証データをリークさせる)ことで行われます。
そのため、クロスバリデーションを行っているといっても、その中でハイパーパラメータのチューニングを行って得られるCVスコアは、実際のモデルの実力よりも高くなってしまいます。
実際のモデルの実力は以下のように、完全な未知データに対する予測をしない限りわかりません。
じゃあどうするの?→Nested CVを使おう!
この問題を解決するために使うCVの手法がNested Cross Validation (Nested CV)です。
以下のようなプロセスで行います。
- 通常のCV同様にデータを訓練データ1と検証データ1に分ける(一段階目のCV:Outer CV)。
- 訓練データ1を、さらに分割して訓練データ2と検証データ2に分ける(二段階目のCV:Inner CV)。
- 訓練データ2でモデルの学習を行い、検証データ2に対するスコアをもとにハイパーパラメータの最適化を行う
- 3.で最適化されたハイパーパラメータを用いて、モデルを訓練データ1で学習
- 4.で学習されたモデルの評価を検証データ1を使って行う
このように学習を行うと、Outer CVの検証データはハイパーパラメータのチューニング過程に一切関与していないクリーンなデータなので、正しくモデルの汎化性能を評価できます。
最終的なハイパーパラメータはどう決めるの?
Nested CVを行うと、Outer CVの試行ごとにInner CVがハイパーパラメータの最適化のために行われるので、毎回ハイパーパラメータの最適値が変わります。
そのため、最終的にハイパーパラメータの値は何を使えばいいのかという疑問がわくと思います。
結論として。最終的なハイパーパラメータは、全データを訓練データと検証データに分割して最適化を行って決定すればよいです。
クロスバリデーションは、基本的には前処理からモデルの学習までの一連のプロセスを評価するための手法であって、最終的なモデルを出力するためのものではないと私は考えています。
なので、「こういうプロセスで学習を行えばこれぐらいの精度が出る」ということがクロスバリデーションで分かったら、そのプロセスを使って全データに対してモデルの学習を行えば、クロスバリデーション時に出た精度と同等のものが出力されることが期待されます。
おわりに
機械学習におけるモデルの評価は、細かく考え出すとかなり難しい問題です。
私自身も、仕事で機械学習を行うようになって、間違ったモデル評価をしながら、それに気づかず不当な結果を報告してしまった経験があります。
この記事が、正しいモデル評価をするための一助になれば幸いです。
なお、もし私の理解に誤りなどがある場合はどんどんご指摘いただけると嬉しいです!