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) 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 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').

exempel på funktionstabelldata

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.

hur tidpunkt fungerar

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 FeatureLookupmot. 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_windowFeatureLookupi .

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 FeatureLookuputfö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.

Exempelanteckningsbok för tidsseriefunktionstabell

Hämta notebook-fil