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.
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 (prodatabricks-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').
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í v0.3.7 a vyšší.
Určení klíčů souvisejících s časem
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_keys
a 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_set
souboru . 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.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 .
Tip
Chcete-li zrychlit vyhledávání při povolení Photon , předejte use_spark_native_join=True
do FeatureEngineeringClient.score_batch
souboru . 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)
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.