Point-in-Time-Support mit Zeitreihen-Featuretabellen
In diesem Artikel wird beschrieben, wie Sie die Punkt-in-Time-Korrektheit verwenden, um ein Schulungsdatenset zu erstellen, das Featurewerte zum Zeitpunkt der Aufzeichnung einer Bezeichnungsbeobachtung genau widerspiegelt. Dies ist wichtig, um Datenlecks zu verhindern, die auftreten, wenn Sie Featurewerte für Modellschulungen verwenden, die zum Zeitpunkt der Aufzeichnung der Bezeichnung nicht verfügbar waren. Dieser Fehlertyp kann schwer zu erkennen sein und sich negativ auf die Leistung des Modells auswirken.
Zeitreihen-Featuretabellen enthalten eine Zeitstempel-Schlüsselspalte, die sicherstellt, dass jede Zeile im Trainingsdataset die neuesten bekannten Featurewerte ab dem Zeitstempel der Zeile darstellt. Sie sollten die Verwendung von Zeitreihen-Featuretabellen immer dann in Betracht ziehen, wenn sich Ihre Featurewerte im Laufe der Zeit ändern, z. B. bei Zeitreihendaten, ereignisbasierten Daten oder zeitaggregierten Daten.
Das folgende Diagramm zeigt, wie der Zeitstempelschlüssel verwendet wird. Der für jeden Zeitstempel aufgezeichnete Featurewert ist der neueste Wert vor diesem Zeitstempel, der durch den umrissenen orangefarbenen Kreis angegeben wird. Wenn keine Werte aufgezeichnet wurden, ist der Featurewert null. Weitere Informationen finden Sie unter Funktionsweise von Featuretabellen für Zeitreihen.
Hinweis
- Mit Databricks Runtime 13.3 LTS und höher kann jede Delta-Tabelle in Unity Catalog mit Primärschlüsseln und Zeitstempelschlüsseln als Featuretabelle für Zeitreihen verwendet werden.
- Für eine bessere Leistung bei Point-in-Time-Lookups empfiehlt Databricks, dass Sie Liquid Clustering (für
databricks-feature-engineering
0.6.0 und höher) oder Z-Ordering (fürdatabricks-feature-engineering
0.6.0 und niedriger) auf Zeitreihentabellen anwenden. - Die Funktion des Point-in-Time-Lookups wird manchmal als „Zeitreise“ bezeichnet. Die Point-in-Time-Lookups in Databricks Feature Store entsprechen nicht der Delta Lake-Zeitreise.
Funktionsweise von Featuretabellen für Zeitreihen
Angenommen, Sie haben die folgenden Featuretabellen. Diese Daten stammen aus dem Beispielnotizbuch.
Die Tabellen enthalten Sensordaten, die die Temperatur, relative Luftfeuchtigkeit, das Umgebungslicht und Kohlendioxid in einem Raum messen. Die Tabelle „Grundwahrheit“ gibt an, ob eine Person im Raum anwesend war. Jede der Tabellen verfügt über einen Primärschlüssel (‚raum‘) und einen Zeitstempelschlüssel (‚ts‘). Der Einfachheit halber werden nur Daten für einen einzigen Wert des Primärschlüssels (‚0‘) angezeigt.
Die folgende Abbildung veranschaulicht, wie der Zeitstempelschlüssel verwendet wird, um die Point-in-Time-Korrektheit in einem Trainingsdataset sicherzustellen. Featurewerte werden basierend auf dem Primärschlüssel (nicht im Diagramm dargestellt) und dem Zeitstempelschlüssel unter Verwendung eines AS OF-Joins abgeglichen. Der AS OF-Join stellt sicher, dass der neueste Wert des Features zum Zeitpunkt des Zeitstempels im Trainingssatz verwendet wird.
Wie in der Abbildung gezeigt, enthält das Trainingsdataset die neuesten Featurewerte für jeden Sensor vor dem Zeitstempel der beobachteten Grundwahrheit.
Wenn Sie ein Trainingsdataset erstellt haben, ohne den Zeitstempelschlüssel zu berücksichtigen, verfügen Sie möglicherweise über eine Zeile mit diesen Featurewerten und der beobachteten Grundwahrheit:
temp | rh | Leicht | CO2 | Grundwahrheit |
---|---|---|---|---|
15.8 | 32 | 212 | 630 | 0 |
Dies ist jedoch keine gültige Beobachtung für das Training, da der CO2-Wert von 630 um 8:52 Uhr, nach der Beobachtung der Grundwahrheit um 8:50 Uhr, genommen wurde. Die zukünftigen Daten „sickern“ in den Trainingssatz, wodurch die Leistung des Modells beeinträchtigt wird.
Anforderungen
- Für Feature Engineering in Unity Catalog: Feature Engineering in Unity Catalog Client (beliebige Version).
- Für Workspace Feature Store: Feature Store-Client v0.3.7 und höher.
Angeben zeitbezogener Schlüssel
Um Zeitpunktfunktionen zu verwenden, müssen Sie zeitbezogene Schlüssel mithilfe des timeseries_columns
-Arguments (für Feature Engineering in Unity Catalog) oder des timestamp_keys
-Arguments (für Workspace Feature Store) angeben. Damit wird angegeben, dass Featuretabellenzeilen verknüpft werden sollen, indem der neueste Wert für einen bestimmten Primärschlüssel abgeglichen wird, der nicht später ist als der Wert der timestamps_keys
-Spalte, anstatt auf einer genauen Zeitübereinstimmung basierend zu verknüpfen.
Wenn Sie nicht timeseries_columns
oder timestamp_keys
sondern nur eine Zeitserienspalte als Primärschlüsselspalte festlegen, wendet der Featurespeicher während Verknüpfungen keine Point-in-Time-Logik auf die Zeitserienspalte an. Stattdessen werden nur Zeilen mit einer exakten Zeitübereinstimmung abgeglichen, anstatt alle vor dem Zeitstempel liegenden Zeilen abzugleichen.
Erstellen einer Featuretabelle für Zeitreihen in Unity Catalog
In Unity Catalog ist jede Tabelle mit einem TIMESERIES-Primärschlüssel eine Featuretabelle für Zeitreihen. Informationen zum Erstellen einer Featuretabelle finden Sie unter Erstellen einer Featuretabelle in Unity Catalog.
Erstellen einer Featuretabelle für Zeitreihen im lokalen Arbeitsbereich
Wenn Sie eine Zeitreihen-Featuretabelle erstellen möchten, muss der DataFrame oder das Schema eine Spalte enthalten, die Sie als Zeitstempelschlüssel festlegen.
Ab Feature Store Client v0.13.4 müssen Zeitstempelschlüsselspalten im primary_keys
Argument angegeben werden. Zeitstempelschlüssel sind Teil der „Primärschlüssel“, die jede Zeile in der Featuretabelle eindeutig identifizieren. Wie andere Primärschlüsselspalten dürfen Zeitstempelschlüsselspalten keine NULL
-Werte enthalten.
Feature Engineering in 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,
)
Workspace Feature Store Client v0.13.4 und höher
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,
)
Workspace Feature Store Client v0.13.3 und niedriger
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,
)
Eine Zeitreihen-Featuretabelle muss über einen Zeitstempelschlüssel verfügen und darf keine Partitionsspalten enthalten. Die Zeitstempelschlüsselspalte muss aus TimestampType
oder DateType
bestehen.
Databricks empfiehlt, dass Zeitreihen-Featuretabellen nicht mehr als zwei Primärschlüsselspalten enthalten, um eine hohe Schreib- und Lookupleistung zu gewährleisten.
Aktualisieren einer Zeitreihen-Featuretabelle
Beim Schreiben von Features in die Zeitreihen-Featuretabellen muss Ihr DataFrame im Gegensatz zu regulären Featuretabellen Werte für alle Features der Featuretabelle angeben. Durch diese Einschränkung wird die geringe Datendichte der Featurewerte zwischen den Zeitstempeln in der Zeitreihen-Featuretabelle verringert.
Feature Engineering in 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"
)
Workspace Feature Store Client v0.13.4 und höher
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"
)
Das Streamen von Zeitreihen-Featuretabellen wird unterstützt.
Erstellen eines Trainingssets mit einer Zeitreihen-Featuretabelle
Wenn Sie ein Point-in-Time-Lookup für Featurewerte aus einer Zeitreihen-Featuretabelle durchführen möchten, müssen Sie einen timestamp_lookup_key
im FeatureLookup
des Features angeben, der den Namen der DataFrame-Spalte angibt, in der die Zeitstempel enthalten sind, für die ein Lookup der Zeitreihenfeatures erfolgen soll. Databricks Feature Store ruft die neuesten Feature-Werte ab, die vor den in der timestamp_lookup_key
-Spalte des DataFrame angegebenen Zeitstempeln liegen und deren Primärschlüssel mit den Werten in den lookup_key
-Spalten des DataFrame übereinstimmen. Ansonsten wird null
abgerufen, wenn keine solchen Featurewerte vorhanden sind.
Feature Engineering in 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()
Tipp
Um eine schnellere Lookup-Leistung zu erzielen, wenn Photon aktiviert ist, übergeben Sie use_spark_native_join=True
an FeatureEngineeringClient.create_training_set
. Dies erfordert databricks-feature-engineering
Version 0.6.0 oder höher.
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()
Jedes FeatureLookup
einer Zeitreihen-Featuretabelle muss ein Point-in-Time-Lookup sein. Daher muss die timestamp_lookup_key
-Spalte angegeben werden, die in Ihrem DataFrame verwendet werden soll. Das Point-in-Time-Lookup überspringt keine Zeilen mit null
-Featurewerten, die in der Zeitreihen-Featuretabelle gespeichert sind.
Festlegen eines Zeitlimits für historische Featurewerte
Mit dem Feature Store-Client v0.13.0 oder höher, oder einer beliebigen Version des Feature Engineering in Unity Catalog-Clients, können Sie Featurewerte mit älteren Zeitstempeln aus dem Schulungssatz ausschließen. Verwenden Sie dazu den -Parameter lookback_window
in FeatureLookup
.
Der Datentyp von lookback_window
muss datetime.timedelta
lauten, und der Standardwert ist None
(alle Featurewerte werden unabhängig vom Alter verwendet).
Mit folgendem Code werden beispielsweise alle Featurewerte, die älter als 7 Tage sind, ausgeschlossen:
Feature Engineering in 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)
)
]
Wenn Sie create_training_set
mit dem oben genannten FeatureLookup
aufrufen, wird automatisch ein Beitritt um aktuellen Zeitpunkt ausgeführt, und Featurewerte, die älter als 7 Tage sind, werden ausgeschlossen.
Das Lookbackfenster wird während des Trainings und des Batchrückschließens angewendet. Während des Onlinerückschließens wird unabhängig vom Lookbackfenster immer der neueste Featurewert verwendet.
Bewerten von Modellen mit Zeitreihen-Featuretabellen
Wenn Sie ein Modell bewerten, das mit Features aus Zeitreihen-Featuretabellen trainiert wurde, ruft Databricks Feature Store die entsprechenden Features mithilfe von Point-in-Time-Lookups mit Metadaten ab, die während des Trainings mit dem Modell gepackt wurden. Der von Ihnen an FeatureEngineeringClient.score_batch
(für Feature Engineering in Unity Catalog) oder FeatureStoreClient.score_batch
(für Workspace Feature Store) bereitgestellte DataFrame muss eine Zeitstempelspalte mit demselben Namen und DataType
wie der timestamp_lookup_key
des an FeatureEngineeringClient.create_training_set
oder FeatureStoreClient.create_training_set
bereitgestellten FeatureLookup
enthalten.
Tipp
Um eine schnellere Lookup-Leistung zu erzielen, wenn Photon aktiviert ist, übergeben Sie use_spark_native_join=True
an FeatureEngineeringClient.score_batch
. Dies erfordert databricks-feature-engineering
Version 0.6.0 oder höher.
Veröffentlichen von Zeitreihenfeatures in einem Onlineshop
Sie können FeatureEngineeringClient.publish_table
(für Feature Engineering in Unity Catalog) oder FeatureStoreClient.publish_table
(für Workspace Feature Store) verwenden, um Zeitreihen-Featuretabellen in Onlinespeichern zu veröffentlichen. Der Databricks Feature Store veröffentlicht eine Momentaufnahme der neuesten Featurewerte für die einzelnen Primärschlüssel in der Featuretabelle im Onlinespeicher. Der Onlineshop unterstützt Primärschlüssellookups, aber keine Point-in-Time-Lookups.
Notebookbeispiel: Zeitreihen-Featuretabelle
Die folgenden Beispielnotebooks veranschaulichen Point-in-Time-Lookups für Zeitreihen-Featuretabellen.
Verwenden Sie dieses Notebook in Arbeitsbereichen, die für Unity Catalog aktiviert sind.
Beispielnotebook mit einer Zeitreihen-Featuretabelle (Unity Catalog)
Das folgende Notebook ist für Arbeitsbereiche ausgelegt, die nicht für Unity Catalog aktiviert sind. Es nutzt das Workspace Feature Store.