Funktionssammanfogning vid specifik tidpunkt

Den här sidan beskriver hur du använder ögonblickskorrekthet för att skapa en träningsdatauppsättning som korrekt återspeglar funktionsvärden vid tiden 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 flytande klustring (databricks-feature-engineering 0.6.0 och senare) i tidsserietabeller. Se Använd flytande klustring för tabeller och Data skipping.
  • Funktionalitet för uppslag vid en viss 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').

exempeldata från egenskapstabell

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:

temperatur Rh ljus co2 grund sanning
15.8 32 212 630 0

Detta är dock inte en giltig observation för modellträning, eftersom CO2-avläsningen av 630 togs vid 8:52, efter observationen av grundsanningen vid 8:50. Framtida data "läcker" in i träningsuppsättningen, vilket stör modellens prestanda.

Krav

  • För funktionsutveckling i Unity Catalog: Funktionsutveckling i Unity Catalog-klienten (valfri version).
  • För Arbetsytans funktionlagringssystem (äldre): Funktionlagringssystemklient 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 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.

Skapa en funktionstabell för tidsserier i Unity Catalog

I Unity Catalog är alla tabeller med en TIMESERIES primärnyckel en funktionstabell för tidsserier. Information om hur du skapar en funktionstabell för tidsserier finns i Skapa en funktionstabell i Unity Catalog. Följande exempel illustrerar de olika typerna av tidsserietabeller.

Publicera tidsserietabeller till onlinebutiker

När du arbetar med funktionstabeller som innehåller tidsstämpeldata måste du överväga om du vill ange tidsstämpelkolumnen som en timeseries_column eller behandla den som en vanlig kolumn, beroende på dina krav för onlineservering.

Tidsstämpelkolumner markerade med tidsseriebeteckning

Använd timeseries_column när du behöver rätt tidpunkt för att träna datauppsättningar och vill leta upp de senaste funktionsvärdena från en specifik tidsstämpel i onlineprogram. 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.

FeatureEngineeringClient API

fe = FeatureEngineeringClient()

# Create a time series table for point-in-time joins
fe.create_table(
    name="catalog.schema.user_behavior_features",
    primary_keys=["user_id", "event_timestamp"],
    timeseries_columns="event_timestamp",  # Enables point-in-time logic
    df=features_df # DataFrame must contain primary keys and time series columns
)

API för SQL

-- Create table with time series constraint for point-in-time joins
CREATE TABLE catalog.schema.user_behavior_features (
    user_id STRING NOT NULL,
    event_timestamp TIMESTAMP NOT NULL,  -- part of primary key and designated as TIMESERIES
    purchase_amount DOUBLE,
    page_views_last_hour INT,
    CONSTRAINT pk_user_behavior PRIMARY KEY (user_id, event_timestamp TIMESERIES)
) USING DELTA
TBLPROPERTIES (
    'delta.enableChangeDataFeed' = 'true'
);

Important

Om en funktionstabell har en DATE- eller TIMESTAMP-kolumn som primärnyckel och inte är deklarerad som en tidsseriekolumn med timeseries_columns kan du inte använda tabellen med create_feature_spec(), create_training_set() eller publish_table(). Dessa API:er kräver att alla DATE kolumner och TIMESTAMP primärnyckelkolumner deklareras som tidseriekolumner.

Om ditt användningsfall kräver ett datum- eller tidsstämpelvärde som en vanlig uppslagsnyckel (exakt matchningssemantik, ingen logik för tidpunkt) ändrar du kolumntypen till STRING i stället.

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"
)

Workspace Feature Store-klient 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 samtidspunktsökning efter funktionsvärden från en funktionstabell för tidsserier måste du ange en timestamp_lookup_key i funktionens FeatureLookup, som anger namnet på DataFrame-kolumnen som innehåller tidsstämplar mot vilka du kan göra uppslag för tidsseriefunktioner. 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 lookup_key om det inte finns något sådant funktionsvärdenull.

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()

Tips

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.

Feature Store 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änd parametern lookback_window i FeatureLookup.

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)
  )
]

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

Utvärdera modeller med tidsserieegenskapstabeller

När du poängsätter en modell som tränats med funktioner från tidsseriefunktionstabeller hämtar Databricks Feature Store lämpliga funktioner med hjälp av tidpunktsbaserade uppslagningar med metadata som är paketerad med modellen under träningen. Den DataFrame som du anger till FeatureEngineeringClient.score_batch (för Feature Engineering i Unity Catalog) eller FeatureStoreClient.score_batch (för Workspace Feature Store) måste innehålla en tidsstämpelkolumn med samma namn och DataType som timestamp_lookup_key i den FeatureLookup som angivits till FeatureEngineeringClient.create_training_set eller FeatureStoreClient.create_training_set.

Tips

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 funktionsteknik i Unity Catalog) eller FeatureStoreClient.publish_table (för funktionstjänst för arbetsytan) för att publicera tidsseriefunktionstabeller 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 ögonblickssökning.

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

Följande notebook-fil är utformad för arbetsytor som inte är aktiverade för Unity Catalog. Det använder arbetsytans funktionslager.

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

Hämta notebook