予測モデルの汎化性能を正確に検証する方法

k-fold cross validation

k-分割交差検証は、予測モデルの汎化性能を正確に検証するための方法である。訓練データセットを訓練サブセット、検証サブセット、およびテストサブセットに分けるホールドアウト法でモデルの学習と評価を繰り返すと、そのモデルは検証サブセットに適合してしまうリスクがある。これを対処するために、k-分割交差検証が用いられている。

k-分割交差検証は、訓練データセットを k 個のサブセットに分割して、そのうち k - 1 個のサブセットで学習し、残りの 1 個のサブセットで検証するという作業をすべての組み合わせに対して行う検証方法である。k 分割の場合は、計 k 回の学習と評価を繰り返すことになる。たとえば、k = 5 の交差検証のとき、訓練データをまず 5 分割する。ここで説明しやすいように 5 分割してできたデータのサブセットをそれぞれ、s1、s2、s3、s4、s5 とおく。

K-分割交差検証。データを k セットに分割する。

データを 5 分割したのち、まずは s2、s3、s4、s5 のサブセットを訓練サブセットとしてモデルの学習を進める。続いて、s1 を検証サブセットとして、モデルの検証を行う。このときに得られる評価指標(例えば精度や F1 値など)を e1 とする。

次に、s2、s3、s4、s5 で学習し、s1 で評価を行う。同様にして、サブセットを入れ替えながら学習と評価を繰り返す。すべての組み合わせに対して学習と評価を繰り返すことで、k 個の評価指標が得られる。そして、これら k 個の評価指標の平均値を計算し、その平均値を最終的な評価指標とする。

K-分割交差検証。k セットに分割されたデータのうち 1 セットだけをテスト用として残して、他をトレーニング用としてモデルを作成する。。

評価指標として利用される指標は、感度、特異度、再現率、F1 などがある(機械学習の評価指標)。

Python の scikit learn では、KFold クラスのメソッドを利用すると、k-fold cross validation 用の学習データと評価データを作成することができる。

import numpy as np
from sklearn.model_selection import KFold
x = np.array([[1, 2], [3, 4], [4, 3], [1, 2], [3, 4], [5, 6], [6, 4], [1, 2], [2, 2], [1, 2]])
y = np.array([1, 0, 0, 1, 0, 0, 0, 1, 1, 1])
kf = KFold(n_splits = 5, shuffle = True)

for train_index, test_index in kf.split(x):
    print(train_index, test_index)
    ## [1 2 4 5 6 7 8 9] [0 3]
    ## [0 1 2 3 5 6 7 9] [4 8]
    ## [0 1 3 4 5 6 8 9] [2 7]
    ## [0 2 3 4 5 6 7 8] [1 9]
    ## [0 1 2 3 4 7 8 9] [5 6]