Kaggle Tutorial

検証戦略 I — 分割方法の使い分け

KFold / Stratified / Group / TimeSeriesSplit を、データの構造に合わせて選ぶ方法を学びます。

検証は「本番の予測状況」を再現する#

交差検証の目的は、本番(テスト)で予測する状況を手元で再現することです。 データの構造(クラス・グループ・時間)を無視した分割は、当てにならないスコアを生みます。

分割方法の使い分け#

手法使う場面狙い
K-Foldi.i.d. な一般データ標準。ランダムに K 分割
Stratified K-Fold分類(特に不均衡)各 fold のクラス比率を保つ
Group K-Fold同一エンティティが複数行同じグループを訓練と検証に跨らせない
時系列分割時系列データ過去で学習し未来で検証する
from sklearn.model_selection import StratifiedKFold, GroupKFold, TimeSeriesSplit

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
gkf = GroupKFold(n_splits=5)                  # groups= を指定
tss = TimeSeriesSplit(n_splits=5)             # 時間順を保つ

グループリークの例#

同じユーザーの行が訓練と検証の両方に入ると、モデルは「そのユーザーを覚える」だけで 高スコアを出し、本番(未知ユーザー)で崩れます。これがグループリークです。

# ユーザー単位で分割し、同一ユーザーが跨らないようにする
for tr, va in gkf.split(X, y, groups=df["user_id"]):
    ...

注意

時系列で通常の K-Fold を使うと、未来のデータで過去を予測してしまいデータリークになります。 時間順序のあるデータでは必ず時系列分割を使いましょう。

理解度チェック#

Quiz同じユーザーの行が複数あるデータで、本番(未知ユーザー)の性能を正しく測る分割は?

次のステップ#

次は、CV と LB の関係やリーク検出(adversarial validation 入口)を学びます。