名前はバージョンではない
一言でいうと
データは、名前ではなく内容のハッシュでバージョンを決め、正常な範囲は、データから推測せずに業務から宣言しておいて、新しい収集分を機械で突き合わせます。
なぜ必要なのか
再現が壊れるのは、たいていコードではなくデータです。学習スクリプトはgitが守ってくれますが、train.csvは誰も守ってくれません。ある日、上流のパイプラインが二重に取り込みをすると行が増え、翌週、誰かが欠損の処理を変えると値が変わります。ファイル名はそのままで、学習は正常に終了し、指標は少し動きます。この組み合わせが、最も長く隠れます。
2つ目の問題は、「正常」の定義がどこにも書かれていないことです。月額料金がマイナスの行が入ってきても、Pythonはfloatとしてきちんと読み、モデルはその値で学習してしまいます。人が気づくのは、数週間後に予測がおかしくなったときですが、そのときには、すでにそのデータで学習したモデルが本番にあります。
どう動くのか
データのバージョンは、指紋でつかみます。ファイルのバイトのSHA-256を計算しておけば、同じ名前のファイルが同じファイルなのかに、一度で答えられます(hashlib)。MLflowのデータセットオブジェクトも、同じ発想で、名前・ダイジェスト・元の場所・スキーマ・プロファイルを一緒に持ち歩きます(MLflow Dataset Tracking)。ダイジェストが実行記録に付いていれば、「このモデルはどんなデータで作られたのか」が、推測ではなく照会になります。
正常な範囲は、スキーマで宣言します。TensorFlow Data Validationのドキュメントは、スキーマを、入力データが満たすべき性質をコードで書いたものと説明し、統計をスキーマと突き合わせて異常を見つける方式を使います。同じドキュメントが、よく出会う問題として挙げるのが、欠損値、ラベルが特徴量として混ざり込んで、モデルが正解を先に見てしまうこと、そして期待する範囲を外れた値です(TensorFlow Data Validation)。
계약(선언) monthly_fee 0~200, late_payments 필수
관찰(계산) train.csv 의 monthly_fee 는 9.3 ~ 88.69
검증(대조) week2.csv 240행 중 4행이 계약 위반
検証ルール自体は、数行で済みます。必須の列が空でないか、数値として読めるか、宣言した範囲に収まるか。難しいのはルールではなく、違反に出会ったときに何をするかを、あらかじめ決めておくことです。全体を止めるのか、違反した行だけを除いて進むのか、警告だけを残してそのまま学習するのかは、列ごとに違うことがあります。
ここで、宣言と観察を分けることが重要です。今日のデータの最小値・最大値をそのままルールにすると、今日たまたま入った外れ値が、明日のルールになります。範囲は業務が決め、データは、その範囲に収まるかを確認するだけです。
分割のリークは、別の軸です。scikit-learnのドキュメントは、リークを、予測時点では使えない情報がモデルを作るのに使われることと定義し、その結果、性能の推定値が楽観的になりすぎて、実際の新しいデータでは、もっと悪くなると説明します。最もよくある原因として、学習と評価の部分集合をきちんと分離しなかったことを挙げています(Common pitfalls)。
現場での姿
契約の検証を入れたあと、最初の数日は、アラートが大量に出ます。ほとんどは、データが悪いからではなく、契約が現実より狭く書かれているからです。このとき、検証をオフにすると、また振り出しに戻るので、アラートを1つずつ読んで、契約を直すほうがよいです。その過程が、そのまま、「私たちのデータがどんな形をしているのか」を、チームがはじめて合意する過程になります。
2つ目は、黙って捨てる習慣です。契約に違反した行をtry/exceptで飛ばすと、学習は回り続けますが、サンプルが減った事実は、どこにも残りません。数か月後、「なぜ性能が下がったのか」として戻ってきます。捨てた行は、隔離ファイルとして残しておけば、あとで理由をたどれます。
3つ目は、リークを指標でつかもうとする試みです。記憶力の大きいモデルでは、リークが指標を大きく押し上げますが、単純な線形モデルでは、ほとんど動きません。そのため、分割は、数字を見て疑うのではなく、識別子が重なっているかで検査する必要があります。
4つ目は、データカードを後回しにすることです。このデータがどこから来て、何を言えないのかを書いておかないと、次の人は、その限界を知らずに使います。合成データで作ったモデルを、実際の顧客対応にそのまま付ける事故は、そうして起きます。カードは長くある必要はありません。出典、指紋、分割の規則、そして「これではこういうことは言えない」という数行で十分で、その数行が、数か月後の会議を1回減らします。
次のラボですること
3つの分割の指紋を取り、業務ルールでデータ契約を宣言し、新しい収集分を突き合わせて、違反した行を隔離します。そのあと、学習と評価に同じ顧客が入った壊れた分割を見つけ出し、重なりを取り除いたあと、指標が実際にどれだけ動くかを、自分で測ってみます。