ari23の研究ノート

メーカ勤務エンジニアの技術ブログです

データ分割

今回はデータの分割方法について整理します🐜

学習データとテストデータ

機械学習モデルを構築するとき、集めてきたデータとモデルの推定値の誤差が小さくなるよう調整する。しかし、これだけでは未知のデータに対する良し悪し、つまり汎化能力が不明である。そこで一般には手元にあるデータを、モデル構築用の学習データと、汎化性能比較用のテストデータに分割し、既知のデータと未知のデータの両面から機械学習モデルを評価・構築する。

ここで、対象とするデータの母集団 D とし、抽出する d 次元の特徴量の分布を p としたとき、この p 真の分布と呼ぶ。仮に母集団すべてのデータが収集できたとすると、真の分布 p に従う学習データでモデルを設計し、真の分布 p に従うテストデータでテストしたときの誤り率 \varepsilon(p,p) 真の誤り率と呼ぶ。

母集団と標本
母集団と標本

しかし、実際には母集団のデータを収集することは不可能なので、収集したデータを学習データ D_L と、テストデータ D_T に分割する。それぞれの d 次元の特徴量の分布を p_L  p_T とすれば、 D_L を使ってモデルを設計し、 D_T を使ってテストしたときの誤り率は \varepsilon(p_L, p_T) と書く。

なお、学習データを使ってモデルを設計し、同じ学習データを使ってテストしたときの誤り率 \varepsilon(p_L, p_L) 再代入誤り率と呼ぶ。

以下でこのデータ分割方法を述べる。

ホールドアウト法

ホールドアウト法(holdout)とは、データを学習データ D_L とテストデータ D_L の2つに分割する手法である。このときの誤り率をホールドアウト誤り率といい、 \varepsilon(p_L, p_T) と書く。このホールドアウト誤り率と真の誤り率、再代入誤り率には、以下の関係式が成り立つ。

 \displaystyle
E_{D_{L}} \{ \varepsilon(p_L, p_L) \} \leq \varepsilon(p, p) \leq E_{D_{T}} \{ \varepsilon(p_L, p_T) \}

 E_{D_{L}}{} は学習データ D_L を使ってモデルを設計し、学習データ D_L を使ってテストもしたときの誤り率の期待値を表す。
 E_{D_{T}}{} は学習データ D_L を使ってモデルを設計し、テストデータ D_T を使ってテストしたときの誤り率の期待値を表す。

このようにホールドアウト法はデータを2分割するシンプル手法である。ただし、学習データを多くすれば学習精度は良くなるが、その分だけ汎化能力の評価精度は悪くなり、その逆も同じである。したがって、収集したデータが大量にあるとき以外は、よい評価ができない。

ホールドアウト法
ホールドアウト法

交差確認法

交差確認法(cross validation)とは、収集したデータを m 個のグループに分割し、 i 番目のグループをテストデータ、それ以外の m-1 個のグループを学習データとし、これを m 回繰り返す手法である。交差検証やクロスバリデーションともいう。

 i 番目のグループでテストしたときの誤り率を \varepsilon_{i} とすると、誤識別率 \varepsilon

 \displaystyle
\varepsilon = \frac{1}{m} \sum_{i=1}^{m}{\varepsilon_{i}}

と書ける。この m 回の誤り率の平均値で汎化能力を評価する。

交差確認法はホールドアウト法と違い、収集したすべてのデータを学習とテストに用いるため、精度良くモデルの性能を評価できる。ただし、分割の仕方によってデータに偏りが生じるので、分割を変えて交差確認法を複数回実施することが必要である。

交差確認法
交差確認法

一つ抜き法(leave-one-out)

一つ抜き法とは、交差確認法において収集したデータ数と分割するグループ数を等しくした手法である1。つまり、テストデータは1つで、学習データはそれ以外全部となる。この方法では学習データとテストデータの組み合わせが1つしかないので、1回行えば良い。

一つ抜き法
一つ抜き法

ブートストラップ法(bootstrap)

ブートストラップ法とは、収集したデータを同じ数だけ重複を許してランダム抽出(復元抽出)して、新たな標本データを作成する手法である。これにより、再代入誤り率のバイアスを小さくできる。

より詳細に考えてみる。まず、収集したデータ数を N とし、このデータすべてを使ってモデルを設計し、同じデータを使ってテストしたときの誤り率、つまり再代入誤り率は \varepsilon(N, N) となる。このときの誤識別率は真の誤識別率は小さくなる。この差をバイアスと呼ぶ。

ここでブートストラップ法を採用する。収集したデータと同じ数 N 回だけ復元抽出したデータを、ブートストラップサンプル N* と呼ぶ。ところで、ブートストラップ法では1度も抽出されないサンプルが生じる。 N 回の抽出で少なくとも1度は抽出される確率 p' は次式となる。

 \displaystyle
p' = 1 - \Bigl(1 - \frac{1}{N} \Bigl)^{N} \approx 1 - e^{-1} \fallingdotseq 0.632

このブートストラップサンプルでモデルを設計し、ブートストラップサンプルでテストしたときの誤識別率を[tex: \varepsilon(N, N) ]としたとき、バイアスは、もとのデータ N でテストしたときの誤識別率との差で推定する。

 \displaystyle
{\rm{bias}} = \varepsilon(N*, N*) - \varepsilon(N*, N)

これでは精度が足りないので、複数のブートストラップサンプル(50以上を推奨)を作成し、それらのバイアスの平均値をバイアスの推定値 \rm{\overline{bias}} とすると、誤識別率 \varepsilon

 \displaystyle
\varepsilon = \varepsilon(N, N) - \rm{\overline{bias}}

と推定できる。

ブートストラップ法
ブートストラップ法

おわりに

自分なりにデータ分割方法をまとめてみました。

どれがどれだか混乱することもあったのですが、だいぶスッキリしました。

参考になれば幸いです(^^)

参考文献

  • 「第2章識別規則と学習法の概要」が該当します。

  • 「第1章序論1.1多項式曲線フィッティング」と「第1章序論1.3モデル選択」が該当します。私は辞書的な使い方をしています。


  1. ジャックナイフとも呼ぶらしい。なぜ???