交差検証の使い道
この投稿はrioyokotalab Advent Calendar 2020 24日目の投稿です。
交差検証法
機械学習をやる上で、検証は最重要の技術だと言えます。検証を行うにあたって、よくあるのが、データセットの一部をテストデータとして検証に回すというのがありますが、もしかして、そのテストデータでチューニングしたスコアが論文に掲載されてたりしてないですよね...。
適切な機械学習を行うためには、テストデータにたいしてチューニングするのはタブーとされています。なぜなら、テストデータに対してチューニングを行うと、テストデータが保有している統計的な情報を含めてチューニングしてしまう可能性があるからです。
テストデータはあくまで、最終的な性能評価の一発勝負のスコアの計算に用いられるべきで、検証用のデータセットは別にデータを分けてearly stoppingなどを行う必要があります。しかし、データセットを減らして学習すると性能が劣化してしまいます。そういう問題に対処できる検証法が交差検証法なのです。
交差検証法とは
交差検証法とは、学習データを5つとかに分割して(分割の仕方もまた重要)それぞれを検証データ、それ以外を学習データとした複数のモデルを学習させる方法です。
まず、データセットを分割します。分割したデータをそれぞれ検証用として、検証用に含まれなかった分割分を学習用として、検証・学習データのペアを作ります。それぞれfold0
からfold4
と呼びます。
それぞれのfoldで検証を行いながら、学習を行ったら、今度は推論データを作成します。モデルにはそれぞれのモデルの学習時に検証用として用いたデータを入力とし推論を行います。
こうすることで、学習データ(ラベルがついている)全てに対して検証用の推論結果を入手することができます。この推論データと学習データのラベルを組み合わせることで、学習データ全体に対して、検証スコアを計算することができます。
テストデータに対して推論を行う場合は、このどれか一つのモデルを使用するか、すべてのモデルで推論を行い、モデルアンサンブルとしてその平均を推論として出力します。
検証の戦略が間違っている場合、テストデータの検証スコアと、学習データ全体に対する検証スコアの間に差が生じます。この差が生まれないことを確認するためにテストデータでのスコアの計算は行われます。
この一連の検証方式の流れが交差検証法(Cross Validation:CV)と呼ばれる物です。正しい検証が行えるようになると、検証データでチューニングした結果が実運用環境に反映されやすくなります。それは、機械学習の社会適用において重要なことなのです。
交差検証法の使い道その1 スタッキング
スタッキングというのは機械学習の性能がなぜか上がる、アンサンブル手法の一種です。簡単に言えば、モデルの出力結果を入力とした新しい機械学習モデルを追加することを言います。特に複数のモデルの出力をまとめて新しい機械学習モデルの入力とすることが多いです。
この時、新しいモデルはテストデータの出力結果を入力として想定しなければなりません。学習データの出力結果は、教師ラベルに強くフィッティングしているので、そのまま新しいモデルに入力すると、過学習を引き起こしてしまいます。(火を見るより明らか)
学習データを入力とした時のテストデータの出力と似た出力はどのようにして手に入れたら良いでしょうか。そう、交差検証法で作った検証データの推論を使えば良いのです。
スタッキングという手法については、検索をかけるとたくさん記事があるのでそちらを参考にしてください。
交差検証法の使い道その2 データクリーニング
学習データというのは必ずしも完璧にラベル付されているわけでも、適切な画像になっているわけでもありません。そのようなデータセットを用いて学習を行うと用意に過学習を引き起こします。そのような事態を回避するためにはデータセットの中身をきれいにする必要があります。
しかし、ラベルが正しいかどうかはどのように判断したら良いでしょうか。人手ですべて目視で確認することもできますが、ラベル付に専門的な知識が必要な場合はどうでしょう。ラベルの正確性の検証には様々な方法がありますが、一旦、推論の結果と合うかどうかとか、推論の確信度が高いかどうかなどを確認してみるのが手っ取り早い方策だと思います。
その場合、学習データ全てに対しての推論結果が必要になります。それは、交差検証法によって手に入ります。
まとめ
学習データから予期される出力がすべて見れるだけで、データ分析の道筋は大きく広がります。それを可能にする交差検証法、やっといて損なことは絶対にないので、機械学習をやるのであれば、徹底して行いましょう。