Compartir vía


Compatibilidad a un momento dado mediante tablas de características de serie temporal

En este artículo se describe cómo usar la corrección a un momento dado para crear un conjunto de datos de entrenamiento que refleje con precisión los valores de características a partir del momento en que se registró una observación de etiquetas. Esto es importante para evitar la pérdida de datos, que se produce cuando se usan valores de características para el entrenamiento del modelo que no estaban disponibles en el momento en que se registró la etiqueta. Este tipo de error puede ser difícil de detectar y puede afectar negativamente al rendimiento del modelo.

Las tablas de características de serie temporal incluyen una columna de clave de marca de tiempo que garantiza que cada fila del conjunto de datos de entrenamiento represente los valores de características conocidos más recientes a partir de la marca de tiempo de la fila. Debe usar tablas de características de serie temporal cuando los valores de las características cambian con el tiempo, por ejemplo, con datos de serie temporal, datos basados en eventos o datos agregados en tiempo.

En el diagrama siguiente se muestra cómo se usa la clave de marca de tiempo. El valor de característica registrado para cada marca de tiempo es el valor más reciente antes de esa marca de tiempo, indicado por el círculo naranja descrito. Si no se han registrado valores, el valor de la característica es NULL. Para obtener más información, consulte Funcionamiento de las tablas de características de serie temporal.

Valores de características que llegan a momentos diferentes.

Nota:

  • Con Databricks Runtime 13.3 LTS y versiones posteriores, cualquier tabla Delta de Unity Catalog con claves principales y claves de marca de tiempo se puede usar como tabla de características de serie temporal.
  • Para mejorar el rendimiento de las búsquedas puntuales, Databricks recomienda aplicar agrupación en clústeres líquidos (para databricks-feature-engineering 0.6.0 y versiones posteriores) o Z-Ordering (para databricks-feature-engineering 0.6.0 y versiones anteriores) en las tablas de series temporales.
  • La funcionalidad de búsqueda de un momento dado se conoce a veces como "viaje en el tiempo". La funcionalidad de un momento dado de Databricks Feature Store no está relacionada con el viaje en el tiempo de Delta Lake.

Funcionamiento de las tablas de características de series temporales

Supongamos que tiene las siguientes tablas de características. Estos datos se toman del cuaderno de ejemplo.

Las tablas contienen datos de sensor que miden la temperatura, la humedad relativa, la luz ambiente y el dióxido de carbono en una habitación. La tabla verdad terreno indica si una persona estaba presente en la sala. Cada una de las tablas tiene una clave principal (“room”) y una clave de marca de tiempo (“ts”). Por motivos de simplicidad, solo se muestran los datos de un único valor de la clave principal ("0").

datos de ejemplo de características de tabla

En la ilustración siguiente, se muestra cómo se usa la clave de marca de tiempo para garantizar la corrección de un momento dado de un conjunto de datos de entrenamiento. Los valores de características se hacen coincidir en función de la clave principal (no se muestra en el diagrama) y la clave de marca de tiempo, mediante una combinación AS OF. La combinación AS OF garantizará que el valor más reciente de la característica en el momento de la marca de tiempo se use en el conjunto de formación.

cómo funciona el trabajo de un momento dato

Como se muestra en la ilustración, el conjunto de datos de entrenamiento incluye los valores de las características más recientes para cada sensor antes de la marca de tiempo en la verdad terreno observada.

Si ha creado un conjunto de datos de entrenamiento sin tener en cuenta la clave de marca de tiempo, es posible que tenga una fila con estos valores de características y verdad terreno observada:

temp rh luz co2 verdad terreno
15.8 32 212 630 0

Sin embargo, esto no es una observación válida para el entrenamiento, ya que la lectura co2 de 630 fue tomada a las 8:52, después de la observación de la verdad terreno de las 8:50. Los datos futuros se "filtran" en el conjunto de entrenamiento, lo que afectará al rendimiento del modelo.

Requisitos

  • Para la ingeniería de características en Unity Catalog: Ingeniería de características en el cliente de Unity Catalog (cualquier versión).
  • Para Workspace Feature Store: Cliente de Feature Store v0.3.7 y posteriores.

Para usar la funcionalidad a un momento dado, debe especificar claves relacionadas con el tiempo mediante el argumento timeseries_columns (para la ingeniería de características en Unity Catalog) o el argumento timestamp_keys (para Workspace Feature Store). Esto indica que las filas de la tabla de características deben combinarse haciendo coincidir el valor más reciente de una clave principal determinada que no es posterior al valor de la columna timestamps_keys, en lugar de combinar en función de una coincidencia de hora exacta.

Si no usa timeseries_columns o timestamp_keys y solo designa una columna de marca de tiempo como columna de clave principal, el almacén de características no aplica lógica de un momento dado a la columna de serie temporal durante las combinaciones. En su lugar, solo coincide con las filas con una coincidencia de hora exacta en lugar de hacer coincidir todas las filas anteriores a la marca de tiempo.

Creación de una tabla de características de serie temporal en Unity Catalog

En Unity Catalog, cualquier tabla con una clave principal TIMESERIES es una tabla de características de serie temporal. Consulte Creación de una tabla de características en Unity Catalog para obtener información sobre cómo crear una.

Creación de una tabla de características de serie temporal en el área de trabajo local

Para crear una tabla de características de serie temporal en Workspace Feature Store local, DataFrame o el esquema deben contener una columna que designe como clave de marca de tiempo.

A partir del cliente de Feature Store v0.13.4, las columnas de clave de marca de tiempo deben especificarse en el argumento primary_keys. Las claves de marca de tiempo forman parte de las "claves principales" que identifican de forma única cada fila de la tabla de características. Al igual que otras columnas de clave principal, las columnas de clave de marca de tiempo no pueden contener valores NULL.

Ingeniería de características en 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,
)

Cliente de Workspace Feature Store v0.13.4 y versiones posteriores

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

Cliente de Workspace Feature Store v0.13.3 y anteriores

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

Una tabla de características de serie temporal debe tener una clave de marca de tiempo y no puede tener ninguna columna de partición. La columna de clave de marca de tiempo debe ser de TimestampType o DateType.

Databricks recomienda que las tablas de características de serie temporal no tengan más de dos columnas de clave principal para garantizar escrituras y búsquedas eficaces.

Actualización de una tabla de características de serie temporal

Al escribir características en las tablas de características de serie temporal, DataFrame debe proporcionar valores para todas las características de la tabla de características, a diferencia de las tablas de características normales. Esta restricción reduce la dispersión de los valores de característica entre las marcas de tiempo de la tabla de características de serie temporal.

Ingeniería de características en 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"
)

Cliente de Workspace Feature Store v0.13.4 y versiones posteriores

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

Se admite el streaming de escrituras en tablas de características de serie temporal.

Creación de un conjunto de entrenamiento con una tabla de características de serie temporal

Para realizar una búsqueda de un momento dado de los valores de características de una tabla de características de serie temporal, debe especificar timestamp_lookup_key en FeatureLookup de la característica, que indica el nombre de la columna DataFrame que contiene marcas de tiempo en las que buscar características de serie temporal. Databricks Feature Store recupera los valores de característica más recientes antes de las marcas de tiempo especificadas en la columna timestamp_lookup_key del DataFrame y cuyas claves principales (excluyendo las claves de marca de tiempo) coinciden con los valores de las columnas lookup_key del DataFrame null o si no existe ningún valor de característica de este tipo.

Ingeniería de características en 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()

Sugerencia

Para obtener un rendimiento de búsqueda más rápido cuando se habilita Photon, pase use_spark_native_join=True a FeatureEngineeringClient.create_training_set. Esto requiere databricks-feature-engineering versión 0.6.0 o posterior.

Workspace 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()

Cualquier FeatureLookup de una tabla de características de serie temporal debe ser una búsqueda de un momento dado, por lo que debe especificar una columna timestamp_lookup_key que se usará en el DataFrame. La búsqueda de un momento dado no omite las filas con valores null de característica almacenados en la tabla de características de serie temporal.

Establecer un límite de tiempo para los valores históricos de las características

Con el cliente de Feature Store v0.13.0 o posteriores, o cualquier versión de Ingeniería de características en el cliente de Unity Catalog, puede excluir valores de características con marcas de tiempo anteriores del conjunto de entrenamiento. Para ello, use el parámetro lookback_window en FeatureLookup.

El tipo de datos de lookback_window debe ser datetime.timedelta y el valor predeterminado es None (se usan todos los valores de características, independientemente de la antigüedad).

Por ejemplo, el código siguiente excluye los valores de características que tienen más de 7 días de antigüedad:

Ingeniería de características en 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)
  )
]

Workspace 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)
  )
]

Cuando se llama a create_training_set con el FeatureLookup anterior, realiza automáticamente la combinación a un momento dado y excluye los valores de características anteriores a 7 días.

La ventana de búsqueda se aplica durante el entrenamiento y la inferencia por lotes. Durante la inferencia en línea, siempre se usa el valor de característica más reciente, independientemente de la ventana de búsqueda.

Modelos de puntuación con tablas de características de serie temporal

Al puntuar un modelo entrenado con características de tablas de características de serie temporal, Databricks Feature Store recupera las características adecuadas mediante búsquedas de un momento dado con metadatos empaquetados con el modelo durante el entrenamiento. El objeto DataFrame que proporcione a FeatureEngineeringClient.score_batch (para la ingeniería de características en Unity Catalog) o FeatureStoreClient.score_batch (para Workspace Feature Store) debe contener una columna de marca de tiempo con el mismo nombre y DataType que la cadena timestamp_lookup_key del objeto FeatureLookup proporcionado a FeatureEngineeringClient.create_training_set o FeatureStoreClient.create_training_set.

Sugerencia

Para obtener un rendimiento de búsqueda más rápido cuando se habilita Photon, pase use_spark_native_join=True a FeatureEngineeringClient.score_batch. Esto requiere databricks-feature-engineering versión 0.6.0 o posterior.

Publicación de características de serie temporal en un almacén en línea

Puede usar FeatureEngineeringClient.publish_table (para la ingeniería de características en Unity Catalog) o FeatureStoreClient.publish_table (para Workspace Feature Store) para publicar tablas de características de serie temporal en tiendas en línea. El almacén de características de Databricks publica una instantánea de los valores de características más recientes para cada clave principal de la tabla de características en la tienda en línea. La tienda en línea admite la búsqueda de claves principales, pero no admite la búsqueda de un momento dado.

Ejemplo de Notebook: tabla de características de serie temporal

Estos cuadernos de ejemplo muestran búsquedas en un momento dado en tablas de características de serie temporal.

Utilice este cuaderno en las áreas de trabajo habilitadas para Unity Catalog.

Cuaderno de ejemplo de tabla de características de serie temporal (Unity Catalog)

Obtener el cuaderno

El cuaderno siguiente está diseñado para las áreas de trabajo que no estén habilitadas para el catálogo de Unity. Utiliza el almacén de características del área de trabajo.

Cuaderno de ejemplo de tabla de características de serie temporal (áreas de trabajo no habilitadas para Unity Catalog)

Obtener el cuaderno