データ、特徴量、パイプライン
学習データをどう収集し、ラベル付けし、クリーニングし、分割し、バージョン管理するか。答えをリークさせずに特徴量を作る方法と、本番の失敗の多くがモデルではなくここから始まる理由を解説します。
概要
モデルとは学習データの圧縮された要約です。データを変えればモデルが変わり、その影響はたいていアーキテクチャのどんな変更よりも大きくなります。このハブは、学習の前後とその周辺で行われる作業を扱います。何を収集するか決めること、ラベルを得ること、クリーニング、特徴量の構築、評価が意味をもつような分割、そしてどのデータがどのモデルを生んだかの追跡です。モデリングの段階が実は簡単な部分だったと気づいたエンジニアのためのページです。
これが重要な理由は非対称性にあります。より良い最適化手法はベンチマークをコンマ数ポイント動かします。学習側とテスト側にまたがって重複した1行は、それを10ポイント、しかも間違った方向に動かし、学習ログには何も現れません。Kapoor and Narayananは2022年に17分野294本の論文を調査し、すべての分野でリークを見つけました。主張の結論が覆るほどの事例も少なくありません。同じ間違いは企業のコードにも現れ、見つけるより防ぐほうが安上がりです。
重要な考え方
分割が最初
クリーニングする前に、分布を見る前に、スケーラーを当てはめる前に、データを分割してください。データセット全体から学んだことは、欠損値補完に使う平均値であれトークナイザの語彙であれ、テストセットからモデルへリークする情報です。scikit-learnのPipelineとColumnTransformerは、すべての前処理ステップが学習フォールドだけで当てはめられ、他のフォールドにはそのまま適用されるように存在しています。前処理が無害に見えるときでも使ってください。
分割の方法はモデルの使われ方で決まります。ランダム分割が正しいのは、将来の例が過去の例と交換可能な場合だけです。時系列データは日付で分割し、テスト期間を学習期間の後に置く必要があります。グループをもつデータ、たとえば患者ごとに複数の画像、ユーザーごとに複数のセッションがある場合は、グループで分割する必要があります。さもないとモデルは病気ではなく患者を見分けることを学びます。近い重複は分割をまたいで重複排除する必要があり、Webから収集したテキストや複数の切り抜きをもつ画像では現実的な懸念です。
リークにはいくつかの形がある
ターゲットリークとは、ラベルの原因ではなく結果である特徴量です。不正検知データセットの「保険金支払済み」列、解約データセットの解約日時などがそうです。時間的リークとは、予測時点より後の情報で計算された特徴量のことで、その後更新されたウェアハウスから特徴量を結合する場合によく起こります。グループリークは先ほどの患者の問題です。前処理リークとは、スケーラー、エンコーダ、特徴量選択器をデータセット全体で当てはめることです。重複リークとは、同じか、ほぼ同じ例が分割の両側にあることです。
いずれに対しても検査方法は同じです。各特徴量について、予測しなければならない瞬間にシステムが何を知っているかを問い、その情報だけから特徴量を計算してください。怪しいほど良い検証スコアはリークの警報であり、朗報ではありません。
ラベルは所与ではなく成果物
教師ありプロジェクトの大半はラベリングで生死が決まります。誰かがラベル付けを始める前に、境界事例の実例を含むアノテーションガイドラインを書き、2人以上が重複するサンプルにラベルを付け、Cohenのκ(カッパ)やKrippendorffのαで一致度を測ってください。アノテータ間の不一致は、モデルが到達できる上限であり、ガイドラインに必要な改善の下限です。Northcutt et al.は2021年に、ImageNetを含む一般的なベンチマークのテストセットで約3.3%のラベルが間違っていると推定しました。ノイズを前提にし、モデルが最も自信をもって間違える例について再ラベリングの予算を取っておいてください。
大規模言語モデル(LLM)によるラベリングは、人間がランダムサンプルを監査し、その監査結果をモデルのスコアと並べて報告するなら、最初のパスとして問題ありません。その設定方法はプロンプティングとエージェントを参照してください。
特徴量、スキーマ、バージョン
表形式データでは、特徴量エンジニアリングが依然として利得の源です。比率、ラグ、ウィンドウ内のカウント、交差検証の内側で行うターゲットエンコーディングなどです。木は生の数値列をそのまま扱えますが、線形モデルとニューラルネットワークはスケールされた入力を求めます。古典的機械学習を参照してください。テキスト、画像、音声では、特徴抽出器は今やたいてい事前学習済みモデルであり、エンジニアリングの重心はその選択とエンベディングに移ります。
特徴量が何であれ、スキーマを書き留めて、すべてのバッチで検証してください。列の型、許容範囲、欠損率、カテゴリ集合です。panderaとGreat Expectationsがこれを行います。データのバージョン管理はコードと同じ真剣さで行ってください。DVCはコンテンツハッシュを保存するので、モデルを学習に使った正確なバイト列まで遡れます。Gebru et al.の意味でのデータシートは、なぜそのデータが収集されたのか、何をカバーしていないのかという、将来の同僚が問うであろう質問に答えます。
どこから始めるか
データこそがモデルから始めてください。リークするパイプラインを作ってから直すレッスンです。次に、スケーリングがなぜ重要かを見るために線形回帰とロジスティック回帰をゼロから、グループ分割と時間分割のために嘘をつかない評価、木が特徴量に何を必要とし何を必要としないかを知るために決定木と勾配ブースティングです。表形式分類器プロジェクトはPipelineをAPIの背後に置き、本番でも同じ前処理が走るようにします。
ツールとプラットフォーム
| ツール | 用途 | ライセンス | プラットフォーム |
|---|---|---|---|
| pandas | 表形式データの読み込み、結合、確認 | BSD-3 | オープンソース |
| scikit-learn Pipeline | 学習フォールドだけで当てはめる前処理 | BSD-3 | オープンソース |
| pandera | コードによるデータフレームのスキーマ検証 | MIT | オープンソース |
| Great Expectations | バッチに対するデータ品質チェック | Apache-2.0 | オープンソース |
| DVC | gitと並ぶデータとモデルのバージョン管理 | Apache-2.0 | オープンソース |
| Hugging Face Datasets | Arrowによるデータセットの読み込み、ストリーミング、共有 | Apache-2.0 | Hugging Face |
| Label Studio | テキスト、画像、音声のアノテーションインターフェース | Apache-2.0 | オープンソース |
| CVAT | ボックスとマスクのための画像・動画アノテーション | MIT | オープンソース |
よくある間違い
- スケーラー、補完器、エンコーダをデータセット全体で当てはめてから分割する。学習される変換はすべてパイプラインの中に置きます。
- 例がユーザー、患者、デバイス、日を共有しているのにランダムに分割する。本番でモデルが初めて出会うグループ単位で分割してください。
- ウェアハウスのエクスポートに含まれていたからという理由で、予測時点より後に計算される特徴量を残す。
- ラベルを真実として扱う。アノテータ間の一致度を測り、モデルとラベルが最も自信をもって食い違う例を見てください。
- ラップトップ上のCSVだったために誰も再現できないデータセットで学習する。ハッシュを取り、バージョン管理し、モデルと一緒にハッシュを記録してください。
さらに深く
- Kapoor and Narayanan, Leakage and the Reproducibility Crisis in ML-based Science, 2022。
- Gebru et al., Datasheets for Datasets, 2018。
- Northcutt, Athalye and Mueller, Pervasive Label Errors in Test Sets Destabilize Machine Learning Benchmarks, 2021。
- Sculley et al., Hidden Technical Debt in Machine Learning Systems, NeurIPS 2015。
- scikit-learnのよくある落とし穴と推奨プラクティスガイド。
- データとパイプラインのバージョン管理に関するDVCドキュメント。