使用时序特征表

Databricks 特征存储通过时序特征表来支持需要时间点正确性的时序和基于事件的用例。 可将特定的列指定为特征表的时间戳键,并将特定主键值的历史特征值存储在不同的时间戳中,每个值存储在单独一行中。 Databricks 特征存储支持对时序特征表执行时间点查找,以检索在特定时间之前用于对模型进行训练或评分的最新特征值。

注意

时间点查找功能有时称为“按时间顺序查看”。 Databricks 特征存储中的时间点功能与 Delta Lake 按时间顺序查看无关。

时间点查找有助于避免在基于实时推理期间不可用的特征值训练模型时出现数据泄漏问题。 数据泄漏可能会导致训练与实时推理之间的模型性能出现明显差异。 使用时序特征表可以确保模型根据指定的时间戳使用最新特征进行训练。

如果特征值会不断变化(例如,在使用时序数据、基于事件的数据或时间聚合数据时),请考虑使用时序特征表。

要求

Databricks Runtime 10.3 ML 或更高版本。

在 Databricks 特征存储中创建时序特征表

若要创建时序特征表,数据帧或架构必须包含指定为时间戳键的列。

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",
  keys="user_id",
  timestamp_keys="ts",
  features_df=user_features_df,
)

时序特征表必须有一个时间戳键,并且不能包含任何分区列。 时间戳键列的类型必须为 TimestampTypeDateType,并且不能同时用作主键。

Databricks 建议不要在时序特征表中包含两个以上的主键列,以确保高性能的写入和查找。

更新时序特征表

将特征写入时序特征表时,数据帧必须为特征表的所有特征提供值,这与常规特征表不同。 此约束减少了时序特征表中不同时间戳的特征值的稀疏性。

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"
)

支持流式写入时序特征表。

使用时序特征表创建训练集

若要对时序特征表中的特征值执行时间点查找,必须在特征的 FeatureLookup 中指定一个指示数据帧列名称的 timestamp_lookup_key,该列包含查找时序特征时所依据的时间戳。 Databricks 特征存储检索在数据帧的 timestamp_lookup_key 列中指定的时间戳之前的、其主键与数据帧的 lookup_key 列中的值匹配的最新特征值,如果不存在此类特征值,则检索 null

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(
  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 必须是时间点查找,因此它必须指定要在数据帧中使用的 timestamp_lookup_key 列。 时间点查找不会跳过包含时序特征表中存储的 null 特征值的行。

使用时序特征表为模型评分

当你使用时序特征表中的特征为训练的模型评分时,Databricks 特征存储将使用在训练期间与模型一起打包的元数据通过时间点查找来检索适当的特征。 提供给 FeatureStoreClient.score_batch 的数据帧必须包含与提供给 FeatureStoreClient.create_training_setFeatureLookuptimestamp_lookup_key 名称和 DataType 相同的时间戳列。

将时序特征发布到联机存储

可以使用 FeatureStoreClient.publish_table 将时序特征表发布到联机存储。 Databricks 特征存储根据创建了联机存储的 OnlineStoreSpec,提供用于将快照或某个时段的时序数据发布到该联机存储的功能。 下表显示了每种发布模式的详细信息。

联机存储提供者 快照发布模式 时段发布模式
Azure MySQL X
Azure SQL Server X

发布时序快照

这会发布该特征表中每个主键的最新特征值。 联机存储支持主键查找,但不支持时间点查找。

对于不支持生存时间的联机存储,Databricks 特征存储仅支持快照发布模式。 对于支持生存时间的联机存储,除非创建时在 OnlineStoreSpec 中指定了生存时间 (ttl),否则默认发布模式为快照。

发布时序时段

这会将特征表中每个主键的所有特征值发布到联机存储,并自动删除已过期的记录。 如果记录的时间戳(UTC 时间)超过以前指定的生存时间,则将该记录视为已过期。 有关生存时间的详细信息,请参阅特定于云的文档。

联机存储支持主键查找,并自动检索具有最新时间戳的特征值。

若要使用此发布模式,必须在创建联机存储时在 OnlineStoreSpec 中提供生存时间 (ttl) 的值。 ttl 一经设置便无法更改。 所有后续发布调用将继承 ttl,且无需在 OnlineStoreSpec 中显式定义此参数。

示例笔记本

时序特征表示例笔记本

获取笔记本