モデリング●●●●●

データリーク

Data Leakage ・ でーたりーく

本来使えない情報が訓練に混入し、評価だけが良く見えてしまう分析の落とし穴

✦ 30秒で試す — 航海評価が良すぎるモデルは、答えをのぞいているかもしれない列ありのモデルを、実際の診察の時点で使うと正答率は?予想してみる

概要

データリークとは、予測モデルを作るときに「本番の予測時点では手に入らないはずの情報」が訓練プロセスに紛れ込んでしまうことです。リークが起きたモデルは、手元の評価データでは驚くほど高い精度を叩き出しますが、実際に運用に投入すると精度が急落します。カンニングペーパーを見ながら模試を解いていたようなもので、本番で実力が出ないのは当然です。

厄介なのは、リークは意図的な不正ではなく、ごく普通のデータ前処理の手順ミスから静かに混入することです。テストデータを含めた全体で平均や標準偏差を計算してしまう、正解ラベルの「結果」として記録された列を特徴量に使ってしまう、時系列データを無造作にシャッフルして未来の情報で過去を予測してしまう — どれも一見無害な操作です。

しかも過学習と違って、リークは評価指標そのものを汚染します。過学習なら「テストデータでの精度低下」という形で検出できますが、リークはそのテストデータでの評価まで良く見せてしまうため、数字を眺めているだけでは気付けません。「精度が良すぎる」ことが唯一の兆候であることも多く、機械学習の実務で最も発見が難しい失敗の一つとされています。

なぜ生まれたか

統計モデリングが「手元のデータへの当てはめ」から「未知のデータへの予測」に軸足を移したとき、評価の作法として訓練データとテストデータの分離、さらに交差検証が確立されました。しかし実務のデータ処理は、欠損の補完、標準化、特徴量の生成、変数選択と多段階のパイプラインになっており、「分離したつもりでも、どこかの段階でテスト側の情報が訓練側に染み出す」事故が頻発しました。有名な例が2000年前後の遺伝子発現データの研究です。数千個の遺伝子から「がんと関連が強い遺伝子」を全データで選んでから交差検証をしたために、ほぼ完璧な判別精度が報告される論文が相次ぎました。2002年にアンブロワーズとマクラクランが、選択の手順まで交差検証の内側に入れて測り直すと精度は大きく下がることを示し、この誤りは広く知られるようになります。データ分析コンペティションでも「本来使えない列を見つけたチームが不自然に高いスコアで上位を独占する」事件が繰り返され、2012年頃にはこの染み出しを「リーケージ(漏洩)」として定義し、類型を整理する研究も現れました。

背景にあるのは、評価というものの原理的な要請です。モデルの真価は「学習中に一度も見ていないデータでどれだけ当たるか」でしか測れません。リークはこの「一度も見ていない」という前提を壊すため、どんなに精緻な評価指標を使っても数字が意味を失います。だからこそ、リークの類型を知り、手順の側で混入を防ぐ規律が必要になったのです。

詳細

典型パターン1: 前処理リーク

最も頻度が高いのが、訓練/テスト分割の「前」に、データ全体を使った前処理をしてしまうパターンです。たとえば標準化では平均と標準偏差を計算しますが、これを全データで計算してから分割すると、テストデータの分布の情報が訓練データの変換に混入します。欠損値の補完、外れ値のしきい値決定、相関に基づく特徴量選択も同じ構造の罠を持ちます。正しい手順は「先に分割し、前処理のパラメータは訓練データだけから求め、テストデータにはそれを適用するだけ」です。交差検証を使う場合も、前処理を各分割の内側で行う(パイプラインごと検証する)必要があります。

誤り: 分割の前に全体で前処理全データ全体で平均・σを計算テストの情報も混ざる訓練テスト評価が実力より良く見える正しい: 先に分割してから前処理全データ訓練テスト訓練だけで平均・σを計算同じ変換を適用するだけテストは最後まで「未知」のまま評価の前提は「テストデータを学習中に一切見ていない」こと。前処理のパラメータ計算も「見ている」ことに含まれる。
前処理リークの構造 — 分割前に全体で統計量を計算すると、テスト側の情報が訓練に染み出す

標準化のリークは、テストデータの平均が少し混ざる程度なので、害は小さいことも多いのです。桁違いに危険なのは、ラベル(正解)を見て特徴量を選ぶ手順を分割の外でやってしまう場合です。特徴量の候補が多いほど、純粋な偶然でラベルとそろってしまう特徴がいくつも見つかります。それを全データで選べば、選ばれた特徴は検証用のデータでも「たまたま当たる」ことが保証されてしまいます。下の部品のデータは、ラベルとまったく無関係な乱数だけでできています。それでも手順を誤ると、交差検証は堂々と8割を超える正解率を報告します。

⚡ 体験: ノイズだけで 80% 当たる手順
候補の特徴量
手順A(誤り)手順B(正しい)全データ50件特徴を選ぶ(全50件で)5分割で学習・評価検証データの答えが漏れる全データ50件5分割する各回: 訓練40件で選ぶ → 学習 → 評価本当の実力 50%A の報告B の報告
A: 全件で選んでから交差検証B: 各分割の訓練データの中で選ぶコイン投げ
A の平均—B の平均—実行回数0

特徴量はすべてただの乱数で、ラベル(2クラス)とは何の関係もありません。本当の実力はコイン投げの 50% です。「実行」で、2つの手順の交差検証がそれぞれ何% と報告するか見てください。

データ: 標本 50 件、2クラス半々、特徴量はすべて標準正規の乱数。選んだ 10 個の特徴で最近傍重心法により分類し、5分割交差検証で正解率を測る

手順Bの正解率が 50% 付近に散らばるのは、それが本当の実力だからです。両者の違いは、特徴選択という「学習の一部」を検証の内側に入れたかどうかだけです。ラベルを使う操作は、それがどれほど前処理らしく見えても、学習の一部として分割の内側に置く——これがリークを防ぐ最も確実な規律です。

典型パターン2: ターゲットリーク

特徴量そのものに正解の情報が含まれてしまうのがターゲットリークです。有名な例に「肺炎の予測モデルに『抗生物質投与の有無』という列を入れてしまう」というものがあります。抗生物質は肺炎と診断された後に投与されるので、この列は正解ラベルの原因ではなく結果です。予測時点(診断前)には存在しない情報なのに、履歴データには結果として記録されているため、モデルはこの列を使ってほぼ完璧に「予測」してしまいます。解約予測における「解約手続きページの閲覧履歴」、不正検知における「調査担当者のフラグ」なども同類で、「その列は予測を行う時点で本当に手に入るか」を1列ずつ問うことが防御になります。

典型パターン3: 時間と重複のリーク

時系列データでは、時間の順序を無視した分割が即リークになります。ランダムに分割すると、訓練データに「未来」のレコードが混ざり、モデルは未来を知った状態で過去を予測することになります。株価予測や需要予測で「バックテストでは完璧だったのに本番で外れる」典型的な原因です。時系列では必ず「過去で訓練し、未来で検証する」分割を使います。また、同一人物・同一物件のレコードが訓練とテストの両方に入る「グループの重複」もリークの一種です。同じ患者の検査記録が両側にあれば、モデルは病気の構造ではなく「その患者らしさ」を覚えるだけで当たってしまいます。グループ単位で分割することで防ぎます。

検出と防御の実務

リークの最大の兆候は「不自然なほど良い数字」です。難しいはずのタスクで適合率・再現率やAUCが突出して高いときは、喜ぶ前に疑うのが鉄則です。特徴量の重要度を確認し、1つの変数が支配的に効いているなら、その変数が正解の「結果」でないかを業務知識に照らして検証します。もう一つの有効な習慣は、前処理から学習までを一体のパイプラインとして組み、交差検証がパイプライン全体を分割の内側で実行するようにすることです。手作業の前処理をなくすことが、リーク混入の機会そのものを減らします。

最後に、リークは科学の再現性の問題とも地続きです。評価データの結果を見ながら特徴量やモデルを選び直す行為は、テスト情報の間接的な混入であり、p値ハッキングと同じ構造を持ちます。最終評価用のデータは一度だけ使う、という規律が信頼できる数字の条件です。

試問

機械学習のモデルを評価するとき、本番では手に入らない情報(テスト用データの中身や、予測したい答えそのもの)が学習や前処理に紛れ込むと、評価が実力以上に良く出てしまいます。これをリーク(データリーク)と呼びます。次の8つの手順は、どれもモデル作りでよく見かけるものです。

✦ 命題挑戦中

8つの手順を、どの種類のリークに当たるか(または問題ないか)で仕分けよ

前処理のリークテスト側の情報が前処理に混ざる
ターゲットリーク予測時点に無い情報を使う
時間・重複のリーク分け方が本番の状況と違う
リークなし正しい手順

項目を選んでから、入れる箱を選びます