Udostępnij za pośrednictwem


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.

Wartości funkcji docierające w różnym czasie.

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 (dla databricks-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').

przykładowe dane tabeli funkcji

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 działa punkt w czasie

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.

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_keysi 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.timedeltawartość , 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 FeatureLookupelementu 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_keyFeatureLookup 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)

Pobierz notes

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.

Przykładowy notes tabeli funkcji szeregów czasowych (obszary robocze nie są włączone dla wykazu aparatu Unity)

Pobierz notes