利益:
- データ漏洩の種類 (ターゲット、時間、前処理、グループ化された行) を認識し、アラームとして「良すぎる」スコアをクエリする機能
- テストセット、パイプラインを早期に分離し、正しい分割(時系列/グループ化)を行うことで漏洩を防止する機能
- 固定シード、バージョン管理、手動ステップの削除により分析を再現可能にする機能
データ サイエンスにおいて最も労力を無駄にする間違いが 2 つあります。これらは両方とも、すべてが「うまくいっているように見える」ときに大惨事につながるため、潜伏性があります。 1 つ目はデータ漏洩です。モデルはテスト セットではうまく機能しますが、本番環境ではクラッシュします。 2 つ目は再現性のなさです。6 か月後に分析を実行すると、まったく異なる結果が得られます。この単元では、これら 2 つの落とし穴を詳しく知り、回避することに専念します。 AI は両方のリスクを増大させる可能性がありますが (迅速に発生し、隠れた漏洩を示唆し、手動の手順を実行しやすくします)、正しく使用すればリスクを軽減することもできます。違いは規律にあります。
データ漏洩: 透視モデル
データ漏洩とは、モデルがトレーニング中に実際の予測時には存在しない情報を認識することです。モデルはこの情報を使用して「不正」を行い、テスト セットでは見栄えがよくなりますが、その情報がないと運用環境ではクラッシュします。漏れの症状はほとんどの場合同じで、信じられないほどです。 99% の精度を確認して喜ぶ前に、漏れを探す必要があります。
漏れの主な種類は次のとおりです。
1. 目標の漏れ: 機能は目標の結果です。 「キャンセルされました」予測では、「キャンセル日」または「返金金額」列がターゲットの結果です。結果が明らかな場合にのみ埋められます。
2. タイムリーク: 未来の情報を過去に持ち込むこと。 「過去 30 日間の平均」を計算する場合は、予測日以降の日数を含めるか、時系列をランダムに分割します。
3. 前処理リーク: トレーニング/テスト パーティションの前に、すべてのデータからスケーリング、充填、コーディングなどの学習変換を行います。テストデータの平均化はトレーニングを妨げます。
4. 重複/グループ化された行リーク: 同じ人物に属する行がトレーニングとテストの両方に存在します (異なるセットでの同じ患者の 2 回の訪問)。モデルはその人を記憶します。
リークタイプ
どうやって生まれるのか
予防方法
ターゲットリーク
ターゲットの結果である列
「予測時に持っているかどうか」テスト
タイムリーク
未来を過去にもたらす
時系列分割、ウィンドウ制御
前処理リーク
分割前の変換
パイプライン、トレーニングだけでフィット
グループ化された行リーク
同じユニットを 2 セットで
グループごとに分割 (GroupKFold)
漏れを防ぐ唯一の規律
あらゆるタイプのリークに対する共通の解決策は、一言に要約されます。それは、現実の未来を模倣するためにできるだけ早くテスト セットを分離し、それに何も「教えない」ことです。実際には、これは次のことを意味します。まず分割し、次にトレーニングからのみすべての変換を学習し、それらをパイプライン (すべてのステップを 1 つのチェーンに集めた構造) に適用します。特徴ごとに、「予測時にこの情報はありますか?」という質問をします。時間がある場合は、時系列に分割してください。同じ単元が繰り返し行われる場合は、グループごとに分けてください。
注意: リークの最も危険な側面は、リークが成功したように見えることです。悪いモデルは明らかに悪い結果を生み、注目されるでしょう。リークされたモデルはうまく機能し、誰もが満足し、製品化されます。そこから崩壊が始まります。だからこそ、「非常に良い」結果は祝賀ではなく、懸念の原因となるのです。
再現性: 同じ結果が 2 回得られる
再現性とは、別の時間に別のマシンで解析を再度実行したときに同じ結果が得られる能力です。これがなければ、分析は偶発的であり、科学的ではありません。再現性を損なう主な原因と解決策:
手動手順: Excel のセルを手動で変更し、グラフを手動で編集します。解決策: 各ステップをコードに含めます。
固定されていないランダム性: モデルのトレーニング、サンプリング、分割にはランダム性が伴います。解決策: ランダム シード (ランダム ジェネレーターの初期値) を修正します (random_state=42)。
バージョンの変更: ライブラリのバージョンが変更されると、結果が変わる可能性があります。解決策: 依存関係を修正します (requirements.txt、環境ファイル)。
記録保持なし: どのデータ、どのコード、どのパラメータが使用されたかは不明です。解決策: バージョン管理 (Git — コードのすべてのバージョンを保存するシステム) とデータのバージョン管理。
「私のマシンでのみ動作します」: 解決策: 環境を文書化し、可能であればコンテナー (Docker) を使用します。
ミニケース3個
ケース 1 — ターゲットのリーク。健康分析では、「患者が再入院するかどうか」を予測する際に「退院後の投薬」の欄が注目されました。このカラムは患者が退院した後にのみ充填されました。モデルでは 96% でしたが、本番では 61% でした。 8週間のプロジェクトはゴミだった。教訓: それぞれの特徴を「予測時に存在するか?」と尋ねます。
ケース 2 — 前処理リーク。あるチームはすべてのデータをスケーリングしてから分割しました。テストデータの平均はスケーリングに関係していました。 CV スコア 89%、実際の生産性 76%。 Pipeline に移行し、トレーニングからのみ変革について学んだとき、偽の成功は消えました。教訓: 最初に分割し、後で変換する。
ケース 3 — 再現の失敗。アナリストは、経営陣に提示したグラフを 3 か月後に更新したいと考えましたが、どのように作成したか思い出せませんでした。多くの手順は Excel で手動で実行されました。結果はうまくいかず、信頼は揺らぎました。教訓: 手動の手順は必要ありません。すべてはコードと Git で行われます。
コピー可能な 4 つのテンプレート
1) 漏れ検査:
あなたの役割: 漏れ検査官。対象:「チャーン」(0/1)、予測基準日:record_dateこの機能のリストを紹介します。それぞれの特徴について: (a) それは目標の結果であるか、(b) 予測時に利用できるか、(c) 時間枠には将来が含まれているか? 「安全でない/疑わしい/漏洩」としてマークし、理由を書きます。特徴:【一覧】
2) 漏れのないパイプライン:
sklearn パイプラインを設定します。最初にトレーニング/テストを分割し (階層化、シード = 42)、次にすべての前処理 (インピューティング、スケール、エンコード) をトレーニングのみからパイプラインに組み込みます。コードにリークがない理由、どのステップがどこで学習されたのかを説明します。
3) 再現性チェックリストのコード:
分析を再現可能にしたいと考えています。 (1) すべてのランダム性に対するハード シード、(2) 使用される印刷ライブラリのバージョン、(3) データと出力の日付/バージョン タグを追加するコード/構造を提案します。また、手動の手順が存在しないことを確認するためのチェックリストも提供してください。
4) グループ化されたパーティション (同じユニットのリーク):
データ内に同じ customer_id が複数の行に存在します。同じ顧客がトレーニングとテストの両方に参加できないようにする分割 (GroupKFold または GroupShuffleSplit、グループ = customer_id) を作成します。分割後に両方のセットに顧客が存在しないことを確認するコードを含めます。
弱いプロンプト / 強いプロンプト
弱いプロンプト:
私のモデルは 98% の精度を返しました。これは素晴らしいことではないでしょうか?コードを最適化します。
98% を祝うとリークが隠蔽されます。最適化する前に、このスコアが本物かどうかを検討する必要があります。
強力なプロンプト:
あなたの役割: 漏れ検査官。私のモデルはテスト セットで 98% の精度を返しましたが、これは私には「うますぎる」ように思えます。チェック: (1) ターゲットの結果である特徴があるか、(2) 分割前に行われた変換があるか、(3) 2 つのセットで同じユニットであるか、(4) 時間リークがあるか。疑わしい点をリストアップします。スコアを修正するのではなく、リークを見つけることに重点を置きます。
ここでは、高得点は称賛されるべきものではなく、疑問視されるべき兆候として扱われます。
よくある間違い
- 「非常に良い」結果を祝う。あまりにも良いスコアは、成果ではなく漏洩の警告です。
- 除算前のすべてのデータから変換を学習します。最も一般的な漏れ。まずパイプラインで分割します。
- 時系列をランダムに分割します。モデルは未来を見ます。時系列で区切るのは必須です。
- 同じユニットを 2 つのセットで残します。モデルはその人を記憶します。グループごとに分けます。
- Not stepping in manually and writing into the code.分析は再現不可能になります。すべてはコードと Git 内にある必要があります。
ヒント: プロジェクトの冒頭に 2 文の「名誉の誓約」を書きます: 「本番環境で見るまでは、テスト セットには一切触れていません。すべてのステップがコード内にあり、シードは修正されています。」これら 2 つの文に正直に署名できない場合、結果はまだ信頼できません。
要約すると
データ漏洩と非再現性は、データ サイエンスにおける 2 つの最も高価なサイレント エラーです。漏れはモデルの将来のビジョンであり、それ自体が誤った成功として現れます。解決策は、テスト セットを早期に分割し、トレーニング (パイプライン) からのみ変換を学習し、各特徴に「予測時にそれがあるかどうか」という質問をして、正しい分割 (時系列/グループ化) を行うことです。再現性とは、同じ結果を 2 回得ることができることです。彼の解決策は、ステップを手動で削除し、シードを固定し、バージョンをフリーズして、すべてを Git に保持することです。 AI はこれらのリスクを増加または減少させることができます。それを決めるのはあなたの規律です。
アプリケーションタスク
構築したモデル (または仮説モデル) の特徴リストを取得し、各特徴に「予測時にこの情報はありますか?」という質問をします。書面で;少なくとも 1 つのリーク候補を見つけます。次に、分析を再現可能にするためのチェックリストに記入します。シードは修正されているか、手動手順はあるか、バージョンは登録されているか、Git にあるか。欠陥を修正します。
チェックリスト
- [ ] リーク警告として「良すぎる」スコアをクエリしましたか?
- [ ] トレーニングだけで、分割後のすべての変換を学習しましたか?
- [ ] 時間/グループ構造 (時系列/GroupKFold) に従って分割していますか?
- [ ] 固定シードですべてのランダム性を再現可能にしましたか?
- [ ] 手動手順を削除し、すべてをコードとバージョン管理に保存しましたか?