Partage via


Prise en charge à un point dans le temps à l’aide de tables de fonctionnalités de série chronologique

Les données utilisées pour effectuer l’apprentissage d’un modèle intègrent souvent des dépendances temporelles. Supposons par exemple que vous effectuiez l’apprentissage d’un modèle pour prédire quelles machines d’une usine ont besoin d’une maintenance. Vous pouvez disposer de jeux de données historiques contenant des mesures de capteur et des données d’utilisation de nombreuses machines, ainsi que des étiquettes cibles indiquant si la machine a besoin ou non d’une maintenance. Il est possible que le jeu de données comporte des données sur les machines avant et après l’exécution d’un service de maintenance.

Lorsque vous générez le modèle, vous ne devez prendre en compte que les valeurs de caractéristiques précédant l’heure de la valeur cible observée (a besoin d’une maintenance ou n’a pas besoin de maintenance). Si vous ne prenez pas explicitement en compte l’horodatage de chaque observation, vous pouvez utiliser par inadvertance des valeurs de fonctionnalité mesurées après l’horodatage de la valeur cible pour l’entraînement. Ce cas de figure, appelé « fuite de données », peut nuire aux performances du modèle.

Les tables de caractéristiques de séries chronologiques incluent une colonne clé d’horodatage qui garantit que chaque ligne du jeu de données d’apprentissage représente les dernières valeurs de caractéristiques connues à partir de l’horodatage de la ligne. Utilisez systématiquement des tables de caractéristiques de séries chronologiques si les valeurs de caractéristiques changent au fil du temps, par exemple avec des données de séries chronologiques, des données basées sur les événements ou des données agrégées dans le temps.

Remarque

  • Avec Databricks Runtime 13.3 LTS et versions ultérieures, toute table Delta dans Unity Catalog avec des clés primaires et des clés timestamp peut être utilisée comme table de fonctionnalités de séries chronologiques.
  • Pour de meilleures performances dans les recherches à un point dans le temps, Databricks vous recommande d’appliquer Liquid Clustering (pour databricks-feature-engineering 0.6.0 et les versions ultérieures) ou Z-Ordering (pour databricks-feature-engineering 0.6.0 et les versions ultérieures) sur les tables de séries chronologiques.
  • La fonctionnalité de recherche à un point dans le temps est parfois appelée « voyage dans le temps ». La fonctionnalité de point dans le temps dans le magasin de caractéristiques Databricks n’est pas liée au voyage dans le temps Delta Lake.

Fonctionnement des tables de fonctionnalités de série chronologique

Supposons que vous disposez des tables de fonctionnalités suivantes. Ces données sont extraites de l’exemple de notebook.

Les tables contiennent des données de capteur mesurant la température, l’humidité relative, la lumière ambiante et le dioxyde de carbone dans une pièce. La table de vérité au sol indique si une personne était présente dans la salle. Chacune des tables a une clé primaire (« room ») et une clé d’horodatage (« ts »). Par souci de simplicité, seules les données relatives à une seule valeur de la clé primaire (« 0 ») sont affichées.

exemple de données de tableau de fonctionnalité

La figure suivante illustre la façon dont la clé d’horodatage est utilisée pour garantir l’exactitude dans le temps dans un jeu de données d’apprentissage. Les valeurs de fonctionnalité sont mises en correspondance en fonction de la clé primaire (non indiquée dans le diagramme) et de la clé d’horodatage, à l’aide d’une jointure AS OF. La jointure AS OF garantit que la valeur la plus récente de la fonctionnalité au moment de l’horodatage est utilisée dans le jeu d’apprentissage.

comment fonctionne la limite dans le temps

Comme le montre la figure, le jeu de données d’apprentissage inclut les dernières valeurs de fonctionnalité pour chaque capteur avant l’horodatage de la vérité au sol observée.

Si vous avez créé un jeu de données d’apprentissage sans prendre en compte la clé d’horodatage, vous pouvez avoir une ligne avec ces valeurs de caractéristiques et la vérité au sol observée :

temp rh léger co2 vérité au sol
15.8 32 212 630 0

Cependant, ce n’est pas une observation valable pour l’apprentissage, car la lecture co2 de 630 a été prise à 8:52, après l’observation de la vérité au sol à 8:50. Les futures données « fuient » dans le jeu d’apprentissage, ce qui va nuire aux performances du modèle.

Spécifications

  • Pour l’ingénierie des fonctionnalités dans Unity Catalog : Ingénierie des fonctionnalités dans le client Unity Catalog (toute version).
  • Pour l’espace de travail Feature Store : client Feature Store v0.3.7 ou une version ultérieure.

Pour utiliser la fonctionnalité ponctuelle, vous devez spécifier des clés liées au temps à l'aide de l'argument timeseries_columns (pour Feature Engineering dans Unity Catalog) ou de l'argument timestamp_keys (pour Espace de travail Feature Store). Il indique que les lignes de la table de caractéristiques doivent être jointes en faisant correspondre la valeur la plus récente d’une clé primaire particulière qui n’est pas postérieure à la valeur de la colonne timestamps_keys, et non en fonction d’une correspondance temporelle exacte.

Si vous n’utilisez pas timeseries_columns ou timestamp_keys, et si vous désignez uniquement une colonne de série temporelle comme colonne de clé primaire, le magasin de fonctionnalités n'applique pas de logique ponctuelle à la colonne de série temporelle lors des jointures. Au lieu d’établir une correspondance avec toutes les lignes antérieures à l’horodatage, il ne considère que les lignes présentant une correspondance temporelle exacte.

Créer une table de fonctionnalités de série chronologique dans Unity Catalog

Dans Unity Catalog, toute table avec une clé primaire TIMESERIES est une table de fonctionnalités de série chronologique. Pour apprendre à en créer une, consultez Créer une table de fonctionnalités dans Unity Catalog.

Créer une table de fonctionnalités de série chronologique dans un espace de travail local

Pour créer une table de fonctionnalité de série chronologique dans l’espace de travail du magasin de fonctionnalités, le DataFrame ou le schéma doit contenir une colonne que vous désignez comme clé timestamp.

À compter du client du magasin de fonctionnalités v0.13.4, les colonnes clés timestamp doivent être spécifiées dans l’argument primary_keys. Les clés timestamp font partie des « clés primaires » qui identifient de manière unique chaque ligne de la table de fonctionnalités. Comme d’autres colonnes de clé primaire, les colonnes de clé timestamp ne peuvent pas contenir de valeurs NULL.

Ingénierie des fonctionnalités dans le catalogue Unity

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

Client du magasin de fonctionnalités Espace de travail versions 0.13.4 et ultérieures

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

Client du magasin de fonctionnalités Espace de travail versions 0.13.3 et antérieures

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

Une table de caractéristiques de série chronologique doit avoir une clé d’horodatage et ne peut pas avoir de colonne de partition. La colonne de clé timestamp doit être de TimestampType ou DateType.

Databricks recommande que les tables de caractéristiques de série chronologique n’aient pas plus de deux colonnes clés primaires pour garantir des écritures et des recherches performantes.

Mettre à jour une table de caractéristiques de série chronologique

Lors de l’écriture de caractéristiques dans les tables de caractéristiques de série chronologique, votre DataFrame doit fournir des valeurs pour toutes les caractéristiques de la table de caractéristiques, contrairement aux tables de caractéristiques standard. Cette contrainte réduit la densité des valeurs de caractéristiques entre les horodatages dans la table de caractéristiques de série chronologique.

Ingénierie des fonctionnalités dans le catalogue Unity

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

Client du magasin de fonctionnalités Espace de travail versions 0.13.4 et ultérieures

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

Le streaming d’écritures dans les tables de caractéristiques de série chronologique est pris en charge.

Créer un jeu d’entraînement avec une table de caractéristiques de série chronologique

Pour effectuer une recherche à un point dans le temps de valeurs de caractéristiques à partir d’une table de caractéristiques de série chronologique, vous devez spécifier un timestamp_lookup_key dans le FeatureLookup de la caractéristique, qui indique le nom de la colonne du DataFrame qui contient les horodatages par rapport auxquels effectuer la recherche de caractéristiques de série chronologique. Le magasin de fonctionnalités Databricks récupère les valeurs de fonctionnalités les plus récentes avant les horodatages spécifiés dans la colonne timestamp_lookup_key du DataFrame et dont les clés primaires correspondent aux valeurs des colonnes lookup_key du DataFrame, ou null si aucune valeur de fonctionnalités de ce type n’existe.

Ingénierie des fonctionnalités dans le catalogue Unity

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

Conseil

Pour accélérer les performances de recherche lorsque Photon est activé, passez use_spark_native_join=True à FeatureEngineeringClient.create_training_set. Ceci nécessite databricks-feature-engineering version 0.6.0 ou une version ultérieure.

Magasin de fonctionnalités de l'espace de travail

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

Tout FeatureLookup sur une table de caractéristiques de série chronologique doit être une recherche à un point dans le temps. Il doit donc spécifier une colonne timestamp_lookup_key à utiliser dans votre DataFrame. La recherche à un point dans le temps n’ignore pas les lignes avec des valeurs de caractéristiques null stockées dans la table de caractéristiques de série chronologique.

Définir une limite de temps pour les valeurs de fonctionnalité historiques

Avec le client Feature Store v0.13.0 ou supérieur, ou toute version de Feature Engineering dans le client Unity Catalog, vous pouvez exclure les valeurs de fonctionnalités avec des horodatages plus anciens de l'ensemble de formation. Pour ce faire, utilisez le paramètre lookback_window dans .FeatureLookup

Le type de données de lookback_window doit être datetime.timedelta, et la valeur par défaut est None (toutes les valeurs de fonctionnalité sont utilisées, quel que soit l’âge).

Par exemple, le code suivant exclut toutes les valeurs de fonctionnalité qui datent de plus de 7 jours :

Ingénierie des fonctionnalités dans le catalogue Unity

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

Magasin de fonctionnalités de l'espace de travail

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

Lorsque vous appelez create_training_set avec FeatureLookup qui précède , il effectue automatiquement la jointure à une date et heure et exclut les valeurs de fonctionnalité antérieures à 7 jours.

La fenêtre de recherche arrière est appliquée pendant l’apprentissage et l’inférence par lots. Pendant l’inférence en ligne, la dernière valeur de fonctionnalité est toujours utilisée, quelle que soit la fenêtre de recherche arrière.

Évaluer des modèles avec des tables de caractéristiques de série chronologique

Quand vous évaluez un modèle entraîné avec des caractéristiques de tables de caractéristiques de série chronologique, le magasin de caractéristiques Databricks récupère les caractéristiques appropriées en effectuant des recherches à un point dans le temps avec les métadonnées fournies avec le modèle pendant l’entraînement. Le DataFrame que vous fournissez FeatureEngineeringClient.score_batch (pour Feature Engineering dans Unity Catalog) ou FeatureStoreClient.score_batch (pour Espace de travail Feature Store) doit contenir une colonne d'horodatage portant le même nom et DataType que le timestamp_lookup_key celui FeatureLookup fourni à FeatureEngineeringClient.create_training_set ou FeatureStoreClient.create_training_set.

Conseil

Pour accélérer les performances de recherche lorsque Photon est activé, passez use_spark_native_join=True à FeatureEngineeringClient.score_batch. Ceci nécessite databricks-feature-engineering version 0.6.0 ou une version ultérieure.

Publier des fonctionnalités de série chronologique dans un magasin en ligne

Vous pouvez utiliser FeatureEngineeringClient.publish_table (pour Feature Engineering dans Unity Catalog) ou FeatureStoreClient.publish_table (pour Espace de travail Feature Store) pour publier des tableaux de fonctionnalités de séries chronologiques dans des magasins en ligne. Databricks Feature Store publie un instantané des dernières valeurs de caractéristiques pour chaque clé primaire de la table de caractéristiques dans le magasin en ligne. Le magasin en ligne prend en charge la recherche de clé primaire, mais ne prend pas en charge la recherche à un point dans le temps.

Exemple de notebook : table de fonctionnalités de série chronologique

Ces exemples de notebooks illustrent les recherches à un instant dans le passé sur les tables de caractéristiques de série chronologique.

Utilisez ce notebook dans les espaces de travail activés pour Unity Catalog.

Exemple de notebook de table de caractéristiques de série chronologique (Unity Catalog)

Obtenir le notebook

Le notebook suivant est conçu pour les espaces de travail qui ne sont pas activés pour Unity Catalog. Il utilise le Feature Store de l’espace de travail.

Exemple de notebook de table de caractéristiques de série chronologique (espaces de travail non activés pour Unity Catalog)

Obtenir le notebook