データリーケージ ── テストデータの情報が訓練に混入する問題
Kaggleでも論文でも、 「再現できない高精度」の犯人No.1がデータリーケージです。 教育用ノートブックでもしばしば見落とされるため、 検出と防止の習慣付けが重要です。
3つの典型パターンを実例で:
リーケージの数学的本質は「独立同分布(i.i.d.)仮定の崩壊」:
リーケージは、 この独立性が情報経路(特徴量、 前処理、 時間順)を通じて破られた状態です。
SSDSE-B(47都道府県)で「人口」を予測する想定の悪い例/良い例:
| ❌ NG | ✅ OK | |
|---|---|---|
| 分割 | StandardScaler を fit(df) してから train_test_split | train_test_split してから scaler.fit(X_train)、 X_test には transform のみ |
| 特徴量 | 「世帯数」「年間出生数」など人口で割って作る指標を含める | 人口とは独立に観測される指標のみ使用 |
| 結果 | R²=0.999(怪しいほど高い) | R²=0.85(妥当な範囲) |
最小限のスニペットで動作確認できる例。 公的データ(SSDSE 等)を想定しています。
1 2 3 4 5 6 7 8 9 10 11 12 | # 良い例:Pipeline で前処理を train のみに fit from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score pipe = Pipeline([ ('scaler', StandardScaler()), # cv の各 fold で train のみに fit される ('model', Ridge(alpha=1.0)) ]) scores = cross_val_score(pipe, X, y, cv=5, scoring='r2') print(scores.mean()) # リーケージなしの正しい評価 |