バリデーションによるモデル選択
モデル選択
過学習と汎化能力にあるように、未知のデータに対する評価が高い(=汎化能力が高い)モデルがほしい しかし、未知のデータは手元にない
なので、モデルの評価のためのデータ分割にあるように、「仮想的な未知のデータ」として、手持ちのデータを分割して、学習用と検証用にそれぞれ使用することを考える 異なるアルゴリズムを用いたり、ハイパーパラメータを変えたりして、モデルをたくさんつくって、検証用データに対する性能の良いモデルを選択する、という手順をとるのが基本的なやりかた
この検証(バリデーション, validation)を、手持ちのデータからどのように行うか、ということについて、さまざまな方法がある
ホールドアウト法
https://gyazo.com/1f23a8f4dd8f3dd792b698385ce477f3
図は『第3版 Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)』より引用
モデルの評価のためのデータ分割にあるように、学習データとテストデータに分けたうえで、学習データをさらに学習用と検証用に再分割する(注:上の図では「学習」は「訓練」となっている) 学習データとテストデータを分けるときと同様、sklearn.model_selection.train_test_splitが使える
アルゴリズムやハイパーパラメータを変えて、学習用のデータセットで学習して、検証用のデータセットで評価する、ということを繰り返して、最も検証用のデータセットに対する評価が高かったアルゴリズムやハイパーパラメータを「採用」する、というやりかた
ただしこの方法では、「学習用と検証用の分割のしかた」によって、結果が変わってしまう恐れがある(分割のしかたのばらつきが結果に影響を及ぼしやすい)
k分割クロスバリデーション(交差検証)(k-fold cross validation)
https://gyazo.com/92fb597d81ddbf6717432becf3508e33
図は『第3版 Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)』より引用
学習データを$ k分割して、ひとつを検証用、残りの$ k-1個を学習用として使う
これを$ k回繰り返し、$ k回の評価の平均をもって、モデルの性能評価とする
これで最もよいアルゴリズムやパラメータを「採用」する
ホールドアウト法よりも、「分割のしかたのばらつき」をおさえられるため、ロバスト(頑健)な評価ができる
層化k分割(stratified k-fold)クロスバリデーション(交差検証)
データを$ k分割するとき、クラスの比率が各分割で均等になるように抽出する方法
とくにクラスの比率が均等でない場合には有効
1個抜き(Leave-one-out: LOO)クロスバリデーション(交差検証)
分割の個数をデータ数と同じにする方法
データ数が小さい場合には有効といわれる