Använda tidsseriefunktionstabeller med stöd för tidpunkt
De data som används för att träna en modell har ofta inbyggda tidsberoenden. Om du till exempel tränar en modell för att förutsäga vilka datorer på fabriksgolvet som behöver underhåll, kan du ha historiska datauppsättningar som innehåller sensormätningar och användningsdata för många datorer, tillsammans med måletiketter som anger om datorn behövde tjänsten eller inte. Datamängden kan innehålla data för datorer både före och efter att en underhållstjänst har utförts.
När du skapar modellen måste du bara överväga funktionsvärden fram till tidpunkten för det observerade målvärdet (behöver tjänsten eller behöver inte tjänsten). Om du inte uttryckligen tar hänsyn till tidsstämpeln för varje observation kan du oavsiktligt använda funktionsvärden som mäts efter tidsstämpeln för målvärdet för träning. Detta kallas "dataläckage" 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.
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. Vi rekommenderar att du använder Z-beställning på tidsserietabeller för bättre prestanda vid tidpunktssökningar.
- Uppslagsfunktioner för tidpunkt kallas ibland för "tidsresor". Punkt-i-tid-funktionerna i Databricks Feature Store är inte relaterade till Delta Lake-tidsresor.
- 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) ellertimestamp_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örtimestamps_keys
kolumnen, i stället för att kopplas baserat på en exakt tidsmatchning. Om du bara anger en tidsseriekolumn 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.
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: Funktionsbutiksklient v0.3.7 och senare
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.
Funktionsutveckling 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,
)
Funktionsarkiv för arbetsyteklient 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 lägre
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.
Funktionsutveckling 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"
)
Funktionsarkiv för arbetsyteklient 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
.
Funktionsutveckling 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()
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:
Funktionsutveckling 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
.
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 tillhandahåller funktioner för att publicera antingen en ögonblicksbild eller ett fönster med tidsseriedata till onlinebutiken, beroende på vilken OnlineStoreSpec
som skapade onlinebutiken. Tabellen visar information för varje publiceringsläge.
Nätbutiksleverantör | Publiceringsläge för ögonblicksbilder | Publiceringsläge för fönster |
---|---|---|
Azure Cosmos DB (v0.5.0 och senare) | X | |
Azure MySQL (enskild server) | X | |
Azure SQL Server | X |
Publicera en ögonblicksbild av tidsserier
Detta publicerar de senaste funktionsvärdena för varje primärnyckel i funktionstabellen. Onlinebutiken har stöd för primärnyckelsökning men stöder inte sökning till tidpunkt.
För onlinebutiker som inte stöder time to live stöder Databricks Feature Store endast publiceringsläge för ögonblicksbilder. För onlinebutiker som har stöd för time to live är standardpubliceringsläget ögonblicksbild om inte time to live (ttl
) anges i OnlineStoreSpec
när det skapades.
Publicera ett tidsseriefönster
Detta publicerar alla funktionsvärden för varje primärnyckel i funktionstabellen till onlinebutiken och tar automatiskt bort utgångna poster. En post anses ha upphört att gälla om postens tidsstämpel (i UTC) är mer än den angivna tiden till live-varaktigheten tidigare. Mer information om time to live finns i molnspecifik dokumentation.
Onlinebutiken stöder primärnyckelsökning och hämtar automatiskt funktionsvärdet med den senaste tidsstämpeln.
Om du vill använda det här publiceringsläget måste du ange ett värde för tid att leva (ttl
) i OnlineStoreSpec
när du skapar onlinebutiken. Det ttl
går inte att ändra när den har angetts. Alla efterföljande publiceringsanrop ärver ttl
och krävs inte för att uttryckligen definiera det i OnlineStoreSpec
.
Notebook-exempel: Funktionstabell för tidsserier
Följande notebook-fil illustrerar punkt-i-tid-sökningar på funktionstabeller för tidsserier i Arbetsytans funktionslager.