Stöd för tidpunkt med hjälp av funktionstabeller för tidsserier
Den här artikeln beskriver hur du använder rätt tidpunkt för att skapa en träningsdatauppsättning som korrekt återspeglar funktionsvärden från och med den tidpunkt då en etikettobservation registrerades. Detta är viktigt för att förhindra dataläckage, vilket inträffar när du använder funktionsvärden för modellträning som inte var tillgängliga när etiketten registrerades. Den här typen av fel kan vara svår att identifiera och kan påverka modellens prestanda negativt.
Funktionstabeller för tidsserier innehåller en tidsstämpelnyckelkolumn som ser till att varje rad i träningsdatauppsättningen representerar de senaste kända funktionsvärdena från och med radens tidsstämpel. Du bör använda tidsseriefunktionstabeller när funktionsvärden ändras över tid, till exempel med tidsseriedata, händelsebaserade data eller tidsaggregerade data.
Följande diagram visar hur tidsstämpelnyckeln används. Funktionsvärdet som registreras för varje tidsstämpel är det senaste värdet före tidsstämpeln, vilket anges av den konturerade orange cirkeln. Om inga värden har registrerats är funktionsvärdet null. Mer information finns i Så här fungerar funktionstabeller för tidsserier.
Kommentar
- Med Databricks Runtime 13.3 LTS och senare kan alla Delta-tabeller i Unity Catalog med primära nycklar och tidsstämpelnycklar användas som en funktionstabell för tidsserier.
- För bättre prestanda i punkt-i-tid-sökningar rekommenderar Databricks att du tillämpar Liquid Clustering (för
databricks-feature-engineering
0.6.0 och senare) eller Z-Ordering (fördatabricks-feature-engineering
0.6.0 och senare) på tidsserietabeller. - Uppslagsfunktioner för tidpunkt kallas ibland för "tidsresor". Punkt-i-tid-funktionerna i Databricks Feature Store är inte relaterade till Delta Lake-tidsresor.
Så här fungerar funktionstabeller för tidsserier
Anta att du har följande funktionstabeller. Dessa data hämtas från exempelanteckningsboken.
Tabellerna innehåller sensordata som mäter temperatur, relativ luftfuktighet, omgivande ljus och koldioxid i ett rum. Den grundläggande sanningstabellen anger om en person var närvarande i rummet. Var och en av tabellerna har en primärnyckel ("rum") och en tidsstämpelnyckel (ts). För enkelhetens skull visas endast data för ett enda värde för primärnyckeln ('0').
Följande bild visar hur tidsstämpelnyckeln används för att säkerställa rätt tidpunkt i en träningsdatauppsättning. Funktionsvärden matchas baserat på primärnyckeln (visas inte i diagrammet) och tidsstämpelnyckeln med hjälp av en AS OF-koppling. AS OF-kopplingen säkerställer att det senaste värdet för funktionen vid tidpunkten för tidsstämpeln används i träningsuppsättningen.
Som du ser i bilden innehåller träningsdatauppsättningen de senaste funktionsvärdena för varje sensor före tidsstämpeln på den observerade grundsanningen.
Om du har skapat en träningsdatauppsättning utan att ta hänsyn till tidsstämpelnyckeln kan du ha en rad med dessa funktionsvärden och observerad grundsanning:
temp | Rh | ljus | co2 | grund sanning |
---|---|---|---|---|
15.8 | 32 | 212 | 630 | 0 |
Detta är dock inte en giltig observation för träning, eftersom co2 läsning av 630 togs vid 8:52, efter observation av marken sanningen vid 8:50. Framtida data "läcker" till träningsuppsättningen, vilket försämrar modellens prestanda.
Krav
- För funktionsutveckling i Unity Catalog: Funktionsutveckling i Unity Catalog-klienten (valfri version).
- För arbetsytans funktionslager: Funktionsarkivklient v0.3.7 och senare.
Så här anger du tidsrelaterade nycklar
Om du vill använda punkt-i-tid-funktioner måste du ange tidsrelaterade nycklar med argumentet timeseries_columns
(för Funktionsteknik i Unity Catalog) eller timestamp_keys
argumentet (för Arbetsytans funktionslager). Detta anger att funktionstabellrader ska kopplas genom att matcha det senaste värdet för en viss primärnyckel som inte är senare än värdet för timestamps_keys
kolumnen, i stället för att kopplas baserat på en exakt tidsmatchning.
Om du inte använder timeseries_columns
eller timestamp_keys
, och endast anger en tidseriekolumn som en primär nyckelkolumn, tillämpar funktionsarkivet inte punkt-i-tid-logik på tidsseriekolumnen under kopplingar. I stället matchar den endast rader med en exakt tidsmatchning i stället för att matcha alla rader före tidsstämpeln.
Skapa en funktionstabell för tidsserier i Unity Catalog
I Unity Catalog är alla tabeller med primärnyckeln TIMESERIES en funktionstabell för tidsserier. Se Skapa en funktionstabell i Unity Catalog för hur du skapar en.
Skapa en funktionstabell för tidsserier på en lokal arbetsyta
Om du vill skapa en funktionstabell för tidsserier i det lokala arbetsytans funktionslager måste dataramen eller schemat innehålla en kolumn som du anger som tidsstämpelnyckel.
Från och med Feature Store-klienten v0.13.4 måste tidsstämpelnyckelkolumner anges i primary_keys
argumentet. Tidsstämpelnycklar är en del av de "primära nycklar" som unikt identifierar varje rad i funktionstabellen. Precis som andra primärnyckelkolumner kan tidsstämpelnyckelkolumner inte innehålla NULL
värden.
Funktionsteknik i Unity-katalogen
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,
)
Arbetsytans funktionslagerklient v0.13.4 och senare
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,
)
Funktionslagerklient för arbetsyta v0.13.3 och nedan
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,
)
En tidsseriefunktionstabell måste ha en tidsstämpelnyckel och kan inte ha några partitionskolumner. Tidsstämpelns nyckelkolumn måste vara av TimestampType
eller DateType
.
Databricks rekommenderar att funktionstabeller för tidsserier inte har fler än två primärnyckelkolumner för att säkerställa högpresterande skrivningar och sökningar.
Uppdatera en funktionstabell för tidsserier
När du skriver funktioner till tidsseriefunktionstabellerna måste dataramen ange värden för alla funktioner i funktionstabellen, till skillnad från vanliga funktionstabeller. Den här begränsningen minskar glesheten för funktionsvärden över tidsstämplar i funktionstabellen för tidsserier.
Funktionsteknik i Unity-katalogen
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"
)
Arbetsytans funktionslagerklient v0.13.4 och senare
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"
)
Direktuppspelning av skrivningar till tidsseriefunktionstabeller stöds.
Skapa en träningsuppsättning med en funktionstabell för tidsserier
Om du vill utföra en punkt-i-tid-sökning efter funktionsvärden från en funktionstabell för tidsserier måste du ange en timestamp_lookup_key
i funktionens , som anger namnet på kolumnen DataFrame som innehåller tidsstämplar som du vill söka efter tidsseriefunktioner FeatureLookup
mot. Databricks Feature Store hämtar de senaste funktionsvärdena före de tidsstämplar timestamp_lookup_key
som anges i DataFrame-kolumnen och vars primära nycklar (exklusive tidsstämpelnycklar) matchar värdena i DataFrame-kolumnerna, eller null
om det inte finns något sådant funktionsvärdelookup_key
.
Funktionsteknik i Unity-katalogen
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()
Dricks
För snabbare uppslagsprestanda när Photon är aktiverat skickar du use_spark_native_join=True
till FeatureEngineeringClient.create_training_set
. Detta kräver databricks-feature-engineering
version 0.6.0 eller senare.
Funktionsarkiv för arbetsyta
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()
Alla FeatureLookup
i en funktionstabell för tidsserier måste vara en punkt-i-tid-sökning, så den måste ange en timestamp_lookup_key
kolumn som ska användas i dataramen. Punkt-i-tid-sökning hoppar inte över rader med null
funktionsvärden som lagras i funktionstabellen för tidsserier.
Ange en tidsgräns för historiska funktionsvärden
Med Feature Store-klienten v0.13.0 eller senare, eller någon version av Feature Engineering i Unity Catalog-klienten, kan du exkludera funktionsvärden med äldre tidsstämplar från träningsuppsättningen. Om du vill göra det använder du parametern lookback_window
FeatureLookup
i .
Datatypen lookback_window
måste vara datetime.timedelta
, och standardvärdet är None
(alla funktionsvärden används, oavsett ålder).
Följande kod exkluderar till exempel alla funktionsvärden som är mer än 7 dagar gamla:
Funktionsteknik i Unity-katalogen
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)
)
]
Funktionsarkiv för arbetsyta
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)
)
]
När du anropar create_training_set
med ovanstående FeatureLookup
utför den automatiskt tidpunktskopplingen och exkluderar funktionsvärden som är äldre än 7 dagar.
Tillbakablicksfönstret tillämpas under träning och batch-slutsatsdragning. Under online-slutsatsdragning används alltid det senaste funktionsvärdet, oavsett återblicksfönster.
Poängsätta modeller med tidsseriefunktionstabeller
När du bedömer en modell som tränats med funktioner från tidsseriefunktionstabeller hämtar Databricks Feature Store lämpliga funktioner med hjälp av punkt-i-tid-sökningar med metadata som paketeras med modellen under träningen. Den dataram som du anger för FeatureEngineeringClient.score_batch
(för funktionsutveckling i Unity Catalog) eller FeatureStoreClient.score_batch
(för Arbetsytans funktionslager) måste innehålla en tidsstämpelkolumn med samma namn och DataType
som för timestamp_lookup_key
den FeatureLookup
angivna till FeatureEngineeringClient.create_training_set
eller FeatureStoreClient.create_training_set
.
Dricks
För snabbare uppslagsprestanda när Photon är aktiverat skickar du use_spark_native_join=True
till FeatureEngineeringClient.score_batch
. Detta kräver databricks-feature-engineering
version 0.6.0 eller senare.
Publicera tidsseriefunktioner till en onlinebutik
Du kan använda FeatureEngineeringClient.publish_table
(för funktionsutveckling i Unity Catalog) eller FeatureStoreClient.publish_table
(för Funktionsarkiv för arbetsyta) för att publicera funktionstabeller för tidsserier till onlinebutiker. Databricks Feature Store publicerar en ögonblicksbild av de senaste funktionsvärdena för varje primärnyckel i funktionstabellen till onlinebutiken. Onlinebutiken har stöd för primärnyckelsökning men stöder inte sökning till tidpunkt.
Notebook-exempel: Funktionstabell för tidsserier
De här exempelanteckningsböckerna illustrerar punkt-i-tid-sökningar i funktionstabeller för tidsserier.
Använd den här notebook-filen på arbetsytor som är aktiverade för Unity Catalog.
Exempelanteckningsbok för tidsserietabell (Unity Catalog)
Följande notebook-fil är utformad för arbetsytor som inte är aktiverade för Unity Catalog. Arbetsytans funktionslager används.