Utiliser des tables de fonctionnalités de série chronologique avec prise en charge à un point dans le temps

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. Nous vous recommandons d’appliquer l’ordre de plan sur les tables de séries chronologiques pour améliorer le niveau de performance de points dans le temps.
  • 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.
  • 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 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.

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 Espace de travail Feature Store : client Feature Store v0.3.7 et supérieur

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 v0.13.4 et supérieur

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 v0.13.3 et versions 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 v0.13.4 et supérieur

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

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 :

Caractérisation 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.

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. Le Magasin de caractéristiques Databricks offre la possibilité de publier soit un instantané, soit une fenêtre de données de série chronologique sur le magasin en ligne, en fonction du OnlineStoreSpec qui a créé le magasin en ligne. Le tableau affiche les détails de chaque mode de publication.

Fournisseur de magasin en ligne Mode de publication d’instantané Mode de publication de fenêtre
Azure Cosmos DB (v0.5.0 et versions ultérieures) X
Azure MySQL (serveur unique) X
Azure SQL Server X

Publier un instantané de série chronologique

Cette opération publie les valeurs de caractéristiques les plus récentes pour chaque clé primaire dans la table de caractéristiques. 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.

Pour les magasins en ligne qui ne prennent pas en charge le temps de vie, le Magasin de caractéristiques Databricks prend uniquement en charge le mode de publication d’instantané. Pour les magasins en ligne qui prennent en charge le temps de vie, le mode de publication par défaut est l’instantané, sauf si le temps de vie (ttl) est spécifié dans OnlineStoreSpec au moment de la création.

Publier une fenêtre de série chronologique

Cela publie toutes les valeurs de caractéristique pour chaque clé primaire de la table de caractéristiques dans le magasin en ligne et supprime automatiquement les enregistrements expirés. Un enregistrement est considéré comme expiré si le timestamp de l’enregistrement (en UTC) est supérieur à la durée spécifiée pour la durée de vie dans le passé. Reportez-vous à la documentation spécifique au cloud pour plus d’informations sur la durée de vie.

Le magasin en ligne prend en charge la recherche de clé primaire et récupère automatiquement la valeur de la caractéristique avec le dernier timestamp.

Pour utiliser ce mode de publication, vous devez fournir une valeur pour le temps de vie (ttl) dans le OnlineStoreSpec lorsque vous créez le magasin en ligne. Impossible de changer le ttl une fois défini. Tous les appels de publication suivants héritent de ttl et ne n’ont pas à le définir explicitement dans OnlineStoreSpec.

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

Le notebook suivant illustre les recherches à un point dans le temps sur les tables de fonctionnalités de série chronologique dans le magasin de fonctionnalités de l’espace de travail.

Exemple de notebook de table de caractéristiques de série chronologique

Obtenir le notebook