シリーズ・全4本
データリークと検証の落とし穴
手元の交差検証では良い数字が出たのに、本番に出すと精度が落ちる。原因の多くは、検証の手続きのどこかで答えを覗いてしまう「リーク」です。このシリーズでは、よくある誤りを一つずつ実際に作り込み、スコアがどれだけ盛れるのかを同じ土俵で測っています。何を最優先で直すべきかを、恐怖心ではなく盛れ幅の大きさで判断できるようにするのが目的です。
このシリーズで確かめていること
- どの誤りが、検証スコアを最も大きく盛るのか
- 交差検証の前に前処理をまとめてかけると、何が起きるのか
- ターゲットエンコーディングはなぜ危ないのか
- 分割の仕方を間違えると、評価はどれだけ甘くなるのか
- 早期終了の判定に評価用のデータを使うと、報告値はどうなるのか
連載順に読む
第1回データリーク5パターンで交差検証はどれだけ甘くなるか—分割前SMOTEは+0.24、前処理の順序ミスは差を確認できず
機械学習のデータリーク5パターンを合成データに作り込み、交差検証のスコアがリークなしの評価用データよりどれだけ高く出るかをLightGBMで実測しました。この強度設定では分割前SMOTEが+0.24、よく警告される標準化・欠損補完の順序ミスでは差を確認できませんでした。上振れの大きさはパターンごとの設定に依存し、危険度の順位ではありません。手元で試せる実装例つきです。
第2回交差検証の前に前処理するとCVはどれだけ変わるか—特徴選択・SMOTE・標準化を実測
交差検証の前に前処理を全データへ当てると、CVスコアが本来より高く出ることがあります。4種類を測ると、標準化と欠損補完では差を確認できず、列数の多いデータでの特徴選択で平均0.027、分割前のSMOTEは木モデルで0.1を超えました。合成データ10シードの実測とコピペで動くサンプルつき。
第3回ターゲットエンコーディングのデータリーク—無関係な列のAUCが0.795まで上がった
ターゲットエンコーディングを全データのカテゴリ平均で作ると、無関係な乱数列でも交差検証AUCが0.795まで上がりました(独立ホールドアウトでは0.499)。平滑化(スムージング)を強めても上振れは頭打ちで残り、out-of-fold実装なら0.5付近へ戻りました。どんな条件で見かけのスコアが膨らむかも、水準数と件数を変えて実測しています。
第4回同じ人が学習・検証の両方に入ると?交差検証のROC-AUCを実測比較
交差検証で同じ人の行が学習側と検証側にまたがると、スコアは新規グループでの評価より高く出ました(今回の合成データのROC-AUC平均で、KFoldは+0.085、StratifiedKFoldは+0.084)。GroupKFoldならまたがりは全シードで0件です。不均衡データでの層化の効きどころも合成データで実測しました。