交差検証(k-fold CV)

限られたデータで過学習を見抜く交差検証。k-foldと層化k-foldの違いも整理します。

限られたデータを最大限活用する、交差検証の仕組みと実装。

白峰 リリ(普段) 白峰 リリ

ねぇ、データが少ないときに訓練・検証・テストへ分けると、それぞれちっちゃくなりすぎない?

神楽 モニカ 先生(笑顔) 神楽 モニカ 先生

その通り。 そういう時こそ交差検証(Cross Validation)の出番よ。

紅林 かえで(普段) 紅林 かえで

k-fold交差検証が代表的。 データをk等分(典型はk=5や10)し、(1)1つを検証用、残りk-1を訓練用にして学習・評価、(2)これをk回繰り返して、毎回別の塊を検証用に、(3)k回の評価結果を平均する。

藍沢 しずく(普段) 藍沢 しずく

1回だけの評価より、k回ぶんを平均した方が信頼できる、ってことですかぁ?

紅林 かえで(普段) 紅林 かえで

そう、データの偶然のばらつきを平均で打ち消せる。 また、全データが訓練と検証の両方に使われるので、データを最大限活用できる。

白峰 リリ(普段) 白峰 リリ

k=5ってことは、1回の学習で全データを訓練に使えるわけじゃないよね?

神楽 モニカ 先生(普段) 神楽 モニカ 先生

1回の学習では4/5(80%)を訓練、1/5(20%)を検証に使う。 これをデータの『どの塊を検証に使うか』を変えながら5回繰り返す。

紅林 かえで(普段) 紅林 かえで

分類問題でクラス比が偏っているなら層化k-foldを使うわ。 各foldのクラス比を均等にすることで偏りを防ぐの。

藍沢 しずく(笑顔) 藍沢 しずく

層化って、統計のサンプリングのところで出てきましたねぇ♪

白峰 リリ(普段) 白峰 リリ

k=N(全データ数)にしたらどうなるの?

神楽 モニカ 先生(普段) 神楽 モニカ 先生

それをLeave-One-Out CV(LOOCV)と呼ぶの。 各イテレーションで1サンプルだけ検証、残り全部を訓練。 計算コストが高いけれど、データが極端に少ないときに有効。

紅林 かえで(普段) 紅林 かえで

DS検定としては『k-foldの仕組み』『k=5/10という典型値』『層化k-foldがいつ必要か』、この3点を押さえておけば十分ということね。

藍沢 しずく(笑顔) 藍沢 しずく

しずく、ちゃんと覚えますぅ♪

from sklearn.model_selection import cross_val_score, KFold
from sklearn.linear_model import LogisticRegression

X, y = ...  # 特徴量とラベル
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(LogisticRegression(), X, y, cv=kf, scoring='accuracy')
print(f'CV accuracy: {scores.mean():.3f} (+/- {scores.std():.3f})')

確認クイズ

k-fold交差検証(k=5)で1モデルを評価する場合、何回モデル学習が行われるか。

  1. 1回
  2. 2回
  3. 5回
  4. 25回
こたえを見る

正解: 3. 5回

5回。 k=5 のときデータを5等分し、各回で異なる塊を検証用に、残り4塊を訓練用にして学習・評価を5回繰り返します。 5つの評価結果の平均を最終評価とします。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。