今回はデータの分割方法について整理します🐜
学習データとテストデータ
機械学習モデルを構築するとき、集めてきたデータとモデルの推定値の誤差が小さくなるよう調整する。しかし、これだけでは未知のデータに対する良し悪し、つまり汎化能力が不明である。そこで一般には手元にあるデータを、モデル構築用の学習データと、汎化性能比較用のテストデータに分割し、既知のデータと未知のデータの両面から機械学習モデルを評価・構築する。
ここで、対象とするデータの母集団とし、抽出する次元の特徴量の分布をとしたとき、このを真の分布と呼ぶ。仮に母集団すべてのデータが収集できたとすると、真の分布に従う学習データでモデルを設計し、真の分布に従うテストデータでテストしたときの誤り率を真の誤り率と呼ぶ。
しかし、実際には母集団のデータを収集することは不可能なので、収集したデータを学習データと、テストデータに分割する。それぞれの次元の特徴量の分布をととすれば、を使ってモデルを設計し、を使ってテストしたときの誤り率はと書く。
なお、学習データを使ってモデルを設計し、同じ学習データを使ってテストしたときの誤り率を再代入誤り率と呼ぶ。
以下でこのデータ分割方法を述べる。
ホールドアウト法
ホールドアウト法(holdout)とは、データを学習データとテストデータの2つに分割する手法である。このときの誤り率をホールドアウト誤り率といい、と書く。このホールドアウト誤り率と真の誤り率、再代入誤り率には、以下の関係式が成り立つ。
は学習データを使ってモデルを設計し、学習データを使ってテストもしたときの誤り率の期待値を表す。
は学習データを使ってモデルを設計し、テストデータを使ってテストしたときの誤り率の期待値を表す。
このようにホールドアウト法はデータを2分割するシンプル手法である。ただし、学習データを多くすれば学習精度は良くなるが、その分だけ汎化能力の評価精度は悪くなり、その逆も同じである。したがって、収集したデータが大量にあるとき以外は、よい評価ができない。
交差確認法
交差確認法(cross validation)とは、収集したデータを個のグループに分割し、番目のグループをテストデータ、それ以外の個のグループを学習データとし、これを回繰り返す手法である。交差検証やクロスバリデーションともいう。
番目のグループでテストしたときの誤り率をとすると、誤識別率は
と書ける。この回の誤り率の平均値で汎化能力を評価する。
交差確認法はホールドアウト法と違い、収集したすべてのデータを学習とテストに用いるため、精度良くモデルの性能を評価できる。ただし、分割の仕方によってデータに偏りが生じるので、分割を変えて交差確認法を複数回実施することが必要である。
一つ抜き法(leave-one-out)
一つ抜き法とは、交差確認法において収集したデータ数と分割するグループ数を等しくした手法である1。つまり、テストデータは1つで、学習データはそれ以外全部となる。この方法では学習データとテストデータの組み合わせが1つしかないので、1回行えば良い。
ブートストラップ法(bootstrap)
ブートストラップ法とは、収集したデータを同じ数だけ重複を許してランダム抽出(復元抽出)して、新たな標本データを作成する手法である。これにより、再代入誤り率のバイアスを小さくできる。
より詳細に考えてみる。まず、収集したデータ数をとし、このデータすべてを使ってモデルを設計し、同じデータを使ってテストしたときの誤り率、つまり再代入誤り率はとなる。このときの誤識別率は真の誤識別率は小さくなる。この差をバイアスと呼ぶ。
ここでブートストラップ法を採用する。収集したデータと同じ数回だけ復元抽出したデータを、ブートストラップサンプルと呼ぶ。ところで、ブートストラップ法では1度も抽出されないサンプルが生じる。回の抽出で少なくとも1度は抽出される確率は次式となる。
このブートストラップサンプルでモデルを設計し、ブートストラップサンプルでテストしたときの誤識別率を[tex: \varepsilon(N, N) ]としたとき、バイアスは、もとのデータでテストしたときの誤識別率との差で推定する。
これでは精度が足りないので、複数のブートストラップサンプル(50以上を推奨)を作成し、それらのバイアスの平均値をバイアスの推定値とすると、誤識別率は
と推定できる。
おわりに
自分なりにデータ分割方法をまとめてみました。
どれがどれだか混乱することもあったのですが、だいぶスッキリしました。
参考になれば幸いです(^^)
参考文献
- リンク「第2章識別規則と学習法の概要」が該当します。
- リンク「第1章序論1.1多項式曲線フィッティング」と「第1章序論1.3モデル選択」が該当します。私は辞書的な使い方をしています。
- ジャックナイフとも呼ぶらしい。なぜ???↩