Korzystanie z tabel funkcji szeregów czasowych z obsługą punkt-w czasie

Dane używane do trenowania modelu często mają wbudowane zależności czasowe. Jeśli na przykład trenujesz model w celu przewidywania, które maszyny na hali produkcyjnej wymagają konserwacji, mogą istnieć historyczne zestawy danych zawierające pomiary czujników i dane użycia dla wielu maszyn wraz z etykietami docelowymi wskazującymi, czy maszyna potrzebuje usługi, czy nie. Zestaw danych może zawierać dane maszyn zarówno przed, jak i po wykonaniu usługi konserwacji.

Podczas kompilowania modelu należy wziąć pod uwagę tylko wartości funkcji aż do czasu obserwowanej wartości docelowej (usługa wymaga usługi lub nie potrzebuje usługi). Jeśli nie uwzględnisz jawnie znacznika czasu każdej obserwacji, możesz przypadkowo użyć wartości cech mierzonych po znaczniku czasu wartości docelowej na potrzeby trenowania. Jest to nazywane "wyciekiem danych" 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.

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. Zalecamy stosowanie kolejności Z w tabelach szeregów czasowych w celu uzyskania lepszej wydajności w wyszukiwaniach punkt-w czasie.
  • 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.
  • 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 wyznaczysz tylko kolumnę czasowników jako kolumnę klucza podstawowego, magazyn funkcji nie stosuje logiki punkt-w czasie do kolumny timeseries podczas sprzężeń. Zamiast tego dopasowuje tylko wiersze z dokładnym dopasowaniem czasu zamiast dopasowywania wszystkich wierszy przed znacznikiem czasu.

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ła 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 cech w wykazie aparatu Unity: inżynieria funkcji w kliencie wykazu aparatu Unity (dowolna wersja)
  • W przypadku magazynu funkcji obszaru roboczego: klient magazynu funkcji w wersji 0.3.7 lub nowszej

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

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

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 udostępnia funkcję publikowania migawki lub okna danych szeregów czasowych w sklepie online, w zależności od OnlineStoreSpec tego, który utworzył magazyn online. W tabeli przedstawiono szczegóły dla każdego trybu publikowania.

Dostawca sklepu online Tryb publikowania migawek Tryb publikowania okna
Azure Cosmos DB (wersja 0.5.0 lub nowsza) X
Azure MySQL (pojedynczy serwer) X
Azure SQL Server X

Publikowanie migawki szeregów czasowych

Spowoduje to opublikowanie najnowszych wartości funkcji dla każdego klucza podstawowego w tabeli funkcji. Sklep online obsługuje wyszukiwanie klucza podstawowego, ale nie obsługuje wyszukiwania do punktu w czasie.

W przypadku sklepów online, które nie obsługują czasu wygaśnięcia, usługa Databricks Feature Store obsługuje tylko tryb publikowania migawek. W przypadku sklepów online, które obsługują czas wygaśnięcia, domyślny tryb publikowania to migawka, chyba że czas wygaśnięcia (ttl) jest określony w OnlineStoreSpec czasie tworzenia.

Publikowanie okna szeregów czasowych

Spowoduje to opublikowanie wszystkich wartości funkcji dla każdego klucza podstawowego w tabeli funkcji w magazynie online i automatyczne usunięcie wygasłych rekordów. Rekord jest uznawany za wygasły, jeśli sygnatura czasowa rekordu (w formacie UTC) przekracza określony czas wygaśnięcia w przeszłości. Aby uzyskać szczegółowe informacje na temat czasu wygaśnięcia, zapoznaj się z dokumentacją specyficzną dla chmury.

Sklep online obsługuje wyszukiwanie klucza podstawowego i automatycznie pobiera wartość funkcji z najnowszym znacznikiem czasu.

Aby użyć tego trybu publikowania, należy podać wartość czasu wygaśnięcia (ttl) w OnlineStoreSpec magazynie online podczas tworzenia sklepu internetowego. ttl Nie można zmienić po ustawieniu. Wszystkie kolejne wywołania publikowania dziedziczą element ttl i nie są wymagane do jawnego zdefiniowania go w obiekcie OnlineStoreSpec.

Przykład notesu: tabela funkcji szeregów czasowych

Poniższy notes ilustruje wyszukiwanie do punktu w czasie w tabelach funkcji szeregów czasowych w magazynie funkcji obszaru roboczego.

Przykładowy notes tabeli funkcji szeregów czasowych

Pobierz notes