Ondersteuning voor een bepaald tijdstip met behulp van tijdreeksfunctietabellen
In dit artikel wordt beschreven hoe u de juistheid op een bepaald tijdstip gebruikt om een trainingsgegevensset te maken die de kenmerkwaarden nauwkeurig weergeeft op het moment dat een labelobservatie is vastgelegd. Dit is belangrijk om te voorkomen dat gegevenslek, dat optreedt wanneer je 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 werkenvoor meer informatie.
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 om Liquid Clustering- (voor
databricks-feature-engineering
0,6.0 en hoger) of Z-Ordering- (voordatabricks-feature-engineering
0,6.0 en lager) toe te passen op 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 tijdreekskenmerkentabellen 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 grondwaarheidstabel 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.
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.
Zoals in de afbeelding wordt weergegeven, bevat de trainingsdataset de meest recente kenmerkwaarden voor elke sensor vóór de tijdstempel van de waargenomen grondwaarheid.
Als u een trainingsdataset hebt gemaakt zonder rekening te houden met de tijdstempelreeks, hebt u mogelijk een rij met deze kenmerkenwaarden en waargenomen grondwaarheid.
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.
Tijdgerelateerde sleutels opgeven
Als u point-in-time-functionaliteit wilt gebruiken, moet u tijdgerelateerde sleutels opgeven met het argument timeseries_columns
(voor Feature Engineering in Unity Catalog) of het argument timestamp_keys
(voor Workspace Feature Store). Dit geeft aan dat rijen van de functietabel moeten worden samengevoegd door de meest recente waarde van een bepaalde primaire sleutel te koppelen die niet later is dan de waarde van de timestamps_keys
-kolom, in plaats van samen te voegen op basis van een exacte tijdsovereenkomst.
Als u geen timeseries_columns
of timestamp_keys
gebruikt en alleen een tijdreekskolom als primaire sleutelkolom aanwijst, past de feature store geen point-in-time-logica toe op de tijdreekskolom bij het uitvoeren van 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 TIMESERIES primaire sleutel een tijdreeksfunctietabel. Zie Een functietabel maken in Unity Catalog voor 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 argument primary_keys
. Tijdstempelsleutels maken deel uit van de 'primaire sleutels' die elke rij in de functietabel uniek identificeren. Net als andere primaire-sleutelkolommen kunnen tijdstempelsleutelkolommen geen NULL
waarden bevatten.
Feature 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 sleutelkolom voor tijdstempels moet van TimestampType
of DateType
zijn.
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 sparsiteit van functiewaarden over tijdstempels in de tijdreeks-functietabel.
Feature 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
opgeven in de FeatureLookup
van de functie, 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 timestamp_lookup_key
kolom van het DataFrame en waarvan de primaire sleutels (met uitzondering van tijdstempelsleutels) overeenkomen met de waarden in de lookup_key
kolommen van het DataFrame of null
als er geen dergelijke functiewaarde bestaat.
Kenmerk-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()
Een FeatureLookup
in een functietabel van 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. Tijdstipzoekopdracht slaat geen rijen over met null
kenmerkwaarden die zijn opgeslagen in de kenmerkentabel 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 van lookback_window
moet datetime.timedelta
zijn en 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:
Kenmerkengineering 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 create_training_set
aanroept met de bovenstaande FeatureLookup
, wordt automatisch de punt-in-time join uitgevoerd en worden functiewaarden die ouder zijn dan 7 dagen uitgesloten.
Het terugkijkvenster wordt toegepast tijdens het trainen en batch-inferentie. Tijdens onlinedeductie wordt altijd de meest recente functiewaarde gebruikt, ongeacht het lookback-venster.
Modellen beoordelen met tijdreeksfunctietabellen
Wanneer u een model beoordeelt dat is getraind met kenmerken uit tijdreekskenmerktabellen, haalt Databricks Feature Store de juiste kenmerken op met behulp van tijdspuntspecifieke zoekopdrachten met metadata die tijdens de training bij het model zijn meegeleverd. Het DataFrame dat u verstrekt aan FeatureEngineeringClient.score_batch
(voor Feature Engineering in Unity Catalog) of FeatureStoreClient.score_batch
(voor de Workspace Feature Store) moet een tijdstempelkolom bevatten met dezelfde naam en DataType
als de timestamp_lookup_key
van de FeatureLookup
die aan FeatureEngineeringClient.create_training_set
of FeatureStoreClient.create_training_set
is verstrekt.
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 FeatureEngineeringClient.publish_table
(voor Functie-engineering in Unity Catalog) of FeatureStoreClient.publish_table
(voor werkruimtefunctiearchief) gebruiken om tijdreeksfunctietabellen te publiceren naar online winkels. Databricks Feature Store publiceert een momentopname van de meest recente kenmerkwaarden voor elke primaire sleutel in de kenmerktabel in de online store. De online winkel biedt ondersteuning voor het opzoeken van primaire sleutels, maar biedt geen ondersteuning voor zoeken naar een bepaald tijdstip.
Notebook-voorbeeld: 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)
Het volgende notebook is ontworpen voor werkruimten die niet zijn ingeschakeld voor Unity Catalog. Hierbij wordt gebruikgemaakt van de werkruimtefunctieopslag.