今回は交差検証の概要と、fold数と予測誤差の関係性についてまとめます。
交差検証(Cross validation)とは
交差検証(Cross validation, CV)とは、モデルの予測誤差を推測するテクニックであり、機械学習では広く使われています。
データ数が少ない場合にモデルの過学習を防ぐことができる点で有効です。
交差検証の考えは次のようになります。
- 訓練データのサブセットを使って学習を行い、残りのデータに対して検証を行う。
- 異なるサブセットを使って1を繰り返す。
K-分割交差検証(K-Fold cross validation)
続いて、交差検証の代表例であるK-分割交差検証(K-Fold cross validation)について説明していきます。
手順は以下のとおり。
- データをK個のグループ(folds)に分ける。
- k = 1,…,Kとして、k個目のfoldを検証セット(validation set)とし、残りのデータで学習を行う。
- 各モデルにおける予測誤差の平均を計算し、全体の予測誤差とする。

K = 1の場合はCVではなく、ただのホールドアウト法(Hold-out)になります。
K = n(サンプルサイズ)の場合は、特別にleave-one-out (LOO) cross validationと呼ばれています。
LOO CVでは、1つのサンプルに対して検証を行い、学習を残りのデータを使うことになります。
scikit-learnによるK-fold CV
Pythonの機械学習ライブラリであるscikit-learnを使えば、簡単にK-Fold CVを実行することができます。
1 2 3 4 5 6 7 8 9 |
from sklearn.model_selection import KFold # K-Fold CVをインスタンス kf = KFold(n_splits=5, shuffle=True, random_state=42) for train_idx, val_idx in kf.split(X_train): # 訓練データと検証データのindexを取り出せる X_train2, X_val = X_train[train_idx], X_train[val_idx] y_train2, y_val = y_train[train_idx], y_train[val_idx] |
n_splitsで分割数を指定します。
インスタンスする際にrandom_stateの値を設定しておかないと、毎回異なるサブセットを得てしまい結果の再現が取れないので注意しましょう。
scikit-learnでは、各foldに含まれるクラスの割合を等しくするStratified K-Foldも実装されており、極端に頻度の少ないクラスを含む不均衡データを扱う際に有効です。
fold数を決める際に考えるべきこと
分割数を決める際に考えるべきこととして、以下の2つがあります。
- 交差検証によって得られた予測誤差は、実際の予測誤差をどれほど近似できているか
- 訓練データに変化があった場合に、交差検証で得た予測誤差はどれほど変わるのか
上の2つはスタンフォード大学の”Fundamentals of Data Science“の講義ノートを翻訳して引用しています。
1. 交差検証によって得られた予測誤差は、実際の予測誤差をどれほど近似できているか
K = nのとき、つまりleave-one-out cross validationを使うケースについて考えてみましょう。
この場合、各foldにおけるtraining setはtraining data全体とほとんど同じになります。
training dataからvalidation用のサンプルを1つ取り除いたデータ群が、各foldにおけるtraining setになるからですね。
そしてもちろん、CV予測誤差に関してもtraining data全体で学習させた時の予測誤差とほぼ同じになります。
反対にK << nのとき、各モデルはtraining data全体よりはるかに少ない数のサンプルを使って学習を行うことなります。
そのため、各foldのモデルにおける汎化誤差は大きくなり、それを平均したCV予測誤差も大きくなる傾向にあります。
2. 訓練データに変化があった場合に、交差検証で得た予測誤差はどれほど変わるのか
K = nのとき、先ほどの説明と同様に、各foldにおけるtraining setはtraining data全体とほぼ同じになるため、CV予測誤差はtraining dataの変化に対して敏感になります。
K << nの場合は、モデル同士の相関は低くなり、CV予測誤差はtraining dataの変化に対してそれほど敏感にはなりません。
まとめ
fold数を増やせば増やすほど学習データの量を確保でき、モデルの精度向上に繋がりますし、先述の通り予測誤差を正確に評価できます。
しかし、fold数が増えると計算コストの上昇につながることや、training dataの変化に対してsensitiveになること、サンプルサイズが十分に大きい場合は高い計算コストに対して得られるリターンが少なくなることを考慮に入れておく必要があります。
結局、fold数による影響は問題設定に強く依存してしまうので、色々試してみるのが良さそうです。
もっとも、ほとんどのケースではfold数は5-10の範囲で十分なことが多いようです。
References
- R. Johari, “Lecture 5: In-sample estimation of prediction error”, Stanford MS&E – Fundamentals of Data Science, Autumn 2019 [link].
- 門脇 大輔、阪田 隆司、保坂 桂佑、平松 雄司『Kaggleで勝つデータ分析の技術』技術評論社、2019年、p.275-280 .
コメントを残す