はじめに
scikit-learnのtrain_test_splitを使ってモデルの精度を測った後、もう一度プログラムを実行したらスコアが変わってしまい、「あれ?」と思ったことはありませんか?
これは、データの分割がランダムに行われるために起こる現象です。今回は、この「結果のばらつき」問題を解決し、より信頼性の高いモデル評価を行うための「交差検証」という手法についてまとめます。正直私は名前が難しくて苦手でした...しかし、意味が分かればそんなことはないと思います。
なぜ実行するたびに結果が変わるのか?
train_test_splitは、データをランダムにシャッフルしてから訓練用とテスト用に分割します。そのため、実行のたびに分割のされ方が変わり、テストデータの内容も微妙に変化します。
特にデータ数が少ない場合、「たまたま簡単なサンプルばかりがテストデータになった」回では高い精度が出て、「たまたま難しいサンプルが多かった」回では低い精度が出る、ということが起こり得ます。
評価の信頼性を高める「交差検証 (Cross-Validation)」
一度の分割で評価するのではなく、複数回の分割・評価の結果を平均(交差)することで、より安定した評価値を得ようというのが交差検証の考え方です。先ほど名前が苦手と書きましたが、イメージをとらえる上で重要ですね。
最も一般的なk-分割交差検証 (k-fold Cross-Validation) では、以下のような手順で評価を行います。
- データをk個のブロック(fold)に分割する
- 1つ目のブロックをテストデータ、残りの(k-1)個を訓練データとして学習・評価する
- 2つ目のブロックをテストデータ、残りを訓練データとして学習・評価する
- これをk回繰り返し、得られたk個の評価スコアの平均値を最終的なモデルの性能とする
イメージ

出典:https://www.tech-teacher.jp/blog/cross-validation/
これにより、特定のデータ分割に依存しない、より公平で信頼性の高いモデル評価が可能になります。