Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Important
Tato funkce je ve verzi Public Preview. Správci pracovního prostoru můžou řídit přístup k této funkci ze stránky Previews . Viz Manage Azure Databricks preview.
Zobrazení funkcí umožňují definovat a vypočítat funkce ze zdrojů dat. Funkce je možné definovat pomocí různých zdrojů (tabulka Delta, Kafka Stream a data o čase požadavků) a výpočty (agregace s časovým intervalem, jednoduché výběry sloupců a další). Tato příručka se zabývá následujícími pracovními postupy:
- Pracovní postup vývoje funkcí
- Slouží
create_featurek definování objektů funkcí katalogu Unity, které lze použít při trénování modelu a obsluhování pracovních postupů. - Alternativně vytvořte
Featureobjekty místně a použijteregister_featureje k jejich uložení do katalogu Unity později. Před registrací lze použít místně vytvořené vlastnosti screate_training_set.
- Slouží
- Pracovní postup trénování modelu
- Pro výpočet agregovaných atributů k určitému bodu v čase pro strojové učení použijte
create_training_set. Podrobnou dokumentaci k trénování pomocí zobrazení funkcí najdete v tématu Trénování modelů pomocí zobrazení funkcí.
- Pro výpočet agregovaných atributů k určitému bodu v čase pro strojové učení použijte
-
Materializace vlastností a jejich poskytování procesu
- Po definování funkce pomocí
create_featurenebo jejího načtení pomocíget_featuremůžete použítmaterialize_featuresk materializaci funkce nebo sady funkcí do offline úložiště pro efektivní opakované použití, nebo do online úložiště pro online obsluhu. - Pomocí
create_training_setmaterializovaného zobrazení můžete připravit offline dávkovou trénovací datovou sadu.
- Po definování funkce pomocí
Podrobnosti o rozhraní API najdete v referenčních informacích k rozhraní API zobrazení funkcí.
Požadavky
Výpočetní prostředí bez serveru nebo klasický výpočetní cluster s modulem Databricks Runtime 17.0 ML nebo novějším.
Musíte nainstalovat vlastní balíček Pythonu. Při každém spuštění poznámkového bloku spusťte tyto řádky kódu:
%pip install databricks-feature-engineering>=0.16.0 dbutils.library.restartPython()
Příklad rychlého startu
Spustitelný rychlý startovací poznámkový blok najdete v tomto ukázkovém poznámkovém bloku.
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
CronSchedule, DeltaTableSource, Feature, AggregationFunction,
Sum, Avg, ColumnSelection, TableTrigger,
TumblingWindow, SlidingWindow,
OfflineStoreConfig, OnlineStoreConfig,
)
from datetime import timedelta
CATALOG_NAME = "main"
SCHEMA_NAME = "feature_store"
TABLE_NAME = "transactions"
# 1. Create data source
source = DeltaTableSource(
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
table_name=TABLE_NAME,
)
# 2. Define features locally (no catalog/schema needed yet)
avg_feature = Feature(
source=source,
entity=["user_id"],
timeseries_column="transaction_time",
function=AggregationFunction(Avg(input="amount"), TumblingWindow(window_duration=timedelta(days=30))),
name="avg_transaction_30d",
)
sum_feature = Feature(
source=source,
entity=["user_id"],
timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), SlidingWindow(window_duration=timedelta(days=7), slide_duration=timedelta(days=1))),
# name auto-generated: "amount_sum_sliding_7d_1d"
)
fe = FeatureEngineeringClient()
# 3. Explore features with compute_features
feature_df = fe.compute_features(features=[avg_feature, sum_feature])
feature_df.display()
# 4. Create training set using local features
# `labeled_df` should have columns "user_id", "transaction_time", and "target".
training_set = fe.create_training_set(
df=labeled_df,
features=[avg_feature, sum_feature],
label="target",
)
training_set.load_df().display()
# 5. Register features in Unity Catalog
avg_feature = fe.register_feature(
feature=avg_feature,
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
)
sum_feature = fe.register_feature(
feature=sum_feature,
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
)
# 6. Or use create_feature for a one-step define-and-register workflow
latest_amount = fe.create_feature(
source=source,
function=ColumnSelection("amount"),
entity=["user_id"],
timeseries_column="transaction_time",
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
name="latest_amount",
)
# 7. Train model
with mlflow.start_run():
training_df = training_set.load_df()
# training code
fe.log_model(
model=model,
artifact_path="recommendation_model",
flavor=mlflow.sklearn,
training_set=training_set,
registered_model_name=f"{CATALOG_NAME}.{SCHEMA_NAME}.recommendation_model",
)
# 8. (Optional) Materialize features for serving
# Features must be registered in UC before calling materialize_features
online_config = OnlineStoreConfig(
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
table_name_prefix="customer_features_serving",
online_store_name="customer_features_store",
)
# Aggregation features use CronSchedule and support both offline and online configs
fe.materialize_features(
features=[avg_feature, sum_feature],
offline_config=OfflineStoreConfig(
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
table_name_prefix="customer_features",
),
online_config=online_config,
trigger=CronSchedule(
quartz_cron_expression="0 0 * * * ?", # Hourly
timezone_id="UTC",
),
)
# ColumnSelection features use TableTrigger and only support online config
fe.materialize_features(
features=[latest_amount],
online_config=online_config,
trigger=TableTrigger(),
)
ukázkový poznámkový blok
Notebook pro rychlý úvod do zobrazení funkcí
Funkce streamování
Kromě dávkových funkcí z tabulek Delta můžete definovat funkce ze zdrojů streamování pro případy použití v reálném čase. Funkce pro streamování používají stejnou třídu Feature jako dávkové funkce — stejné konstruktory Feature, stejné agregační funkce, stejné pracovní postupy pro trénování a nasazení — takže přechod z dávkového zpracování na zpracování v reálném čase vyžaduje jen minimální změny kódu. Po materializaci doručují funkce streamování dílčí sekundu koncové aktuálnosti (latence p99 o velikosti 200 ms) přímo do vašeho modelu obsluhující koncové body.
Pokud chcete používat funkce streamování, nejprve nastavte Stream a pak na něj odkazujte StreamSourcepomocí . Zdroje streamů podporují Apache Kafka jako vstup a automaticky udržují ingestní tabulku (Delta) jako historickou kopii dat používanou pro trénink.
Definování funkce streamování
StreamSource odkazuje na datový proud pomocí jeho třídílného názvu (catalog.schema.stream_name). Stream není zabezpečitelný objekt katalogu Unity, ale je vymezen schématem katalogu Unity a přístup se řídí tabulkou příjmu dat streamu. Odkazy na sloupce v entitě, časových řádcích a definicích funkcí musí mít předponu value. nebo key. určit, která část zprávy Kafka se má přečíst. Vnořená pole se podporují pomocí zápisu tečky (například value.user.address.city).
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
StreamSource,
Feature,
AggregationFunction,
Sum,
RollingWindow,
)
from datetime import timedelta
client = FeatureEngineeringClient()
stream_source = StreamSource(
full_name="my_catalog.my_schema.my_stream",
)
feature = Feature(
name="user_purchase_sum",
source=stream_source,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=AggregationFunction(
operator=Sum(input="value.amount"),
time_window=RollingWindow(window_duration=timedelta(hours=1)),
),
)
Filtrování podmínek ve Službě StreamSource
Slouží filter_condition k filtrování řádků z datového proudu před agregací, stejně jako u DeltaTableSource.
stream_source = StreamSource(
full_name="my_catalog.my_schema.my_stream",
filter_condition="value.event_type = 'purchase'",
)
Výběr sloupce ze streamů
ColumnSelection funkce fungují se zdroji streamování. Vybraný sloupec představuje nejnovější hodnotu ze služby Stream pro každou entitu při zachování přesnosti k určitému bodu v čase.
from databricks.feature_engineering.entities import ColumnSelection
passenger_count = Feature(
name="passenger_count",
source=stream_source,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=ColumnSelection(column="value.passenger_count"),
)
Přístup k vnořeným polím
K vnořeným polím JSON můžete přistupovat pomocí zápisu tečky (například value.nested_field.amount). Při obsluze používají datová část požadavku i odpověď názvy koncových uzlů (například amount místo value.amount). Názvy listových uzlů musí být jedinečné napříč všemi sloupci entit, časových řad a výstupními sloupci příznaků v rámci modelu nebo specifikace příznaků, protože obslužný koncový bod používá názvy listových uzlů ke směrování hodnot.
Časová okna pro funkce streamování
Funkce streamu podporují pro agregace pouze RollingWindow. Posuvná okna se průběžně přepočítávají na základě nejnovějších dat, což odpovídá charakteru streamovacích zdrojů v reálném čase.
TumblingWindow a SlidingWindow jsou navržené pro dávkové výpočty v pevných historických intervalech.
Ukázkový poznámkový blok s funkcemi streamování
Notebook s rychlým úvodem do Streaming Feature Views
Trénování a odvozování modelů
Chcete-li trénovat modely a spouštět dávkové odvozování pomocí zobrazení funkcí, včetně log_model()score_batch(), a create_training_set(), viz trénování modelů se zobrazeními funkcí.
Materializace vlastností
Jakmile definujete funkce, můžete je materializovat do offline nebo online obchodů pro efektivní opakované použití při trénování a obsluhování pracovních postupů. Po materializaci funkcí můžete modely nasadit pomocí CPU. Podrobnosti najdete v tématu Materializace zobrazení funkcí.
Osvědčené postupy
Pojmenování funkcí
- Používejte popisné názvy pro důležité obchodní funkce.
- Dodržujte konzistentní konvence vytváření názvů napříč týmy.
- Při zahájení vývoje funkcí používejte automaticky generované názvy .
Časová okna
- Zarovnejte hranice oken s obchodními cykly (denně, týdně).
- Kratší okna zachycují nedávné trendy, ale mohou být hlučné. Delší okna vytvářejí stabilnější distribuce funkcí, ale můžou chybět nedávné změny chování. Zvolte na základě toho, jak rychle se změní základní signál pro váš případ použití. Například 7denní okno vyhladí denní výkyvy a vytváří konzistentní vstupy modelu, zatímco 1hodinový interval reaguje rychle na změny chování, ale může způsobit odchylku, která snižuje výkon modelu. Pokud se přesnost modelu sníží při posunu distribuce, použijte k stabilizaci vstupů delší interval.
- Přeskakující a posuvná okna jsou škálovatelná než posuvná (souvislá) okna. Začněte s posuvnými okny pro většinu případů použití.
Performance
- Materializujte funkce ze stejného zdroje dat v jednom
materialize_featuresvolání, abyste minimalizovali prohledávání dat. - Pro funkce ze stejného zdroje dat použijte stejnou úroveň podrobnosti (například vždy 1hodinové nebo vždy 1denní trvání) k usnadnění lepšího seskupování během materializace.
Sloupce entit vs. podmínky filtru
Tento průvodce rozhodováním použijte při práci s funkcemi ze stejné zdrojové tabulky:
Použijte entity (zapnuto create_feature) v případě, že potřebujete různé úrovně agregace:
-
Funkce na úrovni zákazníka (jeden řádek na zákazníka):
entity=["customer_id"] -
Funkce pro obchodníky se zákazníky (více řádků na zákazníka):
entity=["customer_id", "merchant_id"] -
Různé úrovně agregace můžou sdílet stejné
DeltaTableSource: zadejte různéentityhodnoty pro každou definici funkce.
Použijte filter_condition (zapnuto DeltaTableSource) v případě, že potřebujete filtrovat řádky na stejné úrovni agregace:
-
Pouze transakce s vysokou hodnotou:
filter_condition="amount > 100"(stále agregované na zákazníka) -
Pouze dokončené objednávky:
filter_condition="status = 'completed'"(stále agregované podle zákazníka)
Empirické pravidlo: Pokud by změna způsobovala jiný počet řádků na hodnotu entity, použijte u definic funkcí různé entity hodnoty. Pokud jenom filtrujete řádky, které přispívají ke stejné agregaci, použijte ve zdroji filter_condition.
Obvyklé scénáře
Analýzy zákazníků
from databricks.feature_engineering.entities import AggregationFunction, Sum, Count, RollingWindow
fe = FeatureEngineeringClient()
features = [
# Recency: Number of transactions in the last day
fe.create_feature(catalog_name="main", schema_name="ecommerce", source=transactions,
entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Count(input="transaction_id"), RollingWindow(window_duration=timedelta(days=1)))),
# Frequency: transaction count over the last 90 days
fe.create_feature(catalog_name="main", schema_name="ecommerce", source=transactions,
entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Count(input="transaction_id"), RollingWindow(window_duration=timedelta(days=90)))),
# Monetary: total spend in the last month
fe.create_feature(catalog_name="main", schema_name="ecommerce", source=transactions,
entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=30)))),
]
Rozbor tendence
# Compare recent vs. historical behavior
fe = FeatureEngineeringClient()
recent_avg = fe.create_feature(
catalog_name="main", schema_name="ecommerce",
source=transactions, entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Avg(input="amount"), RollingWindow(window_duration=timedelta(days=7))),
)
historical_avg = fe.create_feature(
catalog_name="main", schema_name="ecommerce",
source=transactions, entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Avg(input="amount"), RollingWindow(window_duration=timedelta(days=7), delay=timedelta(days=7))),
)
Sezónní vzory
# Same day of week, 4 weeks ago
fe = FeatureEngineeringClient()
weekly_pattern = fe.create_feature(
catalog_name="main", schema_name="ecommerce",
source=transactions, entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Avg(input="amount"), RollingWindow(window_duration=timedelta(days=1), delay=timedelta(weeks=4))),
)
Omezení
- Názvy sloupců entit a časových intervalů se musí shodovat mezi trénovací (označenou) datovou sadou a definicemi funkcí při použití v
create_training_setrozhraní API. - Název sloupce použitý jako
labelsloupec v trénovací datové sadě by neměl existovat ve zdrojových tabulkách používaných k definováníFeature. - Rozhraní
create_featureAPI podporuje omezený seznam funkcí (UDAF). Viz Podporované funkce. - Sloupce entity nemohou být typu
DATEneboTIMESTAMP. -
RequestSourcepodporuje pouze skalární datové typy definované vScalarDataType(INTEGER,FLOAT,BOOLEAN,STRING,DOUBLE,LONG,TIMESTAMP, ,DATE).SHORTKomplexní typy, jako jsou pole, mapy a struktury, nejsou podporovány. -
RequestSourcenepodporuje agregační funkce ani časová okna. Lze použít pouzeColumnSelectionfunkce. - Sada názvů sloupců entit, názvů sloupců časových řad a názvů sloupců funkcí požadavku musí být globálně jedinečná pro všechny zdroje v trénovací sadě nebo koncový bod obsluhy.
-
score_batchnemusí být úspěšné na výpočetních prostředcích bez serveru. Tento problém můžete obejít pomocí klasického výpočetního clusteru s modulem Databricks Runtime 17.0 ML nebo novějším.
Informace o omezeních specifických pro materializaci najdete v tématu Omezení.