シリーズ・全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実装のどちらで防げるのかを実測しています。
第4回同じ人が学習・検証の両方に入ると?交差検証のROC-AUCを実測比較
同じ対象の行をグループを無視して行単位で分けると、学習に登場しなかった新規グループでの評価スコアより高い値が出ました(今回の合成データでROC-AUC平均+0.085、20シード中の最大は+0.184)。GroupKFoldは指定したグループが両側にまたがることを防ぎます。不均衡データでの層化の効きどころも合成データで実測しました。