Share via


Tijdreeksfunctietabellen gebruiken met ondersteuning voor een bepaald tijdstip

De gegevens die worden gebruikt om een model te trainen, hebben vaak tijdafhankelijkheden ingebouwd. Als u bijvoorbeeld een model traint om te voorspellen welke machines op een fabrieksvloer onderhoud nodig hebben, hebt u mogelijk historische gegevenssets die sensormetingen en gebruiksgegevens voor veel machines bevatten, samen met doellabels die aangeven of de machine de service nodig heeft of niet. De gegevensset bevat mogelijk gegevens voor computers vóór en na het uitvoeren van een onderhoudsservice.

Wanneer u het model bouwt, moet u alleen functiewaarden overwegen tot de tijd van de waargenomen doelwaarde (service vereist of geen service nodig heeft). Als u niet expliciet rekening houdt met de tijdstempel van elke waarneming, kunt u per ongeluk functiewaarden gebruiken die zijn gemeten na de tijdstempel van de doelwaarde voor training. Dit wordt 'gegevenslekken' genoemd en kan de prestaties van het model negatief beïnvloeden.

Tijdreeksfunctietabellen bevatten een tijdstempelsleutelkolom die ervoor zorgt dat elke rij in de trainingsgegevensset de meest recente bekende functiewaarden vertegenwoordigt vanaf de tijdstempel van de rij. U moet functietabellen van tijdreeksen gebruiken wanneer functiewaarden in de loop van de tijd veranderen, bijvoorbeeld met tijdreeksgegevens, gebeurtenisgegevens of tijdgeaggregateerde gegevens.

Notitie

  • Met Databricks Runtime 13.3 LTS en hoger kan elke Delta-tabel in Unity Catalog met primaire sleutels en tijdstempelsleutels worden gebruikt als een tijdreeksfunctietabel. We raden u aan Z-Ordering toe te passen op tijdreekstabellen voor betere prestaties in opzoekacties naar een bepaald tijdstip.
  • De functionaliteit voor het opzoeken van een bepaald tijdstip wordt soms aangeduid als 'tijdreizen'. De point-in-time-functionaliteit in Databricks Feature Store is niet gerelateerd aan Delta Lake time travel.
  • Als u point-in-time-functionaliteit wilt gebruiken, moet u tijdgerelateerde sleutels opgeven met behulp van het timeseries_columns argument (voor Functie-engineering in Unity Catalog) of het timestamp_keys argument (voor werkruimtefunctiearchief). Dit geeft aan dat de rijen van de functietabel moeten worden samengevoegd door de meest recente waarde te vinden voor een bepaalde primaire sleutel die niet later is dan de waarde van de timestamps_keys kolom, in plaats van lid te worden op basis van een exacte tijdovereenkomst. Als u alleen een tijdreekskolom als primaire-sleutelkolom aanwijst, past het functiearchief geen point-in-time-logica toe op de tijdreekskolom tijdens joins. In plaats daarvan komt deze overeen met alleen rijen met een exacte tijdovereenkomst in plaats van alle rijen vóór de tijdstempel te vergelijken.

Hoe tijdreeksfunctietabellen werken

Stel dat u de volgende functietabellen hebt. Deze gegevens zijn afkomstig uit het voorbeeldnotitieblok.

De tabellen bevatten sensorgegevens die de temperatuur, relatieve vochtigheid, omgevingslicht en koolstofdioxide in een ruimte meten. De grondwaartabel geeft aan of een persoon aanwezig was in de kamer. Elk van de tabellen heeft een primaire sleutel ('room') en een tijdstempelsleutel ('t'). Ter vereenvoudiging worden alleen gegevens voor één waarde van de primaire sleutel ('0') weergegeven.

voorbeeld van functietabelgegevens

In de volgende afbeelding ziet u hoe de tijdstempelsleutel wordt gebruikt om de juistheid van een bepaald tijdstip in een trainingsgegevensset te waarborgen. Functiewaarden worden vergeleken op basis van de primaire sleutel (niet weergegeven in het diagram) en de tijdstempelsleutel, met behulp van een AS OF Join. De AS OF join zorgt ervoor dat de meest recente waarde van de functie op het moment van de tijdstempel wordt gebruikt in de trainingsset.

hoe het tijdstip werkt

Zoals in de afbeelding wordt weergegeven, bevat de trainingsgegevensset de meest recente functiewaarden voor elke sensor vóór de tijdstempel op de waargenomen grondwaar.

Als u een trainingsgegevensset hebt gemaakt zonder rekening te houden met de tijdstempelsleutel, hebt u mogelijk een rij met deze functiewaarden en waargenomen grondwaar:

temp rh Licht Co2 grond waarheid
15.8 32 212 630 0

Dit is echter geen geldige observatie voor training, omdat de co2-lezing van 630 om 8:52 werd genomen, na de observatie van de grondwaarneming om 8:50. De toekomstige gegevens 'lekken' in de trainingsset, waardoor de prestaties van het model worden verminderd.

Vereisten

  • Voor functie-engineering in Unity Catalog: Functie-engineering in Unity Catalog-client (elke versie)
  • Voor werkruimtefunctiearchief: Feature Store-client v0.3.7 en hoger

Een tijdreeksfunctietabel maken in Unity Catalog

In Unity Catalog is elke tabel met een primaire timeSERIES-sleutel een tijdreeksfunctietabel. Zie Een functietabel maken in Unity Catalog voor informatie over het maken van een tabel.

Een functietabel voor tijdreeksen maken in de lokale werkruimte

Als u een tijdreeksfunctietabel wilt maken in het lokale werkruimtefunctiearchief, moet het DataFrame of schema een kolom bevatten die u als tijdstempelsleutel aanwijst.

Vanaf Feature Store-client v0.13.4 moeten tijdstempelsleutelkolommen worden opgegeven in het primary_keys argument. Tijdstempelsleutels maken deel uit van de 'primaire sleutels' die elke rij in de functietabel uniek identificeren. Net als andere primaire-sleutelkolommen kunnen tijdstempelsleutelkolommen geen waarden bevatten NULL .

Functie-engineering in unity-catalogus

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,
)

Werkruimtefunctiearchiefclient v0.13.4 en hoger

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,
)

Werkruimtefunctie store-client v0.13.3 en lager

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,
)

Een tijdreeksfunctietabel moet één tijdstempelsleutel hebben en mag geen partitiekolommen bevatten. De tijdstempelsleutelkolom moet van TimestampType of DateType.

Databricks raadt aan dat tijdreeksfunctietabellen niet meer dan twee primaire-sleutelkolommen bevatten om ervoor te zorgen dat schrijf- en opzoekbewerkingen goed presteren.

Een tijdreeksfunctietabel bijwerken

Wanneer u functies schrijft naar de tijdreeksfunctietabellen, moet uw DataFrame waarden opgeven voor alle functies van de functietabel, in tegenstelling tot normale functietabellen. Deze beperking vermindert de spaarzaamheid van functiewaarden in tijdstempels in de functietabel van de tijdreeks.

Functie-engineering in unity-catalogus

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"
)

Werkruimtefunctiearchiefclient v0.13.4 en hoger

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"
)

Streaming-schrijfbewerkingen naar tijdreeksfunctietabellen worden ondersteund.

Een trainingsset maken met een tijdreeksfunctietabel

Als u een zoekactie naar een bepaald tijdstip wilt uitvoeren voor functiewaarden uit een tijdreeksfunctietabel, moet u een timestamp_lookup_key in de functie FeatureLookupopgeven, waarmee de naam wordt aangegeven van de DataFrame-kolom die tijdstempels bevat voor het opzoeken van tijdreeksfuncties. Databricks Feature Store haalt de meest recente functiewaarden op vóór de tijdstempels die zijn opgegeven in de kolom van timestamp_lookup_key het DataFrame en waarvan de primaire sleutels (met uitzondering van tijdstempelsleutels) overeenkomen met de waarden in de kolommen van lookup_key het DataFrame of null als er geen dergelijke functiewaarde bestaat.

Functie-engineering in unity-catalogus

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

Werkruimtefunctiearchief

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

Elke FeatureLookup functietabel in een tijdreeks moet een opzoekactie naar een bepaald tijdstip zijn, dus moet er een timestamp_lookup_key kolom worden opgegeven die moet worden gebruikt in uw DataFrame. Zoeken naar een bepaald tijdstip slaat geen rijen over met null functiewaarden die zijn opgeslagen in de functietabel van de tijdreeks.

Een tijdslimiet instellen voor historische functiewaarden

Met Feature Store-client v0.13.0 of hoger of een versie van Feature Engineering in de Unity Catalog-client kunt u functiewaarden uitsluiten met oudere tijdstempels uit de trainingsset. Gebruik hiervoor de parameter lookback_window in de FeatureLookup.

Het gegevenstype lookback_window moet zijn datetime.timedeltaen de standaardwaarde is None (alle functiewaarden worden gebruikt, ongeacht leeftijd).

Met de volgende code worden bijvoorbeeld alle functiewaarden uitgesloten die langer zijn dan 7 dagen oud:

Functie-engineering in unity-catalogus

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)
  )
]

Werkruimtefunctiearchief

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)
  )
]

Wanneer u belt create_training_set met het bovenstaande FeatureLookup, wordt automatisch de punt-in-time join uitgevoerd en worden functiewaarden die ouder zijn dan 7 dagen uitgesloten.

Het lookback-venster wordt toegepast tijdens het trainen en batchdeductie. Tijdens onlinedeductie wordt altijd de meest recente functiewaarde gebruikt, ongeacht het lookback-venster.

Modellen beoordelen met tijdreeksfunctietabellen

Wanneer u een model scoren dat is getraind met functies uit tijdreeksfunctietabellen, haalt Databricks Feature Store de juiste functies op met behulp van zoekacties naar een bepaald tijdstip met metagegevens die tijdens de training zijn verpakt met het model. Het DataFrame dat u opgeeft FeatureEngineeringClient.score_batch (voor functie-engineering in Unity Catalog) of FeatureStoreClient.score_batch (voor werkruimtefunctiearchief) moet een tijdstempelkolom bevatten met dezelfde naam en DataType als de timestamp_lookup_keyFeatureLookup opgegeven aan FeatureEngineeringClient.create_training_set of FeatureStoreClient.create_training_set.

Tijdreeksfuncties publiceren naar een online winkel

U kunt (voor Functie-engineering in Unity Catalog) of FeatureStoreClient.publish_table (voor werkruimtefunctiearchief) gebruiken FeatureEngineeringClient.publish_table om functietabellen van tijdreeksen te publiceren naar online winkels. Databricks Feature Store biedt de functionaliteit voor het publiceren van een momentopname of een periode van tijdreeksgegevens naar de online winkel, afhankelijk van de OnlineStoreSpec functie die de online winkel heeft gemaakt. De tabel bevat details voor elke publicatiemodus.

Online winkelprovider Publicatiemodus voor momentopnamen Publicatiemodus voor vensters
Azure Cosmos DB (v0.5.0 en hoger) X
Azure MySQL (enkele server) X
Azure SQL Server X

Een momentopname van een tijdreeks publiceren

Hiermee worden de meest recente functiewaarden voor elke primaire sleutel in de functietabel gepubliceerd. De online winkel biedt ondersteuning voor het opzoeken van primaire sleutels, maar biedt geen ondersteuning voor zoeken naar een bepaald tijdstip.

Voor online winkels die time to live niet ondersteunen, ondersteunt Databricks Feature Store alleen de publicatiemodus voor momentopnamen. Voor online winkels die wel ondersteuning bieden voor time to live, is de standaardpublicatiemodus momentopname, tenzij time to live (ttl) is opgegeven in het OnlineStoreSpec moment van maken.

Een tijdreeksvenster publiceren

Hiermee worden alle functiewaarden voor elke primaire sleutel in de functietabel naar de online winkel gepubliceerd en worden verlopen records automatisch verwijderd. Een record wordt beschouwd als verlopen als de tijdstempel van de record (in UTC) meer is dan de opgegeven tijdsduur voor live in het verleden. Raadpleeg de cloudspecifieke documentatie voor meer informatie over time-to-live.

De online winkel biedt ondersteuning voor het opzoeken van primaire sleutels en haalt automatisch de functiewaarde op met de laatste tijdstempel.

Als u deze publicatiemodus wilt gebruiken, moet u een waarde opgeven voor time to live (ttl) in het OnlineStoreSpec moment dat u de online winkel maakt. De ttl waarde kan niet eenmaal worden gewijzigd. Alle volgende publicatie-aanroepen nemen de ttl over en zijn niet vereist om deze expliciet te definiëren in de OnlineStoreSpec.

Voorbeeld van notebook: tijdreeksfunctietabel

In het volgende notebook ziet u opzoekacties naar een bepaald tijdstip in de functietabellen van tijdreeksen in de werkruimtefunctieopslag.

Voorbeeldnotitieblok van tijdreeksfunctietabel

Notebook downloaden