leave-one-out 交差検証

leave-one-out cross validation は、正解データから 1 つだけ抜き出してテストデータとし、残りのデータを教師データとして、交差検証を行う方法である。これを、全ての組み合わせについて、学習と評価を繰り返す。ちょうど、k-fold cross validation のとき、k をデータ数とした場合と同じである。

正解データの数が多い時は、leave-one-out corss validation を用いない方がいい。その理由として、leave-one-out cross validation では、モデルの学習にはほぼ全てのデータを使っているので、既存のデータ(学習に利用したデータ)をうまく説明できるようなモデルが作成されやすくなる。このように作成したモデルは、あまりにも既存のデータにフィッティングしすぎて、未知のデータにうまく対応できなくなってしまう可能性がある。こうなってしまうと、わざわざ機械学習を利用して予測モデルを作る意味がなくなる。

Python の scikit learn では、LeaveOneOut クラスのメソッドで、one-leave-out cross validation 用の学習データとテストデータを作成することができる。

import numpy as np
from sklearn.model_selection import LeaveOneOut

x = np.array([[1, 2], [4, 3], [4, 6], [2, 2], [1, 2]])
y = np.array([1, 0, 0, 1, 1])

loo = LeaveOneOut()


for train_index, test_index in loo.split(x):
    print(train_index, test_index)
    ## [1 2 3 4] [0]
    ## [0 2 3 4] [1]
    ## [0 1 3 4] [2]
    ## [0 1 2 4] [3]
    ## [0 1 2 3] [4]