限られたデータを最大限活用する、交差検証の仕組みと実装。
ねぇ、データが少ないときに訓練・検証・テストへ分けると、それぞれちっちゃくなりすぎない?
その通り。 そういう時こそ交差検証(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回
- 2回
- 5回
- 25回
こたえを見る
正解: 3. 5回
5回。 k=5 のときデータを5等分し、各回で異なる塊を検証用に、残り4塊を訓練用にして学習・評価を5回繰り返します。 5つの評価結果の平均を最終評価とします。