Prise en charge à un point dans le temps à l’aide de tables de fonctionnalités de série chronologique
Cet article explique comment utiliser l’exactitude dans le temps pour créer un jeu de données d’apprentissage qui reflète avec précision les valeurs des caractéristiques à partir du moment où une observation d’étiquette a été enregistrée. Cela est important pour éviter les fuites de données, qui se produisent lorsque vous utilisez des valeurs de fonctionnalité pour l’entraînement du modèle qui n’étaient pas disponibles au moment où l’étiquette a été enregistrée. Ce type d’erreur peut être difficile à détecter et peut affecter négativement les 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.
Le diagramme suivant montre comment la clé d’horodatage est utilisée. La valeur de fonctionnalité enregistrée pour chaque horodatage est la dernière valeur avant cet horodatage, indiquée par le cercle orange plané. Si aucune valeur n’a été enregistrée, la valeur de la fonctionnalité est Null. Pour plus d’informations, consultez Fonctionnement des tables de fonctionnalités de série chronologique.
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 (pourdatabricks-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.
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.
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.
Comment spécifier des clés liées au temps
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)
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.