Feature Store
特徴量ストアは、ML特徴量を定義、保存、提供し、学習時とオンライン予測時に同じ値を使えるようにします。オフラインストアとオンラインストアがあります。
フィーチャーストアは、機械学習モデルの入力特徴量を定義、計算、保存、提供するデータシステムです。これにより、モデルが学習時とリアルタイムの予測時に同じ特徴量値を使えるようになります。特徴量とは、たとえば過去1時間のカード取引件数、商品の平均評価、画像の埋め込みなど、モデルへの入力の1つです。フィーチャーストアは各特徴量の定義と全履歴をオフラインストアに保持し、学習データセットの作成に利用します。また、予測時の高速な検索に備えて、最新値をオンラインストアに保持します。Uberは2017年にMichelangelo機械学習プラットフォームについて投稿し、共有フィーチャーストアを紹介しました。続いて、GojekがGoogle Cloudと開発を始めたオープンソースのフィーチャーストアFeastが登場し、Amazon SageMaker、Google Vertex AI、Azure Machine Learning、Databricksにもマネージド型のフィーチャーストアが登場しました。
フィーチャーストアの仕組み#
特徴量は生のイベントやテーブルから始まり、パイプラインを通じて特徴量エンジニアリングでモデル入力に変換されます。たとえば、1時間のスライディングウィンドウでカードの取引件数を数えたり、ニューラルネットワークを使った特徴抽出を行ったりします。フィーチャーストアは、この処理をいくつかのコンポーネントに整理します。
- 特徴量レジストリ:各特徴量の名前、エンティティキー(顧客、カード、商品、カメラなど、特徴量が説明する対象)、データ型、変換コード、所有者、バージョンを登録し、検索可能にします。チームはこれを使って特徴量を再利用し、一から作り直すことを避けられます。
- オフラインストア:イベントのタイムスタンプとともにすべての過去の値をデータウェアハウスまたはデータレイクに保存し、学習データセットの作成やバッチスコアリングに使用します。
- オンラインストア:RedisやDynamoDBなどのキーバリューデータベースに、エンティティごとの最新値を保存します。推論時に数ミリ秒で読み取れます。
- マテリアライゼーション:新しい値を計算し、オフラインストアから最新値をオンラインストアへコピーするバッチまたはストリーミングジョブです。
予測時には、不正検出などのサービスがカードIDを送信し、オンラインストアからカードの現在の特徴量を受け取り、それらをモデルに渡します。これにより、チェックアウト中のリアルタイム推論に十分な低い推論レイテンシを維持できます。
ポイントインタイム整合性#
各トレーニング行では、ラベル付けされたイベントが発生した時点の特徴量値を使用する必要があります。後から計算された値には未来の情報が含まれており、これはデータリークの一種です。そのため、オフラインではモデルの精度が高く見えても、本番環境では失敗します。フィーチャーストアはポイントインタイム結合によってこれを防ぎます。この結合では、同じエンティティについて、ラベルのタイムスタンプ以前または同時刻に記録された最新の特徴量値を各ラベルに対応付けます。pandas関数merge_asofでも同じ結合を実行できます。
import pandas as pd
# オフラインストア:各カードの過去1時間の取引件数を時系列で記録
features = pd.DataFrame(
{
"card_id": ["A", "B", "A", "A"],
"time": pd.to_datetime(["2026-10-01 09:00", "2026-10-01 10:00", "2026-10-01 12:00", "2026-10-01 15:00"]),
"txn_count_1h": [1, 2, 4, 9],
}
)
# 学習対象のラベル付きイベント:各取引は不正利用だったか?
labels = pd.DataFrame(
{
"card_id": ["B", "A"],
"time": pd.to_datetime(["2026-10-01 11:00", "2026-10-01 13:30"]),
"is_fraud": [0, 1],
}
)
# ポイントインタイム結合:各ラベルに対し、イベント時刻以前に記録された、そのカードの最新の特徴量値を取得
training_rows = pd.merge_asof(labels, features, on="time", by="card_id")
print(training_rows)カードAの13:30の不正利用ラベルには、12:00に記録された件数4が割り当てられます。取引後の15:00に記録された件数9は、トレーニングセットから除外されます。カードBの11:00のラベルには、エンティティキーで行を照合するby引数によって、カードB自身の値2が割り当てられます。
学習時とサービング時のずれ#
学習時とサービング時のずれとは、モデルの学習に使われた特徴量と、本番環境でモデルが受け取る特徴量との間に生じる差です。バッチSQLジョブが学習用の特徴量を計算する一方で、別途作成したアプリケーションコードがサービング用の特徴量を計算し、タイムゾーン、ウィンドウ境界、単位、欠損値の補完方法が異なる場合に発生します。Googleの機械学習のルールでは、このずれについて一節を設け、後続の学習でまったく同じ値を使用できるよう、サービング時に使った特徴量を記録することを推奨しています。フィーチャーストアは、1つの定義から各特徴量を一度だけ計算して両方の用途に使うことで、重複するコードパスをなくします。また、各特徴量の鮮度、欠損値、データドリフトを記録するため、モデル監視で精度低下の原因を入力の不具合までたどれます。
フィーチャーストアと関連システム#
- データレイク: あらゆる形式の生データファイルや処理済みファイルを格納します。多くのオフラインストアはデータレイク内にあり、その上にエンティティキー、タイムスタンプ、ポイントインタイム取得、オンラインサービングの機能を加えたものがフィーチャーストアです。
- ベクトルデータベース: クエリベクトルに最も近い、保存済みの埋め込みを検索します。フィーチャーストアはエンティティIDで値を検索し、埋め込みをカウント、平均値、カテゴリと並ぶ1つの特徴量として保持する場合があります。
- モデルレジストリ: 学習済みモデルとそのメタデータをバージョン管理します。一方、フィーチャーストアはモデルが利用する入力をバージョン管理します。
- モデルサービング: APIの背後でモデルを実行し、各リクエストの特徴量を取得するためにオンラインストアを呼び出します。
コンピュータービジョンの特徴量#
動画分析では、カメラ映像から予測、異常検知、予測モデリング向けの特徴量を生成します。たとえば、店舗入口の時間ごとの来客数、レジの待ち列の長さ、生産ラインごとの不良率などを、カメラIDまたはラインIDとタイムスタンプに紐付けて記録します。小売では、人数カウントの結果を人員配置や需要のモデルに利用し、製造では、シフトごとの不良件数を保守モデルに利用します。Ultralytics YOLOの物体カウントは、このような値を直接生成します。各検出物体をフレーム間で追跡し、物体がラインや領域を通過すると、累積したin_countとout_countの合計、およびクラスごとの件数を返します。これらはカメラごとのタイムスタンプ付きの値として、フィーチャーストアに書き込めます。










