Sdílet prostřednictvím


Podpora k určitému bodu v čase pomocí tabulek funkcí časových řad

Tento článek popisuje, jak pomocí správnosti k určitému bodu v čase vytvořit trénovací datovou sadu, která přesně odráží hodnoty funkcí v době, kdy bylo zaznamenáno pozorování popisků. 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 funkcí č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 funkcí v časovém razítku řá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.
  • Pro lepší výkon při vyhledávání k určitému bodu v čase doporučuje Databricks v tabulkách časových řad použít clustering Liquid (pro databricks-feature-engineering 0.6.0 a vyšší) nebo řazení Z (pro databricks-feature-engineering 0.6.0 a novější).
  • Funkce vyhledávání k určitému bodu v čase se někdy označuje jako "časová cesta". Funkce k určitému bodu v čase v úložišti funkcí Databricks nesouvisí s časovým cestováním Delta Lake.

Jak fungují tabulky funkcí č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íč (místnost) a klíč časového razítka (ne). Pro zjednodušení se zobrazí pouze data pro jednu hodnotu primárního klíče ('0').

Příklad dat tabulky funkcí

Následující obrázek znázorňuje způsob použití klíče časového razítka k zajištění správnosti k určitému bodu v čase v trénovací datové sadě. Hodnoty funkcí se shodují na základě primárního klíče (nezobrazuje se v diagramu) a klíče časového razítka pomocí funkce AS OF join. Funkce AS OF zajišťuje, že se v trénovací sadě použije nejnovější hodnota funkce v době časového razítka.

jak funguje bod v čase

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

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:

temp Rh světlo co2 základní pravda
15.8 32 212 630 0

To však není platné pozorování pro výcvik, protože co2 čtení 630 bylo přijato v 8:52, po pozorování základní pravdy 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: Klient úložiště funkcí v0.3.7 a vyšší.

Pokud chcete použít funkci k určitému bodu v čase, je nutné zadat klíče související s časem pomocí argumentu timeseries_columns (pro přípravu funkcí v katalogu Unity) nebo timestamp_keys argumentu (pro úložiště funkcí pracovního prostoru). To znamená, že řádky tabulky funkcí by se měly spojit s nejnovější hodnotou konkrétního primárního timestamps_keys klíče, který není pozdější než hodnota sloupce, a nikoli spojením na základě přesné shody času.

Pokud nepoužíváte timeseries_columns nebo timestamp_keysa označíte sloupec timeseries pouze jako sloupec primárního klíče, úložiště funkcí nepoužije logiku k určitému bodu v čase u sloupce timeseries během spojení. Místo toho odpovídá pouze řádkům s přesnou časovou shodu místo toho, aby odpovídaly 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 klíčem TIMESERIES tabulkou funkcí časové řady. Informace o tom, jak vytvořit tabulku funkcí v katalogu Unity, najdete v tématu Vytvoření tabulky funkcí.

Vytvoření tabulky funkcí časových řad v místním pracovním prostoru

Pokud chcete vytvořit tabulku funkcí časových řad v místním úložišti funkcí pracovního prostoru, musí datový rámec nebo schéma obsahovat sloupec, který určíte jako klíč časového razítka.

Počínaje klientem úložiště funkcí v0.13.4 musí být v argumentu zadány klíčové sloupce časového razítka primary_keys . Klíče časového razítka jsou součástí "primárních klíčů", které jednoznačně identifikují každý řádek v tabulce funkcí. Stejně jako jiné sloupce primárního klíče nesmí sloupce klíče časového razítka obsahovat NULL hodnoty.

Příprava funkcí v katalogu Unity

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

Klient úložiště funkcí pracovního prostoru verze 0.13.4 a vyšší

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

Klient úložiště funkcí pracovního prostoru verze 0.13.3 a novější

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

Tabulka funkcí časových řad musí mít jeden klíč časového razítka a nesmí obsahovat žádné sloupce oddílů. Sloupec klíče časového razítka musí být nebo TimestampType 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í.

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 sparsitu hodnot funkcí napříč časovými razítky v tabulce funkcí časové řady.

Příprava funkcí 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 úložiště funkcí pracovního prostoru verze 0.13.4 a vyšší

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ření trénovací sady s tabulkou funkcí časových řad

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

Příprava funkcí 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()

Tip

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

Úložiště funkcí 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 funkcí časové řady musí být vyhledáváním k určitému bodu v čase, takže musí určovat timestamp_lookup_key sloupec, který 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 úložiště funkcí verze 0.13.0 nebo vyšší nebo jakékoli verze přípravy 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í:

Příprava funkcí 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ě funkcí 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í.

Určení skóre modelů s tabulkami funkcí časových řad

Když vytrénujete model s funkcemi z tabulek funkcí časových řad, Databricks Feature Store načte příslušné funkce pomocí vyhledávání k určitému bodu v čase s metadaty zabalenými s modelem během trénování. Datový rámec, který FeatureEngineeringClient.score_batch zadáte (pro přípravu funkcí v katalogu Unity) nebo FeatureStoreClient.score_batch (pro úložiště funkcí pracovního prostoru) musí obsahovat sloupec časového razítka se stejným názvem a DataType jako timestamp_lookup_key zadaný FeatureEngineeringClient.create_training_set FeatureStoreClient.create_training_setsloupec FeatureLookup nebo .

Tip

Chcete-li zrychlit vyhledávání při povolení Photon , předejte use_spark_native_join=True do FeatureEngineeringClient.score_batchsouboru . 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 přípravu funkcí v katalogu Unity) nebo FeatureStoreClient.publish_table (pro úložiště funkcí pracovního prostoru) k publikování tabulek funkcí časových řad 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 úložiště podporuje vyhledávání primárního klíče, ale nepodporuje vyhledávání k určitému bodu v čase.

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

Tyto ukázkové poznámkové bloky znázorňují vyhledávání k určitému bodu v čase v tabulkách funkcí časových řad.

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

Ukázkový poznámkový blok s tabulkami funkcí časové řady (Katalog Unity)

Získat poznámkový blok

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 s tabulkami funkcí časové řady (pracovní prostory nejsou povolené pro katalog Unity)

Získat poznámkový blok