Delen via


Ondersteuning voor een bepaald tijdstip met behulp van tijdreeksfunctietabellen

In dit artikel wordt beschreven hoe u de juistheid van een bepaald tijdstip gebruikt om een trainingsgegevensset te maken die de functiewaarden nauwkeurig weergeeft vanaf het moment dat een labelobservatie is vastgelegd. Dit is belangrijk om gegevenslekken te voorkomen, wat optreedt wanneer u functiewaarden gebruikt voor modeltraining die niet beschikbaar waren op het moment dat het label werd vastgelegd. Dit type fout kan moeilijk worden gedetecteerd 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.

In het volgende diagram ziet u hoe de tijdstempelsleutel wordt gebruikt. De functiewaarde die voor elke tijdstempel is vastgelegd, is de meest recente waarde vóór die tijdstempel, aangegeven door de oranje cirkel die is gemarkeerd. Als er geen waarden zijn vastgelegd, is de functiewaarde null. Zie Hoe tijdreeksfunctietabellen werken voor meer informatie.

Functiewaarden die op verschillende tijdstippen binnenkomen.

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.
  • Databricks raadt u aan liquide clusteringdatabricks-feature-engineeringop tijdreekstabellen voor betere prestaties.
  • 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.

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 Werkruimte Feature Store (verouderd): Feature Store-client v0.3.7 en hoger.

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 geen timeseries_columns of timestamp_keys, en 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.

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 Catalog

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

Werkruimte Feature Store-client 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,
)

Werkruimte Feature 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 Catalog

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

Werkruimte Feature Store-client 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 Catalog

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

Voor snellere opzoekprestaties wanneer Photon is ingeschakeld, geeft u door use_spark_native_join=True aan FeatureEngineeringClient.create_training_set. Hiervoor is versie 0.6.0 of hoger vereist databricks-feature-engineering .

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 Catalog

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.

Tip

Voor snellere opzoekprestaties wanneer Photon is ingeschakeld, geeft u door use_spark_native_join=True aan FeatureEngineeringClient.score_batch. Hiervoor is versie 0.6.0 of hoger vereist databricks-feature-engineering .

Tijdreeksfuncties publiceren naar een online winkel

U kunt (voor Functie-engineering in Unity Catalog) of FeatureEngineeringClient.publish_table (voor werkruimtefunctiearchief) gebruiken FeatureStoreClient.publish_table om functietabellen van tijdreeksen te publiceren naar online winkels. Databricks Feature Store publiceert een momentopname van de meest recente functiewaarden voor elke primaire sleutel in de functietabel naar de online winkel. De online winkel biedt ondersteuning voor het opzoeken van primaire sleutels, maar biedt geen ondersteuning voor zoeken naar een bepaald tijdstip.

Voorbeeld van notebook: tijdreeksfunctietabel

Deze voorbeeldnotitieblokken illustreren opzoekacties naar een bepaald tijdstip in functietabellen van tijdreeksen.

Gebruik dit notebook in werkruimten die zijn ingeschakeld voor Unity Catalog.

Voorbeeldnotitieblok voor tijdreeksfunctiestabel (Unity Catalog)

Notebook downloaden

Het volgende notebook is ontworpen voor werkruimten die niet zijn ingeschakeld voor Unity Catalog. Hierbij wordt gebruikgemaakt van de werkruimtefunctieopslag.

Voorbeeldnotitieblok van tijdreeksfunctietabel (werkruimten die niet zijn ingeschakeld voor Unity Catalog)

Notebook downloaden