論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
データリーケージ
Data Leakage
ML基礎
別称: 情報漏洩

🔖 キーワード索引

情報漏洩過学習評価バイアス時系列target leakagetrain-test split

💡 30秒で分かる結論

データリーケージ ── テストデータの情報が訓練に混入する問題

📍 文脈 ── どこで出会うか

Kaggleでも論文でも、 「再現できない高精度」の犯人No.1がデータリーケージです。 教育用ノートブックでもしばしば見落とされるため、 検出と防止の習慣付けが重要です。

🎨 直感で掴む

3つの典型パターンを実例で:

パターンA:目的変数の代替を入れてしまう
「がんの有無」を予測したいのに、 説明変数に「がん治療フラグ」を入れる。 学習データではほぼ完璧に予測できるが、 本番で「治療フラグはまだ立っていない患者」に対しては無力。
パターンB:前処理を全データで実施
全データの平均で標準化 → trainとtestの統計量が混ざる → testの情報がtrainに漏れる。 「StandardScaler を fit_transform で全体に」が典型的アンチパターン。
パターンC:時系列でランダム分割
未来のデータが訓練に、 過去のデータがテストに入ってしまう。 「明日の株価を昨日のデータで答え合わせ」になってしまう。

📐 定義/数式

リーケージの数学的本質は「独立同分布(i.i.d.)仮定の崩壊」:

【正しい設定】
$$(X_{\text{train}}, y_{\text{train}}) \perp (X_{\text{test}}, y_{\text{test}})$$
訓練データとテストデータは独立でなければならない

リーケージは、 この独立性が情報経路(特徴量、 前処理、 時間順)を通じて破られた状態です。

🔬 記号を読み解く

Target leakage(目的変数漏洩)
目的変数の値が決まったに観測される情報を特徴量に入れる
Train-test contamination(前処理漏洩)
標準化・欠損補完・カテゴリエンコードを全データで実施
Group leakage(グループ漏洩)
同一患者のデータが train と test の両方に分散
Temporal leakage(時間漏洩)
時系列でランダム分割し、 未来が訓練側に入る

🧮 実値で計算してみる

SSDSE-B(47都道府県)で「人口」を予測する想定の悪い例/良い例:

❌ NG✅ OK
分割StandardScaler を fit(df) してから train_test_splittrain_test_split してから scaler.fit(X_train)、 X_test には transform のみ
特徴量「世帯数」「年間出生数」など人口で割って作る指標を含める人口とは独立に観測される指標のみ使用
結果R²=0.999(怪しいほど高い)R²=0.85(妥当な範囲)

🐍 Python 実装

最小限のスニペットで動作確認できる例。 公的データ(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())  # リーケージなしの正しい評価

⚠️ よくある落とし穴

❌ 1. 「精度が高すぎる」のを喜ぶ
CVで0.99超えは大体リーケージ。 まず特徴量を1つずつ抜いて挙動を確認
❌ 2. SMOTEなどoversamplingを分割前に実施
同じレコードがtrainとtestに散らばってリーク。 必ず分割にtrain側だけで
❌ 3. 欠損補完を全データで実施
fit_transform(df.full) → split は典型アンチパターン
❌ 4. 時系列でshuffle=True
TimeSeriesSplit や明示的な時刻による cutoff を使う
❌ 5. 「IDが特徴量に含まれている」のを見落とす
患者ID等が無作為に見えて目的変数と相関している場合あり

📚 関連グループ教材

この用語の全体像を学ぶには、 横断的な教材で文脈を掴むのが効率的です。

🔎 深掘り解説

📛 著名なリーケージ事例

🔍 リーケージを見抜く7つの兆候

  1. CVスコアが「異常に高い」(0.99 など)
  2. train と test の精度がほぼ同じで両方とも高い(過学習でなく漏洩)
  3. 1つの特徴量が単独で精度の大半を担う
  4. 特徴量名に「target」「label」「result」を含む
  5. 本番投入後、 精度が10倍以上劣化
  6. 時系列で「未来の集計指標」が特徴量に
  7. 群(患者、 ユーザ)が train/test で重複

時系列リーケージの専門対策

✅ 使う前のチェックリスト

📖 さらに学ぶには

本サイト内

外部リソース

困ったときは

  1. データの可視化(散布図、 ヒストグラム、 箱ひげ図)で異常を確認
  2. サンプルサイズ・欠損・外れ値を確認
  3. 仮定が満たされているか診断(正規性検定、 等分散性検定など)
  4. 類似研究での標準的な手法を確認
  5. 結果を複数手法でクロスチェック(頑健性確認)

🔎 深掘り解説

📛 著名なリーケージ事例

🔍 リーケージを見抜く7つの兆候

  1. CVスコアが「異常に高い」(0.99 など)
  2. train と test の精度がほぼ同じで両方とも高い(過学習でなく漏洩)
  3. 1つの特徴量が単独で精度の大半を担う
  4. 特徴量名に「target」「label」「result」を含む
  5. 本番投入後、 精度が10倍以上劣化
  6. 時系列で「未来の集計指標」が特徴量に
  7. 群(患者、 ユーザ)が train/test で重複

時系列リーケージの専門対策

✅ 使う前のチェックリスト

📖 さらに学ぶには

本サイト内

外部リソース

困ったときは

  1. データの可視化(散布図、 ヒストグラム、 箱ひげ図)で異常を確認
  2. サンプルサイズ・欠損・外れ値を確認
  3. 仮定が満たされているか診断(正規性検定、 等分散性検定など)
  4. 類似研究での標準的な手法を確認
  5. 結果を複数手法でクロスチェック(頑健性確認)