回帰モデルやクラス分類モデルを検証するときの話です。
モデルの検証
一般的には、データセットが与えられたとき、サンプルをモデル構築用サンプル (トレーニングデータ, training dataset) とモデル検証用サンプル (テストデータ, test dataset) に分けます。そして、トレーニングデータで構築された回帰モデルやクラス分類モデルの推定性能を、テストデータで検証します。
回帰分析手法・クラス分類手法の中には、モデルを構築する前に決めておかなければならないパラメータ (ハイパーパラメータ) が存在します。たとえば、Partial Least Squares (PLS) における成分数、Support Vector Machine (SVM) における C やガウシアンカーネルの γ などです。このようなハイパーパラメータの値の決め方として、クロスバリデーションが一般的です。クロスバリデーションの概念図が以下になります。
この図は、3-fold クロスバリデーションの例です。まず、トレーニングデータのサンプルを3つのブロックにランダムに分けます。90サンプルあったら、ランダムに30サンプル・30サンプル・30サンプルに分割するわけです。そして、2つブロックでモデルを構築して、残りの1つのブロックのyを予測する、といったことを、すべてのブロックが1度 予測用ブロックになるまで3回繰り返すわけです。クロスバリデーションを行った後のyの推定値と実際のyの値との間で、回帰分析であれば r2、クラス分類であれば正解率などの指標を計算します。そして、ハイパーパラメータの値 (の組み合わせ) ごとにクロスバリデーションを行い、指標の値が最もよくなるハイパーパラメータの値を選びます。ここで選んだハイパーパラメータの値を用いて、すべてのトレーニングデータでモデルを構築して、そのモデルの推定性能をテストデータで検証します。
ちなみに、実際によく用いられるのは、5-fold クロスバリデーションや2-fold クロスバリデーションです。
モデルの検証について、詳しくはこちらご覧ください↓。
テストデータって必要? → 必要!
クロスバリデーションによって、モデルを構築したサンプルではないサンプルのyの値を推定しています。ある程度 モデルの推定性能を確認できているはずです。新たにモデルの推定性能を検証するためにテストデータは必要でしょうか。
テストデータは必要です。なぜなら、クロスバリデーションの結果がよくなるようにハイパーパラメータの値を決めているからです。つまり、クロスバリデーションの結果を実測値にフィッティング (適合) してハイパーパラメータの値を決定しているようなものです。たとえクロスバリデーションをしたとしても、ハイパーパラメータを決めることに関しては、モデル構築用データですので、基本的には最初にトレーニングデータとテストデータに分ける必要があります。
ダブルクロスバリデーション (モデルクロスバリデーション)
ただ、最初のデータセットにおけるサンプル数が極端に小さいときは、どうしましょうか。たとえば、30サンプルとか。ただでさえサンプルが少ないのに、さらにトレーニングデータとテストデータに分けると、モデルを構築するためのサンプルが、さらに少なくなってしまいます。これでは安定的にモデルを構築することができません。
このようなサンプルが少ないときでも、適切にモデルの推定性能を検証するために、ダブルクロスバリデーション (モデルクロスバリデーション) が利用されます。ダブルクロスバリデーションとは、クロスバリデーションを入れ子にして、二重でクロスバリデーションをすることです。今、2重のクロスバリデーションを、外側のクロスバリデーションと内側のクロスバリデーションと呼びましょう。下にもう一度クロスバリデーションの図をのせます。
これを、2重のクロスバリデーションのうちの、外側のクロスバリデーションとしましょう。この外側のクロスバリデーションでは、ハイパーパラメータの決定は行いません。図の左下の、2ブロックを用いてモデルを構築するところを考えてみます。この2ブロックでクロスバリデーション、つまり内側のクロスバリデーションで、ハイパーパラメータの最適化を行います。そして、ハイパーパラメータを最適化したあと、もう1つのブロックの予測をするわけです。この予測値を積み重ねることが、外側のクロスバリデーションに対応します。
内側のクロスバリデーションではハイパーパラメータの最適化を行っていますが、外側のクロスバリデーションではただ予測を行っているだけです。この外側のクロスバリデーションにおける予測は、トレーニングデータとテストデータとに分け、トレーニングデータでモデルを構築しテストデータの予測すること、に対応します。このダブルクロスバリデーションにおける外側のクロスバリデーションの推定値と実測値との比較を行うことで、モデルの推定精度を検証するわけです。
ダブルクロスバリデーションを行うときは、基本的にはサンプル数は少ないはずです。なので、leave-one-out クロスバリデーションという、1サンプルを予測用データにして残りのサンプルでモデルを構築することをサンプル数だけ繰り返すクロスバリデーション (ブロックの数をサンプルの数にするということ) を行うことになると思います。ただ、5-fold クロスバリデーションや2-fold クロスバリデーションなど行うとき、ランダムにサンプルを分けるので、乱数の具合によって結果が多少変わってしまいます。そのため、ダブルクロスバリデーションを何回か行って、その結果の平均やばらつきを確認するとより細かくモデルを検証できます。
[New] こちらの DCEKit で、便利にダブルクロスバリデーションをご利用いただけます。
参考資料
以上です。
質問やコメントなどありましたら、twitter, facebook, メールなどでご連絡いただけるとうれしいです。