Berechnen von On-Demand-Features mithilfe von benutzerdefinierten Python-Funktionen
In diesem Artikel wird beschrieben, wie Sie On-Demand-Features in Azure Databricks erstellen und verwenden.
Machine Learning-Modelle für Echtzeitanwendungen erfordern häufig die neuesten Featurewerte. In dem im Diagramm gezeigten Beispiel ist ein Feature für ein Restaurantempfehlungsmodell die aktuelle Entfernung der Benutzer*innen von einem Restaurant. Dieses Feature muss „nach Bedarf“ berechnet werden, d. h. zum Zeitpunkt der Bewertungsanforderung. Nach Erhalt einer Bewertungsanforderung sucht das Modell den Standort des Restaurants und wendet dann eine vordefinierte Funktion an, um die Entfernung zwischen dem aktuellen Benutzerstandort und dem Restaurant zu berechnen. Diese Entfernung wird zusammen mit anderen vorkompilierten Features aus dem Feature Store als Eingabe an das Modell übergeben.
Ihr Arbeitsbereich muss für Unity Catalog aktiviert sein, und Sie müssen Databricks Runtime 13.3 LTS for Machine Learning oder höher verwenden, um On-Demand-Features verwenden zu können.
Was sind On-Demand-Features?
„On-Demand“ bezieht sich auf Features, deren Werte zuvor nicht bekannt sind, jedoch zum Zeitpunkt des Rückschlusses berechnet werden. In Azure Databricks verwenden Sie benutzerdefinierte Python-Funktionen (User-Defined Fuctions, UDFs), um anzugeben, wie On-Demand-Features berechnet werden. Diese Funktionen werden von Unity Catalog verwaltet und stehen in Catalog Explorer zur Verfügung.
Workflow
Geben Sie zum Berechnen von On-Demand-Features eine benutzerdefinierte Python-Funktion (User-Defined Fuction, UDF) an, die beschreibt, wie die Featurewerte berechnet werden.
- Während des Trainings stellen Sie diese Funktion und die zugehörigen Eingabebindungen im Parameter
feature_lookups
dercreate_training_set
-API bereit. - Sie müssen das trainierte Modell mithilfe der Feature Store-Methode
log_model
protokollieren. Dadurch wird sichergestellt, dass das Modell automatisch On-Demand-Features auswertet, wenn es für den Rückschluss verwendet wird. - Bei der Batchbewertung berechnet die
score_batch
-API automatisch alle Featurewerte einschließlich On-Demand-Features und gibt diese zurück. - Wenn Sie ein Modell mit der Databricks-Modellbereitstellung bereitstellen, verwendet das Modell automatisch die Python-UDF, um On-Demand-Features für jede Bewertungsanforderung zu berechnen.
Erstellen einer Python-UDF
Sie können eine Python-UDF in einem Notebook oder in Databricks SQL erstellen.
Wenn Sie beispielsweise den folgenden Code in einer Notebookzelle ausführen, wird die Python-UDF example_feature
im Katalog main
und Schema default
erstellt.
%sql
CREATE FUNCTION main.default.example_feature(x INT, y INT)
RETURNS INT
LANGUAGE PYTHON
COMMENT 'add two numbers'
AS $$
def add_numbers(n1: int, n2: int) -> int:
return n1 + n2
return add_numbers(x, y)
$$
Nach dem Ausführen des Codes können Sie in Catalog Explorer durch den Namespace mit drei Ebenen navigieren, um die Funktionsdefinition anzuzeigen:
Weitere Informationen zum Erstellen von Python-UDFs finden Sie unter Registrieren einer Python-UDF für Unity Catalog und Handbuch zur Sprache „SQL“.
Behandeln fehlender Featurewerte
Wenn eine Python-UDF vom Ergebnis eines FeatureLookup abhängt, hängt der zurückgegebene Wert, wenn der angeforderte Lookup-Schlüssel nicht gefunden wird, von der Umgebung ab. Bei Verwendung von score_batch
wird None
als Wert zurückgegeben. Bei Verwendung der Online-Bereitstellung wird float("nan")
als Wert zurückgegeben.
Der folgende Code ist ein Beispiel für die Behandlung beider Fälle.
%sql
CREATE OR REPLACE FUNCTION square(x INT)
RETURNS INT
LANGUAGE PYTHON AS
$$
import numpy as np
if x is None or np.isnan(x):
return 0
return x * x
$$
Trainieren eines Modells mithilfe von On-Demand-Features
Sie verwenden eine FeatureFunction
, die an die create_training_set
-API im Parameter feature_lookups
übergeben wird, um das Modell zu trainieren.
Im folgenden Beispielcode wird die Python-UDF main.default.example_feature
verwendet, die im vorherigen Abschnitt definiert wurde.
# Install databricks-feature-engineering first with:
# %pip install databricks-feature-engineering
# dbutils.library.restartPython()
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering import FeatureFunction, FeatureLookup
from sklearn import linear_model
fe = FeatureEngineeringClient()
features = [
# The feature 'on_demand_feature' is computed as the sum of the the input value 'new_source_input'
# and the pre-materialized feature 'materialized_feature_value'.
# - 'new_source_input' must be included in base_df and also provided at inference time.
# - For batch inference, it must be included in the DataFrame passed to 'FeatureEngineeringClient.score_batch'.
# - For real-time inference, it must be included in the request.
# - 'materialized_feature_value' is looked up from a feature table.
FeatureFunction(
udf_name="main.default.example_feature", # UDF must be in Unity Catalog so uses a three-level namespace
input_bindings={
"x": "new_source_input",
"y": "materialized_feature_value"
},
output_name="on_demand_feature",
),
# retrieve the prematerialized feature
FeatureLookup(
table_name = 'main.default.table',
feature_names = ['materialized_feature_value'],
lookup_key = 'id'
)
]
# base_df includes the columns 'id', 'new_source_input', and 'label'
training_set = fe.create_training_set(
df=base_df,
feature_lookups=features,
label='label',
exclude_columns=['id', 'new_source_input', 'materialized_feature_value'] # drop the columns not used for training
)
# The training set contains the columns 'on_demand_feature' and 'label'.
training_df = training_set.load_df().toPandas()
# training_df columns ['materialized_feature_value', 'label']
X_train = training_df.drop(['label'], axis=1)
y_train = training_df.label
model = linear_model.LinearRegression().fit(X_train, y_train)
Protokollieren und Registrieren des Modells in Unity Catalog
Mit Featuremetadaten gepackte Modelle können in Unity Catalog registriert werden. Die Featuretabellen, die für die Erstellung eines Modells verwendet werden, müssen in Unity Catalog gespeichert werden.
Um sicherzustellen, dass das Modell automatisch On-Demand-Features auswertet, wenn es für den Rückschluss verwendet wird, müssen Sie den Registrierungs-URI festlegen und dann das Modell folgendermaßen protokollieren:
import mlflow
mlflow.set_registry_uri("databricks-uc")
fe.log_model(
model=model,
artifact_path="main.default.model",
flavor=mlflow.sklearn,
training_set=training_set,
registered_model_name="main.default.recommender_model"
)
Wenn die Python-UDF, die die On-Demand-Features definiert, beliebige Python-Pakete importiert, müssen Sie diese Pakete mithilfe des Arguments extra_pip_requirements
angeben. Beispiel:
import mlflow
mlflow.set_registry_uri("databricks-uc")
fe.log_model(
model=model,
artifact_path="model",
flavor=mlflow.sklearn,
training_set=training_set,
registered_model_name="main.default.recommender_model",
extra_pip_requirements=["scikit-learn==1.20.3"]
)
Einschränkung
On-Demand-Features können alle von Feature Store unterstützten Datentypen außer „MapType“ und „ArrayType“ ausgeben.
Notebookbeispiele: On-Demand-Features
Das folgende Notebook zeigt ein Beispiel für das Trainieren und Bewerten eines Modells, das ein On-Demand-Feature verwendet.
Einfaches Demonotebook für On-Demand-Features
Das folgende Notebook zeigt ein Beispiel für ein Modell zum Empfehlen von Restaurants. Die Lage des Restaurants wird in einer Databricks-Onlinetabelle nachgeschlagen. Der aktuelle Standort der Benutzer*innen wird als Teil der Bewertungsanforderung übermittelt. Das Modell verwendet ein On-Demand-Feature, um die Distanz zwischen den Benutzer*innen und dem Restaurant in Echtzeit zu berechnen. Diese Distanz wird dann als Eingabe für das Modell verwendet.
Demonotebook für On-Demand-Features für Restaurantempfehlungen mithilfe von Onlinetabellen
Das folgende Notebook zeigt das gleiche Modell für Restaurantempfehlungen mit einem Onlinespeicher eines Drittanbieters. Die Lage des Restaurants wird in einer vorab materialisierten Featuretabelle gesucht, die in CosmosDB veröffentlicht wurde.