Spojení funkcí k určitému bodu v čase

Správnost k danému časovému okamžiku vytváří trénovací datovou sadu, která odráží hodnoty příznaků platné v okamžiku, kdy bylo zaznamenáno každé pozorování štítku. To je důležité, aby se zabránilo úniku dat, ke kterému dochází při použití hodnot funkcí pro trénování modelu, které nebyly v době zaznamenání popisku k dispozici. Tento typ chyby může být obtížné rozpoznat a může negativně ovlivnit výkon modelu.

Tabulky vlastností časové řady obsahují sloupec klíče časového razítka, který zajišťuje, že každý řádek v trénovací datové sadě představuje nejnovější známé hodnoty vlastností k okamžiku časového razítka řádku. Tabulky funkcí časových řad byste měli použít při každé změně hodnot funkcí v průběhu času, například s daty časových řad, daty založenými na událostech nebo agregovanými daty.

Následující diagram ukazuje, jak se používá klíč časového razítka. Hodnota funkce zaznamenaná pro každé časové razítko je nejnovější hodnotou před tímto časovým razítkem označeným oranžovým kruhem. Pokud nebyly zaznamenány žádné hodnoty, hodnota funkce má hodnotu null. Další podrobnosti najdete v tématu Jak fungují tabulky funkcí časových řad.

Hodnoty funkcí přicházející v různých časech

Poznámka:

  • S modulem Databricks Runtime 13.3 LTS a novějším je možné jako tabulku funkcí časové řady použít libovolnou tabulku Delta v katalogu Unity s primárními klíči a klíči časového razítka.
  • Databricks doporučuje pro lepší výkon při vyhledávání k určitému bodu v čase použít liquid clustering (databricks-feature-engineering 0.6.0 a vyšší) na tabulkách časových řad. Viz Použití kapalného clusteringu pro tabulky a přeskakování dat.
  • Funkce vyhledávání k určitému bodu v čase se někdy označuje jako "časová cesta". Funkce Databricks Feature Store pro konkrétní časový bod nesouvisí s funkcí časového cestování v rámci Delta Lake.

Jak fungují tabulky vlastností časových řad

Předpokládejme, že máte následující tabulky funkcí. Tato data pocházejí z ukázkového poznámkového bloku.

Tabulky obsahují data ze snímačů měření teploty, relativní vlhkosti, okolního světla a oxidu uhličitého v místnosti. Základní tabulka pravdy označuje, jestli byla osoba přítomna v místnosti. Každá tabulka má primární klíč ('room') a klíč časového razítka ('ts'). Pro zjednodušení se zobrazí pouze data pro jednu hodnotu primárního klíče ('0').

Příklad dat tabulky vlastností

Následující obrázek znázorňuje způsob použití klíče časového razítka k zajištění přesnosti v daném okamžiku v trénovací datové sadě. Hodnoty atributů se shodují podle primárního klíče (nezobrazuje se v diagramu) a časového klíče pomocí AS OF join. Funkce AS OF zajišťuje, že se v trénovací sadě použije nejnovější hodnota atributu k času specifikovanému časovým razítkem.

jak funguje bod v čase

Jak je znázorněno na obrázku, trénovací datová sada obsahuje nejnovější hodnoty vlastností pro každý senzor před časovým razítkem na pozorovaných skutečných hodnotách.

Pokud jste vytvořili trénovací datovou sadu bez zohlednění klíče časového razítka, můžete mít řádek s těmito hodnotami funkcí a pozorovanou základní pravdou:

dočasný Rh světlo co2 základní pravda
15.8 32 212 630 0

Toto však není platné pozorování pro trénink, protože naměřená hodnota CO2 630 byla zaznamenána v 8:52, tedy po zaznamenání skutečné hodnoty v 8:50. Budoucí data "unikají" do trénovací sady, což ovlivní výkon modelu.

Požadavky

  • Pro přípravu funkcí v katalogu Unity: Příprava funkcí v klientovi katalogu Unity (libovolná verze).
  • Úložiště funkcí pracovního prostoru (starší verze): Klient úložiště funkcí verze 0.3.7 a novější.

Chcete-li použít funkcionalitu k určitému bodu v čase, musíte zadat klíče související s časem pomocí argumentu timeseries_columns (pro feature engineering v katalogu Unity) nebo argumentu timestamp_keys (pro úložiště funkcí pracovního prostoru). To naznačuje, že řádky tabulky funkcí by se měly spojit podle nejnovější hodnoty pro konkrétní primární klíč, která je stejná nebo starší než hodnota sloupce timestamps_keys, namísto spojení na základě přesné časové shody.

Pokud nepoužíváte timeseries_columns nebo timestamp_keys a sloupec časové řady označíte pouze jako sloupec primárního klíče, datové úložiště funkcí nepoužije logiku časového momentu na sloupec časové řady během spojování. Místo toho odpovídá pouze řádkům s přesnou časovou shodou a ne všem řádkům před časovým razítkem.

Vytvoření tabulky funkcí časových řad v katalogu Unity

V katalogu Unity je každá tabulka s primárním TIMESERIES klíčem tabulka funkcí časové řady. Pokud chcete vytvořit tabulku funkcí časových řad, přečtěte si téma Vytvoření tabulky funkcí v katalogu Unity. Následující příklady ilustrují různé typy tabulek časových řad.

Publikujte tabulky časových řad do online obchodů

Při práci s tabulkami funkcí, které obsahují data časového razítka, je třeba zvážit, zda chcete sloupec časového razítka označit jako timeseries_column nebo ho považovat za běžný sloupec, v závislosti na vašich online požadavcích na obsluhu.

Sloupce časového razítka označené označením časové řady

Použijte timeseries_column , když potřebujete správnost k určitému okamžiku pro trénovací datové sady a chcete vyhledat nejnovější hodnoty funkcí k určitému časovému razítku v online aplikacích. Tabulka vlastností časových řad musí mít jeden klíč časového razítka a nesmí obsahovat žádné sloupce pro rozdělení. Sloupec klíče časového razítka musí být TimestampType nebo DateType.

Databricks doporučuje, aby tabulky funkcí časových řad neměly více než dva sloupce primárních klíčů, aby se zajistilo výkonnější zápisy a vyhledávání.

FeatureEngineeringClient API (API klienta pro zpracování funkcí)

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
)

SQL API

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

Důležité

Pokud tabulka funkcí obsahuje DATE nebo TIMESTAMP sloupec jako primární klíč, který není deklarován jako sloupec timeseries pomocí timeseries_columns, nelze použít tabulku s create_feature_spec(), create_training_set()nebo publish_table(). Tato rozhraní API vyžadují, aby se všechny DATE a TIMESTAMP primární klíčové sloupce deklarovaly jako sloupce časových intervalů.

Pokud váš případ použití vyžaduje hodnotu data nebo časového razítka jako prostý vyhledávací klíč (sémantika přesné shody, žádná logika k určitému bodu v čase), změňte typ sloupce na STRING místo toho.

Aktualizace tabulky funkcí časových řad

Při zápisu funkcí do tabulek funkcí časových řad musí datový rámec zadat hodnoty pro všechny funkce tabulky funkcí, na rozdíl od běžných tabulek funkcí. Toto omezení snižuje řídkost hodnot příznaků napříč časovými razítky v tabulce příznaků časové řady.

Inženýrství atributů v katalogu Unity

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

Klient Feature Store pracovního prostoru verze 0.13.4 a novější

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

Podporuje se streamování zápisů do tabulek funkcí časových řad.

Vytvořte tréninkovou sadu s tabulkou vlastností časových řad

Chcete-li provést vyhledání hodnot funkcí k určitému bodu v čase z tabulky funkcí časové řady, musíte zadat timestamp_lookup_key ve funkci FeatureLookup, která označuje název sloupce datového rámce obsahujícího časová razítka, proti kterým se mají vyhledat funkce časové řady. Úložiště příznaků Databricks načte nejnovější hodnoty příznaků před časovými razítky zadanými ve sloupci timestamp_lookup_key datového rámce, a jejich primární klíče (s výjimkou klíčů časového razítka) odpovídají hodnotám ve sloupcích lookup_key datového rámce, nebo null, pokud taková hodnota příznaku neexistuje.

Inženýrství atributů v katalogu Unity

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

Návod

Chcete-li zrychlit vyhledávání při povolení Photon, předejte use_spark_native_join=True do FeatureEngineeringClient.create_training_set. To vyžaduje databricks-feature-engineering verzi 0.6.0 nebo vyšší.

Úložiště vlastností pracovního prostoru

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

Každá FeatureLookup tabulka charakteristik časové řady musí být vyhledáváním k určitému časovému bodu, takže musí určit, který timestamp_lookup_key sloupec se má použít v datovém rámci. Vyhledávání k určitému bodu v čase nepřeskočí řádky s hodnotami funkcí uloženými null v tabulce funkcí časové řady.

Nastavení časového limitu pro historické hodnoty funkcí

Pomocí klienta pro úložiště funkcí verze 0.13.0 nebo vyšší, nebo jakékoli verze zpracování funkcí v klientovi katalogu Unity, můžete vyloučit hodnoty funkcí se staršími časovými razítky z trénovací sady. Uděláte to tak, že použijete parametr lookback_window v souboru FeatureLookup.

Datový typ lookback_window musí být datetime.timedeltaa výchozí hodnota je None (všechny hodnoty funkcí se používají bez ohledu na věk).

Následující kód například vylučuje všechny hodnoty funkcí, které jsou starší než 7 dní:

Inženýrství atributů v katalogu Unity

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

Úložiště vlastností pracovního prostoru

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

Při volání create_training_set pomocí výše uvedeného FeatureLookupoperátoru automaticky provede spojení k určitému bodu v čase a vyloučí hodnoty funkcí starší než 7 dnů.

Okno zpětného vyhledávání se použije během trénování a dávkového odvozování. Při odvozování online se vždy používá nejnovější hodnota funkce bez ohledu na okno zpětného vyhledávání.

Hodnocení modelů s tabulkami vlastností časových řad

Když vyhodnotíte vycvičený model s funkcemi z tabulek časových řad, Databricks Feature Store načte příslušné funkce pomocí vyhledávání k bodu v čase s metadaty zabalenými s modelem během trénování. Datový rámec, který zadáte do FeatureEngineeringClient.score_batch (pro Feature Engineering v Unity Catalog) nebo FeatureStoreClient.score_batch (pro Workspace Feature Store), musí obsahovat sloupec časového razítka se stejným názvem a DataType jako timestamp_lookup_key zadaný ke sloupcům FeatureLookup poskytovaným do FeatureEngineeringClient.create_training_set nebo FeatureStoreClient.create_training_set.

Návod

Chcete-li zrychlit vyhledávání při povolení Photon, předejte use_spark_native_join=True do FeatureEngineeringClient.score_batch. To vyžaduje databricks-feature-engineering verzi 0.6.0 nebo vyšší.

Publikování funkcí časových řad do online obchodu

Můžete použít FeatureEngineeringClient.publish_table (pro Inženýrství funkcí v katalogu Unity) nebo FeatureStoreClient.publish_table (pro Úložiště funkcí pracovního prostoru) k publikování tabulek časových řad funkcí do online obchodů. Úložiště funkcí Databricks publikuje snímek nejnovějších hodnot funkcí pro každý primární klíč v tabulce funkcí do online úložiště. Online obchod podporuje vyhledávání podle primárního klíče, ale nepodporuje vyhledávání v konkrétním okamžiku.

Příklad poznámkového bloku: Tabulka vlastností časových řad

Tyto ukázkové poznámkové bloky znázorňují vyhledávání v konkrétním časovém okamžiku v tabulkách charakteristik časových řad.

Tento poznámkový blok použijte v pracovních prostorech povolených pro katalog Unity.

Ukázkový notebook s tabulkou atributů časové řady (Katalog Unity)

Získat notebook

Následující poznámkový blok je určený pro pracovní prostory, které nejsou povolené pro katalog Unity. Používá úložiště funkcí pracovního prostoru.

Ukázkový poznámkový blok tabulky charakteristik časových řad (pracovní prostory nejsou povoleny pro Unity katalog)

Získat notebook