adversarial validation
train と test の分布差を分類器で検出し、検証設計や特徴選択に活かす方法を学びます。
分布差を疑う#
train と test の分布が違うと、CV が本番を反映せずシェイクアップの原因になります。 敵対的検証は、train と test を見分ける分類器を作って分布差を測る手法です。
やり方#
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import roc_auc_score
# train=0 / test=1 のラベルを付けて結合
adv = pd.concat([train.assign(is_test=0), test.assign(is_test=1)], ignore_index=True)
y = adv["is_test"]
X = adv.drop(columns=["is_test", target]) # 目的変数は除く
oof = cross_val_predict(lgb.LGBMClassifier(), X, y, cv=5, method="predict_proba")[:, 1]
print("adversarial AUC:", roc_auc_score(y, oof))AUC の読み方#
- AUC ≈ 0.5:train と test を見分けられない=分布はほぼ同じ。CV を信頼しやすい
- AUC が高い(例 0.8+):分布が大きく違う。検証設計や特徴を見直す合図
分布差の原因を探すには、この分類器の特徴量重要度を見ます。重要度が高い特徴ほど、 train/test を区別している(分布がずれている)特徴です。
対策に活かす#
- 検証分割:test に近い train サンプルを検証に使い、本番に近い CV を作る
- 特徴選択:分布がずれすぎる特徴を落とす/補正する
- サンプル重み:test に近い train を重視して学習する
ヒント
adversarial validation は「CV が当てにならない理由」を可視化する診断ツールです。 スコアが CV と LB で食い違うとき、まずこれで分布差を確認しましょう。
理解度チェック#
次のステップ#
次は、テスト予測を学習に活かす疑似ラベル(pseudo-labeling)を学びます。