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) nebotimestamp_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íhotimestamps_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').
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 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 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()
Ú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.timedelta
a 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 FeatureLookup
operá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_set
sloupec 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.