Sdílet prostřednictvím


Použití tabulek funkcí časových řad s podporou k určitému bodu v čase

Data použitá k trénování modelu často obsahují závislosti času. Pokud například trénujete model tak, aby předpověděl, které počítače v výrobním podlaží potřebují údržbu, můžete mít historické datové sady obsahující měření snímačů a data o využití pro mnoho počítačů spolu s cílovými popisky, které označují, jestli stroj potřebuje službu nebo ne. Datová sada může obsahovat data pro počítače před provedením a po provedení služby údržby.

Při sestavování modelu je nutné zvážit pouze hodnoty funkcí až do doby, kdy pozorovaná cílová hodnota (vyžaduje službu nebo nepotřebuje službu). Pokud explicitně neberete v úvahu časové razítko každého pozorování, můžete neúmyslně použít hodnoty funkcí měřené po časovém razítku cílové hodnoty pro trénování. Tomu se říká "únik dat" 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.

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 vyhledávání k určitému bodu v čase doporučujeme u tabulek časových řad použít řazení Z.
  • 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.
  • 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 sloupec timeseries označíte 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.

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í verze 0.3.7 a vyšší

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

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

Ú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_setFeatureStoreClient.create_training_setsloupec FeatureLookup nebo .

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 poskytuje funkce pro publikování snímku nebo okna dat časových řad do online úložiště v závislosti na OnlineStoreSpec vytvořeném online úložišti. V tabulce jsou uvedeny podrobnosti o jednotlivých režimech publikování.

Poskytovatel online obchodu Režim publikování snímků Režim publikování okna
Azure Cosmos DB (verze 0.5.0 a vyšší) X
Azure MySQL (jeden server) X
Azure SQL Server X

Publikování snímku časové řady

Tím se publikují nejnovější hodnoty funkcí pro každý primární klíč v tabulce funkcí. 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.

Pro online obchody, které nepodporují dobu živého provozu, podporuje úložiště funkcí Databricks pouze režim publikování snímků. Pro online obchody, které podporují dobu živého provozu, je výchozí režim publikování snímek, pokud není čas naživo (ttl) zadán v OnlineStoreSpec době vytvoření.

Publikování okna časové řady

Tím se publikují všechny hodnoty funkcí pro každý primární klíč v tabulce funkcí do online obchodu a automaticky se odeberou záznamy, jejichž platnost vypršela. Pokud časové razítko záznamu (v UTC) přesahuje zadaný čas trvání v minulosti, považuje se za vypršení platnosti záznamu. Podrobnosti o čase do provozu najdete v dokumentaci specifické pro cloud.

Online úložiště podporuje vyhledávání primárního klíče a automaticky načte hodnotu funkce pomocí nejnovějšího časového razítka.

Chcete-li použít tento režim publikování, je nutné zadat hodnotu pro čas, který má být v reálném čase (ttl) při OnlineStoreSpec vytváření online obchodu. Po ttl nastavení nelze změnit. Všechna následná volání publikování dědí ttl a nejsou nutné explicitně definovat v souboru OnlineStoreSpec.

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

Následující poznámkový blok znázorňuje vyhledávání k určitému bodu v čase v tabulkách funkcí časových řad v úložišti funkcí pracovního prostoru.

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

Získat poznámkový blok