時系列特徴テーブルを使用したポイントインタイム サポート

モデルのトレーニングに使われるデータには、多くの場合、時間の依存関係が組み込まれています。 たとえば、工場でメンテナンスが必要な機械を予測するモデルをトレーニングしている場合、多くの機械のセンサー測定と使用状況のデータを含む履歴データセットと、機械にサービスが必要かどうかを示すターゲット ラベルが含まれている可能性があります。 データセットには、メンテナンス サービスが実行される前と後両方の、機械のデータが含まれている場合があります。

モデルを構築するときは、観察されたターゲット値の時間までの特徴値のみを考慮する必要があります (サービスが必要、またはサービスは不要)。 各観測のタイムスタンプを明示的に考慮しない場合は、ターゲット値のタイムスタンプの後に測定された特徴値を、トレーニングに誤って使用する可能性があります。 これは "データ漏えい" と呼ばれ、モデルのパフォーマンスに悪影響を及ぼす可能性があります。

時系列特徴テーブルには、トレーニング データセットの各行が行のタイムスタンプの時点で最新の既知の特徴値を表すことを保証するタイムスタンプ キー列が含まれます。 時系列データ、イベント ベースのデータ、時間集計データなど、時系列の特徴値が時間と共に変化するときは常に、時系列特徴テーブルを使う必要があります。

Note

  • Databricks Runtime 13.3 LTS 以降では、主キーとタイムスタンプ キーを持つ Unity Catalog 内のすべての Delta テーブルを時系列特徴量テーブルとして使用できます。
  • ポイントインタイム ルックアップのパフォーマンスを向上させるため、Databricks では、時系列テーブルに Liquid Clustering (databricks-feature-engineering 0.6.0 以上の場合) または Z-Ordering (databricks-feature-engineering 0.6.0 以下の場合) を適用することをお勧めします。
  • ポイントインタイム ルックアップ機能は、"タイム トラベル" と呼ばれる場合があります。 Databricks Feature Store のポイントインタイム機能は、Delta Lake のタイム トラベルとは関連がありません。

時系列特徴テーブルのしくみ

次の特徴テーブルがあるとします。 このデータは、ノートブックの例から取得されています。

テーブルには、室内の温度、相対湿度、環境光、二酸化炭素を測定するセンサー データが含まれています。 実測値テーブルは、人が部屋にいたかどうかを示しています。 各テーブルには、主キー ('room') とタイムスタンプ キー ('ts') があります。 わかりやすくするために、主キー ('0') の 1 つの値のデータのみが表示されています。

特徴テーブル データの例

次の図は、タイムスタンプ キーを使用して、トレーニング データセット内の特定の時点の正確性を確保する方法を示しています。 特徴値は、AS OF 結合を使用して、主キー (図に示されていない) とタイムスタンプ キーに基づいて照合されます。 AS OF 結合を使用すると、タイムスタンプ時の特徴の最新の値がトレーニング セットで使用されるようになります。

特定の時点のしくみ

図に示すように、トレーニング データセットには、観測された実測値のタイムスタンプより前の各センサーの最新の特徴値が含まれています。

タイムスタンプ キーを考慮せずにトレーニング データセットを作成した場合は、次のような特徴値と観測された実測値の行が存在する可能性があります。

temp rh light co2 実測値
15.8 32 212 630 0

しかし、これはトレーニングに有効な観測値ではありません。630 という co2 読み取り値は 8 時 50 分に実測値が観測された後、8 時 52 分に取得されたためです。 将来のデータがトレーニング セットに "入り込んでいる" ため、モデルの性能が劣化します。

要件

  • Unity Catalog の特徴エンジニアリングの場合: Unity Catalog の特徴エンジニアリング クライアント (任意のバージョン)。
  • ワークスペース Feature Store: Feature Store クライアント v0.3.7 以降。

ポイントインタイム機能を使用するには、timeseries_columns 引数 (Unity Catalog の Feature Engineering の場合) または timestamp_keys 引数 (ワークスペース Feature Store の場合) を使って、時間関連のキーを指定する必要があります。 これは、時間の正確な一致に基づいて結合するのではなく、timestamps_keys 列の値より後ではない特定の主キーの最新の値と一致させることによって、特徴テーブルの行を結合する必要があることを示します。

timeseries_columns または timestamp_keys を使っておらず、時系列の列のみを主キー列として指定した場合、Feature Store では結合中にポイントインタイム ロジックが時系列の列に適用されません。 代わりに、タイムスタンプより前のすべての行と一致させるのではなく、時刻が正確に一致する行のみと一致させます。

Unity Catalog で時系列特徴テーブルを作成する

Unity Catalog では、TIMESERIES 主キーを持つテーブルは、時系列特徴テーブルです。 作成方法については、「Unity Catalog で特徴テーブルを作成する」を参照してください。

ローカル ワークスペースで時系列特徴テーブルを作成する

ローカル Workspace Feature Store で時系列特徴量テーブルを作成するには、DataFrame またはスキーマはタイムスタンプ キーとして指定する列を含んでいる必要があります。

Feature Store クライアント v0.13.4 以降では、primary_keys 引数内でタイムスタンプ キー列を指定する必要があります。 タイムスタンプ キーは、特徴テーブルの各行を一意に識別する "主キー" の一部です。 他の主キー列と同様に、タイムスタンプ キー列に NULL 値を含めることはできません。

Unity Catalog の特徴エンジニアリング

fe = FeatureEngineeringClient()
# user_features_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fe.create_table(
  name="ml.ads_team.user_features",
  primary_keys=["user_id", "ts"],
  timeseries_columns="ts",
  features_df=user_features_df,
)

ワークスペース Feature Store クライアント v0.13.4 以降

fs = FeatureStoreClient()
# user_features_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fs.create_table(
  name="ads_team.user_features",
  primary_keys=["user_id", "ts"],
  timestamp_keys="ts",
  features_df=user_features_df,
)

ワークスペース Feature Store クライアント v0.13.3 以下

fs = FeatureStoreClient()
# user_features_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fs.create_table(
  name="ads_team.user_features",
  primary_keys="user_id",
  timestamp_keys="ts",
  features_df=user_features_df,
)

時系列機能テーブルには 1 つのタイムスタンプ キーが必要であり、パーティション列を含めることはできません。 タイムスタンプ キー列は TimestampType または DateType のものである必要があります。

Databricks では、パフォーマンスの高い書き込みと参照のために、時系列特徴テーブルに含める主キー列は 2 つ以下である必要があります。

時系列機能テーブルを更新する

時系列特徴テーブルに特徴を書き込む場合、DataFrame は、通常の特徴テーブルとは異なり、特徴テーブルのすべての特徴の値を指定する必要があります。 この制約により、時系列特徴テーブルのタイムスタンプ全体に特徴値が分散することを軽減できます。

Unity Catalog の特徴エンジニアリング

fe = FeatureEngineeringClient()
# daily_users_batch_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fe.write_table(
  "ml.ads_team.user_features",
  daily_users_batch_df,
  mode="merge"
)

ワークスペース Feature Store クライアント v0.13.4 以降

fs = FeatureStoreClient()
# daily_users_batch_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fs.write_table(
  "ads_team.user_features",
  daily_users_batch_df,
  mode="merge"
)

時系列機能テーブルへのストリーミング書き込みはサポートされています。

時系列特徴テーブルを使用してトレーニング セットを作成する

時系列特徴テーブルの特徴値に対してポイントインタイム ルックアップを実行するには、特徴の FeatureLookuptimestamp_lookup_key を指定する必要があります。これは、時系列特徴を参照するタイムスタンプを含む DataFrame 列の名前を示します。 Databricks Feature Store は、DataFrame の timestamp_lookup_key 列で指定されたタイムスタンプより前で、(タイムスタンプ キーを除く) 主キーが DataFrame の lookup_key 列の値と一致する最新の特徴量の値を取得します。そのような特徴量の値が存在しない場合は null を取得します。

Unity Catalog の特徴エンジニアリング

feature_lookups = [
  FeatureLookup(
    table_name="ml.ads_team.user_features",
    feature_names=["purchases_30d", "is_free_trial_active"],
    lookup_key="u_id",
    timestamp_lookup_key="ad_impression_ts"
  ),
  FeatureLookup(
    table_name="ml.ads_team.ad_features",
    feature_names=["sports_relevance", "food_relevance"],
    lookup_key="ad_id",
  )
]

# raw_clickstream DataFrame contains the following columns:
# - u_id
# - ad_id
# - ad_impression_ts
training_set = fe.create_training_set(
  df=raw_clickstream,
  feature_lookups=feature_lookups,
  exclude_columns=["u_id", "ad_id", "ad_impression_ts"],
  label="did_click",
)
training_df = training_set.load_df()

ヒント

Photon が有効になっているときにルックアップのパフォーマンスを向上させるには、use_spark_native_join=TrueFeatureEngineeringClient.create_training_set に渡します。 これには、databricks-feature-engineering バージョン 0.6.0 以降が必要です。

ワークスペース Feature Store

feature_lookups = [
  FeatureLookup(
    table_name="ads_team.user_features",
    feature_names=["purchases_30d", "is_free_trial_active"],
    lookup_key="u_id",
    timestamp_lookup_key="ad_impression_ts"
  ),
  FeatureLookup(
    table_name="ads_team.ad_features",
    feature_names=["sports_relevance", "food_relevance"],
    lookup_key="ad_id",
  )
]

# raw_clickstream DataFrame contains the following columns:
# - u_id
# - ad_id
# - ad_impression_ts
training_set = fs.create_training_set(
  df=raw_clickstream,
  feature_lookups=feature_lookups,
  exclude_columns=["u_id", "ad_id", "ad_impression_ts"],
  label="did_click",
)
training_df = training_set.load_df()

時系列特徴テーブル上の FeatureLookup はポイントインタイム ルックアップである必要があります。そのため、DataFrame で使用する timestamp_lookup_key 列を指定する必要があります。 ポイントインタイム ルックアップでは、時系列特徴テーブルに格納されている null 特徴値を含む行はスキップされません。

古い特徴量値の制限時間を設定する

Feature Store クライアント v0.13.0 以降、または Unity Catalog の Feature Engineering クライアントの任意のバージョンでは、古いタイムスタンプの特徴量値をトレーニング セットから除外できます。 これを行うには、FeatureLookuplookback_window パラメーターを使用します。

lookback_window のデータ型は datetime.timedelta である必要があり、既定値は None です (経過時間に関係なく、すべての特徴量値が使用されます)。

たとえば、次のコードでは、7 日を超える特徴量値は除外されます。

Unity Catalog の特徴エンジニアリング

from datetime import timedelta

feature_lookups = [
  FeatureLookup(
    table_name="ml.ads_team.user_features",
    feature_names=["purchases_30d", "is_free_trial_active"],
    lookup_key="u_id",
    timestamp_lookup_key="ad_impression_ts",
    lookback_window=timedelta(days=7)
  )
]

ワークスペース Feature Store

from datetime import timedelta

feature_lookups = [
  FeatureLookup(
    table_name="ads_team.user_features",
    feature_names=["purchases_30d", "is_free_trial_active"],
    lookup_key="u_id",
    timestamp_lookup_key="ad_impression_ts",
    lookback_window=timedelta(days=7)
  )
]

上記の FeatureLookupcreate_training_set を呼び出すと、ポイントインタイム結合が自動的に実行され、7 日より前の特徴量値は除外されます。

ルックバック ウィンドウは、トレーニングとバッチ推論中に適用されます。 オンライン推論中は、ルックバック ウィンドウに関係なく、常に最新の特徴量値が使用されます。

時系列特徴テーブルを使用してモデルをスコア付けする

時系列特徴テーブルの特徴を使用してトレーニングされたモデルをスコア付けすると、Databricks Feature Store は、トレーニング中にモデルと一緒にパッケージ化されたメタデータを使用して、特定の時点の参照を使用して適切な特徴を取得します。 FeatureEngineeringClient.score_batch (Unity Catalog のFeature Engineering の場合) または FeatureStoreClient.score_batch (ワークスペース Feature Store の場合) に指定する DataFrame には、FeatureEngineeringClient.create_training_set または FeatureStoreClient.create_training_set に指定された FeatureLookuptimestamp_lookup_key と同じ名前と DataType のタイムスタンプ列が含まれている必要があります。

ヒント

Photon が有効になっているときにルックアップのパフォーマンスを向上させるには、use_spark_native_join=TrueFeatureEngineeringClient.score_batch に渡します。 これには、databricks-feature-engineering バージョン 0.6.0 以降が必要です。

時系列特徴をオンライン ストアに公開する

FeatureEngineeringClient.publish_table (Unity Catalog の Feature Engineering の場合) または FeatureStoreClient.publish_table (ワークスペース Feature Store の場合) を使用して、時系列特徴テーブルをオンライン ストアに公開できます。 Databricks Feature Store には、オンライン ストアを作成した OnlineStoreSpec に応じて、時系列データのスナップショットまたはウィンドウをオンライン ストアに公開する機能が用意されています。 次の表に、各公開モードの詳細を示します。

オンライン ストア プロバイダー スナップショット公開モード ウィンドウ公開モード
Azure Cosmos DB (v0.5.0 以降) X
Azure MySQL (単一サーバー) X
Azure SQL Server X

時系列スナップショットを公開する

これにより、特徴テーブル内の各主キーの最新の特徴値が公開されます。 オンライン ストアでは主キー参照がサポートされますが、ポイントインタイム ルックアップはサポートされていません。

有効期限をサポートしていないオンライン ストアの場合、Databricks Feature Store ではスナップショット公開モードのみがサポートされます。 有効期限をサポートするオンライン ストアの場合、作成時に OnlineStoreSpec で有効期限 (ttl) が指定されている場合を除き、既定の公開モードはスナップショットです。

時系列ウィンドウを公開する

これにより、特徴テーブル内の各主キーのすべての特徴量の値がオンライン ストアに公開され、期限切れのレコードが自動的に削除されます。 レコードのタイムスタンプ (UTC) が過去に指定した有効期間を超えた場合、レコードは期限切れと見なされます。 有効期限の詳細については、クラウド固有のドキュメントを参照してください。

オンライン ストアでは、主キー検索がサポートされ、最新のタイムスタンプを持つ特徴量の値が自動的に取得されます。

この公開モードを使用するには、オンライン ストアを作成するときに、OnlineStoreSpec で有効期間 (ttl) の値を指定する必要があります。 一度設定された ttl は変更できません。 それ以降のすべての公開呼び出しでは ttl が継承され、OnlineStoreSpec で明示的に定義する必要はありません。

ノートブックの例l: 時系列特徴テーブル

次のノートブックは、Workspace Feature Store の時系列特徴量テーブル上でのポイントインタイム検索を示しています。

時系列特徴テーブルのノートブックの例

ノートブックを入手