コンテンツにスキップ

バックフィルのベストプラクティス

データエラー、新しい情報(新機能など)、2つのシステム間のデータ整合など、さまざまな理由でデータのバックフィルが必要になることがあります。バックフィルを行う際は、データ品質とモデルのパフォーマンスを維持するために、この記事の原則に従ってください。

バックフィルが必要な場合

バックフィルとは、過去のデータを使ってデータセットを遡って補完するプロセスです。一般的なシナリオは次のとおりです。

シナリオ 説明 例
新しい特徴量 モデルにとって重要な新しい指標を特定し、それを算出するための過去の生ログがある場合。 特徴量として「クリックスルー率」を追加し、モデルが学習するのに十分なデータを確保するために3か月分の履歴が必要になる場合。
データの復旧 特定の日にデータパイプラインが失敗し、Decisioning Studio Proに配信されるデータに欠損が生じた場合。 火曜日のパイプライン障害によって欠損が発生しました。修正をデプロイした後、ソースシステムから欠落したレコードをバックフィルします。
ロジックの変更 特徴量の計算式を更新した場合や、イベントの定義を変更した場合。 「アクティブユーザー」を再定義したため、モデルが更新後の定義でトレーニングされるように過去のデータを再エクスポートする必要がある場合。

要件

Decisioning Studio Proが正しく機能するには、すべての受信データが過去の期間のバックフィルに対応している必要があります。必要となる具体的なルックバック期間(月単位)は、AIモデルのトレーニング要件によって異なります。ユースケースに適した値については、AI意思決定サービスチームにご確認ください。

過去データのバックフィルを実行する際は、以下の基準が必須です。

  • プロセスの一貫性: 過去の特徴量スナップショットは、ライブスナップショットの作成と完全に一貫したプロセスで生成する必要があります。ライブパイプラインで変換、集計、フィルターを適用している場合は、バックフィルするデータにも同じステップを適用する必要があります。
  • スキーマの一貫性: バックフィルするデータのスキーマは、通常の日次パイプラインと完全に一致している必要があります。これには、同じフィールド、データ型、列の命名規則が含まれます。

よくある落とし穴

データリーク (先読みバイアス)

データリークは、バックフィルにおける最も重大な間違いです。これは、履歴レコードが生成された時点では入手できなかったはずの情報を、バックフィル処理が意図せず取り込んでしまうことで発生します。

なぜ重要なのか

モデルが「未来を知っている」データでトレーニングされると、トレーニング中は良好なパフォーマンスを示しているように見えますが、本番環境では低い成果しか得られません。リアルタイムの意思決定では、未来のデータにアクセスできないためです。

たとえば、顧客の現在まで (つまり今日まで) の総支出額を使って過去の「生涯価値」特徴量を計算し、その値を使って数か月前に発生した行動を予測するケースを考えてみてください。その過去のイベントの時点では、生涯価値の全体はまだわかっていませんでした。

これを避けるには、各過去の特徴量を、その過去のタイムスタンプ時点で入手可能だった情報から再構築します。

スキーマとロジックのドリフト

データ構造やビジネス上の定義は、時間の経過とともに変化します。過去のデータとライブデータの間の不整合は、モデルの品質を気づかないうちに低下させる可能性があります。

  • スキーマのドリフト: あるフィールド (たとえば zip_code) が最近データベースに追加された場合、その変更より前のバックフィルされたレコードでは、そのフィールドは null になります。パイプラインが欠落しているフィールドを適切に処理できること、そして過去のカバレッジがまばらなフィールドにモデルが過度に依存していないことを確認してください。
  • ロジックのドリフト: 指標の定義が特定の時点で変更された場合 (たとえば、2024年に「アクティブユーザー」が再定義された場合)、新しい定義を古いデータ (たとえば2022年のレコード) に一律に適用すると、実際には発生していない人為的な急増や急減が生じる可能性があります。可能な場合は、各履歴レコードの時点で有効だった定義を適用するか、モデルが考慮できるように変更点を明確に文書化してください。

失敗したバックフィルジョブによる重複レコード

途中で失敗して再起動されたバックフィルジョブは、重複を防ぐように設計されていない場合、重複レコードを生成することがあります。重複レコードは指標を人為的に水増しし、モデルのトレーニングにノイズをもたらします。

ソリューション: すべてのバックフィルスクリプトを冪等になるように設計します。つまり、同じジョブを2回実行しても、1回実行した場合と同じ結果になるようにします。次のいずれかのパターンを使用してください。

  • アップサート (更新または挿入): 一意のトランザクション ID またはタイムスタンプをキーとし、既存のレコードを再挿入した場合は重複を作成せずに更新します。
  • 削除してから挿入: 挿入する前に対象期間の既存レコードを削除し、データセットが常にクリーンに置き換えられるようにします。
New Stuff!