Obsługa punkt-w czasie przy użyciu tabel funkcji szeregów czasowych
W tym artykule opisano sposób używania poprawności do punktu w czasie w celu utworzenia zestawu danych trenowania, który dokładnie odzwierciedla wartości funkcji w czasie rejestrowania obserwacji etykiety. Jest to ważne, aby zapobiec wyciekowi danych, co występuje, gdy używasz wartości funkcji do trenowania modelu, które nie były dostępne w momencie zarejestrowania etykiety. Ten typ błędu może być trudny do wykrycia i może negatywnie wpłynąć na wydajność modelu.
Tabele funkcji szeregów czasowych zawierają kolumnę klucza sygnatury czasowej, która gwarantuje, że każdy wiersz w zestawie danych trenowania reprezentuje najnowsze znane wartości funkcji jako sygnaturę czasową wiersza. Tabele funkcji szeregów czasowych należy używać zawsze, gdy wartości funkcji zmieniają się w czasie, na przykład w przypadku danych szeregów czasowych, danych opartych na zdarzeniach lub danych zagregowanych czasowo.
Na poniższym diagramie przedstawiono sposób użycia klucza znacznika czasu. Wartość funkcji zarejestrowana dla każdego znacznika czasu jest najnowszą wartością przed tym znacznikiem czasu, wskazywaną przez konturowy pomarańczowy okrąg. Jeśli nie zarejestrowano żadnych wartości, wartość funkcji ma wartość null. Aby uzyskać więcej informacji, zobacz Jak działają tabele funkcji szeregów czasowych.
Uwaga
- W przypadku środowiska Databricks Runtime 13.3 LTS i nowszych tabel delty w wykazie aparatu Unity z kluczami podstawowymi i kluczami sygnatury czasowej można użyć jako tabeli funkcji szeregów czasowych.
- Aby uzyskać lepszą wydajność w wyszukiwaniach punkt-w czasie, usługa Databricks zaleca zastosowanie klastrowania liquid clustering (dla
databricks-feature-engineering
wersji 0.6.0 lub nowszej) lub Z-Ordering (dladatabricks-feature-engineering
0.6.0 i nowszych) w tabelach szeregów czasowych. - Funkcja wyszukiwania do punktu w czasie jest czasami nazywana "podróżą czasową". Funkcja punktu w czasie w usłudze Databricks Feature Store nie jest związana z podróżą czasową usługi Delta Lake.
Jak działają tabele funkcji szeregów czasowych
Załóżmy, że masz następujące tabele funkcji. Te dane pochodzą z przykładowego notesu.
Tabele zawierają dane czujnika pomiaru temperatury, wilgotności względnej, światła otoczenia i dwutlenku węgla w pomieszczeniu. Tabela prawdy naziemnej wskazuje, czy osoba była obecna w pokoju. Każda z tabel ma klucz podstawowy ('pokój') i klucz znacznika czasu ('ts'). Dla uproszczenia wyświetlane są tylko dane dla pojedynczej wartości klucza podstawowego ('0').
Na poniższej ilustracji przedstawiono sposób użycia klucza znacznika czasu w celu zapewnienia poprawności punktu w czasie w zestawie danych szkoleniowych. Wartości funkcji są dopasowywane na podstawie klucza podstawowego (nie pokazanego na diagramie) i klucza znacznika czasu przy użyciu sprzężenia AS OF. As OF join zapewnia, że najnowsza wartość funkcji w momencie znacznika czasu jest używana w zestawie treningowym.
Jak pokazano na rysunku, zestaw danych trenowania zawiera najnowsze wartości funkcji dla każdego czujnika przed sygnaturą czasową obserwowanej prawdy.
Jeśli zestaw danych trenowania został utworzony bez uwzględniania klucza znacznika czasu, może istnieć wiersz z tymi wartościami funkcji i obserwowaną prawem podstawowym:
tymczasowe | Rh | światło | co2 | prawda naziemna |
---|---|---|---|---|
15.8 | 32 | 212 | 630 | 0 |
Jednak nie jest to prawidłowa obserwacja szkolenia, ponieważ odczyt co2 630 został podjęty o 8:52, po obserwacji podstawowej prawdy o 8:50. Przyszłe dane "wyciekają" do zestawu treningowego, co obniży wydajność modelu.
Wymagania
- W przypadku inżynierii funkcji w katalogu aparatu Unity: inżynieria funkcji w kliencie wykazu aparatu Unity (dowolna wersja).
- W przypadku Magazynu Funkcji Workspace (starsza wersja): klient Magazynu Funkcji w wersji 0.3.7 lub nowszej.
Jak określić klucze związane z czasem
Aby użyć funkcji punktu w czasie, należy określić klucze związane z czasem przy użyciu argumentu timeseries_columns
(w przypadku inżynierii funkcji w katalogu aparatu Unity) lub argumentu timestamp_keys
(dla magazynu funkcji obszaru roboczego). Oznacza to, że wiersze tabeli funkcji powinny być łączone przez dopasowanie najnowszej wartości dla określonego klucza podstawowego, który nie jest późniejszy niż wartość timestamps_keys
kolumny, zamiast łączyć na podstawie dokładnego dopasowania czasu.
Jeśli nie używasz timeseries_columns
wartości lub timestamp_keys
i wyznaczasz tylko kolumnę czasowników jako kolumnę klucza podstawowego, magazyn funkcji nie stosuje logiki punkt-w czasie do kolumny czasowników podczas sprzężeń. Zamiast tego dopasowuje tylko wiersze z dokładnym dopasowaniem czasu zamiast dopasowywania wszystkich wierszy przed znacznikiem czasu.
Tworzenie tabeli funkcji szeregów czasowych w wykazie aparatu Unity
W wykazie aparatu Unity każda tabela z kluczem podstawowym TIMESERIES jest tabelą funkcji szeregów czasowych. Zobacz Tworzenie tabeli funkcji w wykazie aparatu Unity, aby dowiedzieć się, jak je utworzyć.
Tworzenie tabeli funkcji szeregów czasowych w lokalnym obszarze roboczym
Aby utworzyć tabelę funkcji szeregów czasowych w lokalnym magazynie funkcji obszaru roboczego, ramka danych lub schemat muszą zawierać kolumnę wyznaczoną jako klucz znacznika czasu.
Począwszy od klienta magazynu funkcji w wersji 0.13.4, kolumny klucza sygnatury czasowej muszą być określone w argumencie primary_keys
. Klucze sygnatury czasowej są częścią "kluczy podstawowych", które jednoznacznie identyfikują każdy wiersz w tabeli funkcji. Podobnie jak inne kolumny klucza podstawowego, kolumny klucza sygnatury czasowej nie mogą zawierać NULL
wartości.
Inżynieria cech w katalogu aparatu 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 magazynu funkcji obszaru roboczego w wersji 0.13.4 lub nowszej
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 magazynu funkcji obszaru roboczego w wersji 0.13.3 lub starszej
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,
)
Tabela funkcji szeregów czasowych musi mieć jeden klucz sygnatury czasowej i nie może zawierać żadnych kolumn partycji. Kolumna klucza sygnatury czasowej musi mieć wartość TimestampType
lub DateType
.
Usługa Databricks zaleca, aby tabele funkcji szeregów czasowych nie miały więcej niż dwóch kolumn klucza podstawowego, aby zapewnić wydajne operacje zapisu i wyszukiwania.
Aktualizowanie tabeli funkcji szeregów czasowych
Podczas pisania funkcji w tabelach funkcji szeregów czasowych ramka danych musi podać wartości dla wszystkich funkcji tabeli funkcji, w przeciwieństwie do zwykłych tabel funkcji. To ograniczenie zmniejsza rozrzedzenie wartości funkcji w znacznikach czasu w tabeli funkcji szeregów czasowych.
Inżynieria cech w katalogu aparatu 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 magazynu funkcji obszaru roboczego w wersji 0.13.4 lub nowszej
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"
)
Obsługiwane są zapisy strumieniowe w tabelach funkcji szeregów czasowych.
Tworzenie zestawu szkoleniowego z tabelą funkcji szeregów czasowych
Aby wykonać wyszukiwanie w punkcie w czasie dla wartości funkcji z tabeli funkcji szeregów czasowych, należy określić timestamp_lookup_key
element w funkcji FeatureLookup
, która wskazuje nazwę kolumny DataFrame, która zawiera znaczniki czasu, względem których mają być wyszukiwane funkcje szeregów czasowych. Magazyn funkcji usługi Databricks pobiera najnowsze wartości funkcji przed znacznikami czasu określonymi w kolumnie ramki timestamp_lookup_key
danych i których klucze podstawowe (z wyjątkiem kluczy sygnatury czasowej) są zgodne z wartościami w kolumnach ramki lookup_key
danych lub null
jeśli taka wartość funkcji nie istnieje.
Inżynieria cech w katalogu aparatu 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()
Napiwek
Aby uzyskać szybszą wydajność wyszukiwania po włączeniu aplikacji Photon, przekaż use_spark_native_join=True
polecenie do .FeatureEngineeringClient.create_training_set
databricks-feature-engineering
Wymaga to wersji 0.6.0 lub nowszej.
Magazyn funkcji obszaru roboczego
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żda FeatureLookup
tabela funkcji szeregów czasowych musi być odnośnikiem do punktu w czasie, więc musi określić kolumnę timestamp_lookup_key
do użycia w ramce danych. Wyszukiwanie do punktu w czasie nie pomija wierszy z wartościami null
funkcji przechowywanymi w tabeli funkcji szeregów czasowych.
Ustawianie limitu czasu dla historycznych wartości funkcji
W przypadku klienta magazynu funkcji w wersji 0.13.0 lub nowszej lub dowolnej wersji klienta usługi Feature Engineering w katalogu aparatu Unity można wykluczyć wartości funkcji ze starszymi znacznikami czasu z zestawu treningowego. W tym celu użyj parametru lookback_window
w pliku FeatureLookup
.
Typ lookback_window
danych musi mieć datetime.timedelta
wartość , a wartość domyślna to None
(wszystkie wartości funkcji są używane, niezależnie od wieku).
Na przykład poniższy kod wyklucza wszystkie wartości funkcji, które mają więcej niż 7 dni:
Inżynieria cech w katalogu aparatu 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)
)
]
Magazyn funkcji obszaru roboczego
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)
)
]
Wywołanie create_training_set
za pomocą powyższego FeatureLookup
elementu powoduje automatyczne wykonanie sprzężenia do punktu w czasie i wykluczenie wartości funkcji starszych niż 7 dni.
Okno wyszukiwania jest stosowane podczas trenowania i wnioskowania wsadowego. Podczas wnioskowania online najnowsza wartość funkcji jest zawsze używana, niezależnie od okna wyszukiwania.
Ocenianie modeli za pomocą tabel funkcji szeregów czasowych
W przypadku oceniania modelu trenowanego za pomocą funkcji z tabel funkcji szeregów czasowych magazyn funkcji usługi Databricks pobiera odpowiednie funkcje przy użyciu odnośników do punktu w czasie z metadanymi spakowanym z modelem podczas trenowania. Ramka danych podana FeatureEngineeringClient.score_batch
(w przypadku inżynierii funkcji w katalogu aparatu Unity) lub FeatureStoreClient.score_batch
(dla magazynu funkcji obszaru roboczego) musi zawierać kolumnę znacznika czasu o takiej samej nazwie, DataType
jak timestamp_lookup_key
FeatureLookup
podana FeatureEngineeringClient.create_training_set
wartość lub FeatureStoreClient.create_training_set
.
Napiwek
Aby uzyskać szybszą wydajność wyszukiwania po włączeniu aplikacji Photon, przekaż use_spark_native_join=True
polecenie do .FeatureEngineeringClient.score_batch
databricks-feature-engineering
Wymaga to wersji 0.6.0 lub nowszej.
Publikowanie funkcji szeregów czasowych w sklepie online
Do publikowania tabel funkcji szeregów czasowych w sklepach online można użyć FeatureEngineeringClient.publish_table
(w przypadku inżynierii funkcji w katalogu aparatu Unity) lub FeatureStoreClient.publish_table
(w magazynie funkcji obszaru roboczego). Magazyn funkcji usługi Databricks publikuje migawkę najnowszych wartości funkcji dla każdego klucza podstawowego w tabeli funkcji w sklepie online. Sklep online obsługuje wyszukiwanie klucza podstawowego, ale nie obsługuje wyszukiwania do punktu w czasie.
Przykład notesu: tabela funkcji szeregów czasowych
Te przykładowe notesy ilustrują wyszukiwanie do punktu w czasie w tabelach funkcji szeregów czasowych.
Użyj tego notesu w obszarach roboczych z włączoną obsługą wykazu aparatu Unity.
Przykładowy notes tabeli funkcji szeregów czasowych (wykaz aparatu Unity)
Poniższy notes jest przeznaczony dla obszarów roboczych, które nie są włączone dla wykazu aparatu Unity. Używa magazynu funkcji obszaru roboczego.