機械学習 モデル評価とハイパーパラメータのチューニング 層化k分割交差検証とLeaveOneOut

機械学習では、データを訓練データとテストデータに分割する。訓練データはモデルの訓練に使う。
 予測性能向上のため、パラメータ設定とチューニングから成果の比較は欠かせないが、これにテストデータを使うのは誤りである。
 訓練データをさらにわけて、検証データを確保し、これをモデルのパラメータチューニングに使い、テストデータは最終的なモデルの汎化誤差を測定に使用する。
 k分割交差検証は、訓練データを非復元抽出でk個に分割し、k-1個のデータを訓練し、最後の一つで検証を行う。この作業をk回繰り返した結果のk個の性能からモデルの推定平均性能が計算される。k=10が、最適な分割数であることが示されている。
 小さいデータセットの場合は、1個抜き(Leave-One-Out LOO)交差検証を使うのが望ましい。
 クラスの比率が均等でないケースでは、学習不足を引き起こすバイアスと過学習の原因となるバリアンスが改善される層化k分割交差検証を使う。
 乳癌データを使用した、層化k分割交差検証は以下のコードで行う。

import pandas as pd

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()
df = pd.DataFrame(np.c_[cancer['data'], cancer['target']],
                  columns= np.append(cancer['feature_names'], ['target']))
X = df.iloc[:,:-1].values
y = df.iloc[:, -1].values.astype(int)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20,
                     stratify=y,random_state=1)

train_test_splitのstratify=yで層化分割を指定している。
分割を10、並列化を1(使用CPU1)とした時の実装は以下の通りである。

from sklearn.model_selection import cross_val_score
scores = cross_val_score(estimator=pipe_lr,
                         X=X_train,
                         y=y_train,
                         cv=10,
                         n_jobs=1)
print('CV accuracy scores: %s' % scores)
print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
層化k分割交差検証結果
from sklearn.model_selection import LeaveOneOut
cv = LeaveOneOut()

#use LOOCV to evaluate model
scores = cross_val_score(estimator=pipe_lr,
                         X=X_train,
                         y=y_train,
                         cv=cv,
                         n_jobs=1)

LOOを使う場合、cvをLeaveOneOutとする。

この記事が気に入ったらサポートをしてみませんか?