Dela via


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.

Funktionsvärden som anländer vid olika tidpunkter.

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ör databricks-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').

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: Funktionsarkivklient v0.3.7 och senare.

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

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 FeatureLookupi .

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

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)

Hämta notebook-fil

Följande notebook-fil är utformad för arbetsytor som inte är aktiverade för Unity Catalog. Arbetsytans funktionslager används.

Exempelanteckningsbok för tidsseriefunktionstabell (arbetsytor som inte är aktiverade för Unity Catalog)

Hämta notebook-fil