Functies gebruiken om modellen te trainen
In dit artikel wordt beschreven hoe u modellen kunt trainen met behulp van Functie-engineering in Unity Catalog of de lokale werkruimtefunctieopslag. U moet eerst een trainingsgegevensset maken, waarmee de functies worden gedefinieerd die moeten worden gebruikt en hoe u deze kunt koppelen. Wanneer u vervolgens een model traint, behoudt het model verwijzingen naar de functies.
Wanneer u een model traint met functie-engineering in Unity Catalog, kunt u de herkomst van het model bekijken in Catalog Explorer. Tabellen en functies die zijn gebruikt om het model te maken, worden automatisch bijgehouden en weergegeven. Zie Herkomst van functiearchief weergeven.
Wanneer u het model gebruikt voor deductie, kunt u ervoor kiezen om functiewaarden op te halen uit het functiearchief. U kunt het model ook bedienen met Model Serving en de functies worden automatisch opzoekfuncties gepubliceerd in online winkels. Onderdelenarchiefmodellen zijn ook compatibel met de pyfunc-interface van MLflow, zodat u MLflow kunt gebruiken om batchdeductie uit te voeren met functietabellen.
Als uw model omgevingsvariabelen gebruikt, leest u hoe u deze kunt gebruiken wanneer u het model online bedient op Toegang tot resources configureren vanuit eindpunten voor het leveren van modellen.
Een model kan maximaal 50 tabellen en 100 functies gebruiken voor training.
Een trainingsgegevensset selecteren
Als u specifieke functies wilt selecteren in een functietabel voor modeltraining, maakt u een trainingsgegevensset met behulp van de API (voor Functie-engineering in Unity Catalog) of FeatureStoreClient.create_training_set
(voor werkruimtefunctiearchief) en een object met de FeatureEngineeringClient.create_training_set
naam aFeatureLookup
. Een FeatureLookup
geeft aan welke functie in de trainingsset moet worden gebruikt, inclusief de naam van de functietabel, de naam(en) van de functies en de sleutel(en) die moeten worden gebruikt bij het samenvoegen van de functietabel met het DataFrame dat is doorgegeven aan create_training_set
. Zie Functiezoekactie voor meer informatie.
Gebruik de feature_names
parameter wanneer u een FeatureLookup
.
feature_names
neemt één functienaam, een lijst met functienamen of Geen om alle functies (met uitzondering van primaire sleutels) in de functietabel op te zoeken op het moment dat de trainingsset wordt gemaakt.
Notitie
Het type en de volgorde van lookup_key
kolommen in het DataFrame moeten overeenkomen met het type en de volgorde van de primaire sleutels (met uitzondering van tijdstempelsleutels) van de referentiefunctietabel.
Dit artikel bevat codevoorbeelden voor beide versies van de syntaxis.
In dit voorbeeld bevat het DataFrame dat wordt trainingSet.load_df
geretourneerd door een kolom voor elke functie in feature_lookups
. Alle kolommen van het DataFrame worden bewaard, create_training_set
behalve de kolommen die zijn uitgesloten met behulp van exclude_columns
.
Functie-engineering in Unity Catalog
from databricks.feature_engineering import FeatureEngineeringClient, FeatureLookup
# The model training uses two features from the 'customer_features' feature table and
# a single feature from 'product_features'
feature_lookups = [
FeatureLookup(
table_name='ml.recommender_system.customer_features',
feature_names=['total_purchases_30d', 'total_purchases_7d'],
lookup_key='customer_id'
),
FeatureLookup(
table_name='ml.recommender_system.product_features',
feature_names=['category'],
lookup_key='product_id'
)
]
fe = FeatureEngineeringClient()
# Create a training set using training DataFrame and features from Feature Store
# The training DataFrame must contain all lookup keys from the set of feature lookups,
# in this case 'customer_id' and 'product_id'. It must also contain all labels used
# for training, in this case 'rating'.
training_set = fe.create_training_set(
df=training_df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id', 'product_id']
)
training_df = training_set.load_df()
Werkruimtefunctiearchief
from databricks.feature_store import FeatureLookup, FeatureStoreClient
# The model training uses two features from the 'customer_features' feature table and
# a single feature from 'product_features'
feature_lookups = [
FeatureLookup(
table_name='recommender_system.customer_features',
feature_names=['total_purchases_30d', 'total_purchases_7d'],
lookup_key='customer_id'
),
FeatureLookup(
table_name='recommender_system.product_features',
feature_names=['category'],
lookup_key='product_id'
)
]
fs = FeatureStoreClient()
# Create a training set using training DataFrame and features from Feature Store
# The training DataFrame must contain all lookup keys from the set of feature lookups,
# in this case 'customer_id' and 'product_id'. It must also contain all labels used
# for training, in this case 'rating'.
training_set = fs.create_training_set(
df=training_df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id', 'product_id']
)
training_df = training_set.load_df()
Een TrainingSet maken wanneer opzoeksleutels niet overeenkomen met de primaire sleutels
Gebruik het argument lookup_key
in de FeatureLookup
kolomnaam in de trainingsset. create_training_set
voert een geordende join uit tussen de kolommen uit de trainingsset die is opgegeven in het lookup_key
argument met behulp van de volgorde waarin de primaire sleutels zijn opgegeven toen de functietabel werd gemaakt.
In dit voorbeeld recommender_system.customer_features
heeft u de volgende primaire sleutels: customer_id
, dt
.
De recommender_system.product_features
functietabel heeft de primaire sleutel product_id
.
Als de training_df
volgende kolommen hebben:
cid
transaction_dt
product_id
rating
met de volgende code worden de juiste functiezoekacties voor het TrainingSet
volgende gemaakt:
Functie-engineering in Unity Catalog
feature_lookups = [
FeatureLookup(
table_name='ml.recommender_system.customer_features',
feature_names=['total_purchases_30d', 'total_purchases_7d'],
lookup_key=['cid', 'transaction_dt']
),
FeatureLookup(
table_name='ml.recommender_system.product_features',
feature_names=['category'],
lookup_key='product_id'
)
]
Werkruimtefunctiearchief
feature_lookups = [
FeatureLookup(
table_name='recommender_system.customer_features',
feature_names=['total_purchases_30d', 'total_purchases_7d'],
lookup_key=['cid', 'transaction_dt']
),
FeatureLookup(
table_name='recommender_system.product_features',
feature_names=['category'],
lookup_key='product_id'
)
]
Wanneer create_training_set
deze wordt aangeroepen, wordt er een trainingsgegevensset gemaakt door een left join uit te voeren, de tabellen recommender_system.customer_features
samen te voegen en training_df
de sleutels (customer_id
,dt
) te gebruiken die overeenkomen met (cid
,transaction_dt
), zoals wordt weergegeven in de volgende code:
Functie-engineering in Unity Catalog
customer_features_df = spark.sql("SELECT * FROM ml.recommender_system.customer_features")
product_features_df = spark.sql("SELECT * FROM ml.recommender_system.product_features")
training_df.join(
customer_features_df,
on=[training_df.cid == customer_features_df.customer_id,
training_df.transaction_dt == customer_features_df.dt],
how="left"
).join(
product_features_df,
on="product_id",
how="left"
)
Werkruimtefunctiearchief
customer_features_df = spark.sql("SELECT * FROM recommender_system.customer_features")
product_features_df = spark.sql("SELECT * FROM recommender_system.product_features")
training_df.join(
customer_features_df,
on=[training_df.cid == customer_features_df.customer_id,
training_df.transaction_dt == customer_features_df.dt],
how="left"
).join(
product_features_df,
on="product_id",
how="left"
)
Een TrainingSet maken met twee functies met dezelfde naam uit verschillende functietabellen
Gebruik het optionele argument output_name
in de FeatureLookup
. De opgegeven naam wordt gebruikt in plaats van de functienaam in het DataFrame dat wordt geretourneerd door TrainingSet.load_df
. Met de volgende code bevat bijvoorbeeld het DataFrame dat wordt geretourneerd door training_set.load_df
kolommen customer_height
en product_height
.
Functie-engineering in Unity Catalog
feature_lookups = [
FeatureLookup(
table_name='ml.recommender_system.customer_features',
feature_names=['height'],
lookup_key='customer_id',
output_name='customer_height',
),
FeatureLookup(
table_name='ml.recommender_system.product_features',
feature_names=['height'],
lookup_key='product_id',
output_name='product_height'
),
]
fe = FeatureEngineeringClient()
with mlflow.start_run():
training_set = fe.create_training_set(
df=df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id']
)
training_df = training_set.load_df()
Werkruimtefunctiearchief
feature_lookups = [
FeatureLookup(
table_name='recommender_system.customer_features',
feature_names=['height'],
lookup_key='customer_id',
output_name='customer_height',
),
FeatureLookup(
table_name='recommender_system.product_features',
feature_names=['height'],
lookup_key='product_id',
output_name='product_height'
),
]
fs = FeatureStoreClient()
with mlflow.start_run():
training_set = fs.create_training_set(
df=df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id']
)
training_df = training_set.load_df()
Een TrainingSet maken met dezelfde functie meerdere keren
Als u een TrainingSet wilt maken met dezelfde functie die is gekoppeld aan verschillende opzoeksleutels, gebruikt u meerdere FeatureLookups.
Gebruik een unieke output_name
functie voor elke FeatureLookup-uitvoer.
Functie-engineering in Unity Catalog
feature_lookups = [
FeatureLookup(
table_name='ml.taxi_data.zip_features',
feature_names=['temperature'],
lookup_key=['pickup_zip'],
output_name='pickup_temp'
),
FeatureLookup(
table_name='ml.taxi_data.zip_features',
feature_names=['temperature'],
lookup_key=['dropoff_zip'],
output_name='dropoff_temp'
)
]
Werkruimtefunctiearchief
feature_lookups = [
FeatureLookup(
table_name='taxi_data.zip_features',
feature_names=['temperature'],
lookup_key=['pickup_zip'],
output_name='pickup_temp'
),
FeatureLookup(
table_name='taxi_data.zip_features',
feature_names=['temperature'],
lookup_key=['dropoff_zip'],
output_name='dropoff_temp'
)
]
Een TrainingSet maken voor machine learning-modellen zonder supervisie
Instellen label=None
bij het maken van een TrainingSet voor leermodellen zonder supervisie. De volgende TrainingSet kan bijvoorbeeld worden gebruikt om verschillende klanten in groepen te clusteren op basis van hun interesses:
Functie-engineering in Unity Catalog
feature_lookups = [
FeatureLookup(
table_name='ml.recommender_system.customer_features',
feature_names=['interests'],
lookup_key='customer_id',
),
]
fe = FeatureEngineeringClient()
with mlflow.start_run():
training_set = fe.create_training_set(
df=df,
feature_lookups=feature_lookups,
label=None,
exclude_columns=['customer_id']
)
training_df = training_set.load_df()
Werkruimtefunctiearchief
feature_lookups = [
FeatureLookup(
table_name='recommender_system.customer_features',
feature_names=['interests'],
lookup_key='customer_id',
),
]
fs = FeatureStoreClient()
with mlflow.start_run():
training_set = fs.create_training_set(
df=df,
feature_lookups=feature_lookups,
label=None,
exclude_columns=['customer_id']
)
training_df = training_set.load_df()
Modellen trainen en batchdeductie uitvoeren met functietabellen
Wanneer u een model traint met behulp van functies uit Feature Store, behoudt het model verwijzingen naar de functies. Wanneer u het model gebruikt voor deductie, kunt u ervoor kiezen om functiewaarden op te halen uit de Functieopslag. U moet de primaire sleutel(s) opgeven van de functies die in het model worden gebruikt. Het model haalt de functies op die het nodig heeft uit de Feature Store in uw werkruimte. Vervolgens worden de functiewaarden toegevoegd als dat nodig is tijdens het scoren.
Functie opzoeken op deductietijd ondersteunen:
- U moet het model registreren met behulp van
FeatureEngineeringClient
delog_model
methode (voor Functie-engineering in Unity Catalog) ofFeatureStoreClient
(voor werkruimtefunctiearchief). - U moet het DataFrame gebruiken dat wordt geretourneerd door
TrainingSet.load_df
het model te trainen. Als u dit DataFrame op enigerlei wijze wijzigt voordat u het model gebruikt om het model te trainen, worden de wijzigingen niet toegepast wanneer u het model gebruikt voor deductie. Dit vermindert de prestaties van het model. - Het modeltype moet een overeenkomend
python_flavor
model hebben in MLflow. MLflow ondersteunt de meeste Python-modeltrainingsframeworks, waaronder:- scikit-learn
- keras
- PyTorch
- SparkML
- LightGBM
- XGBoost
- TensorFlow Keras (met behulp van de
python_flavor
mlflow.keras
)
- Aangepaste MLflow pyfunc-modellen
Functie-engineering in Unity Catalog
# Train model
import mlflow
from sklearn import linear_model
feature_lookups = [
FeatureLookup(
table_name='ml.recommender_system.customer_features',
feature_names=['total_purchases_30d'],
lookup_key='customer_id',
),
FeatureLookup(
table_name='ml.recommender_system.product_features',
feature_names=['category'],
lookup_key='product_id'
)
]
fe = FeatureEngineeringClient()
with mlflow.start_run():
# df has columns ['customer_id', 'product_id', 'rating']
training_set = fe.create_training_set(
df=df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id', 'product_id']
)
training_df = training_set.load_df().toPandas()
# "training_df" columns ['total_purchases_30d', 'category', 'rating']
X_train = training_df.drop(['rating'], axis=1)
y_train = training_df.rating
model = linear_model.LinearRegression().fit(X_train, y_train)
fe.log_model(
model=model,
artifact_path="recommendation_model",
flavor=mlflow.sklearn,
training_set=training_set,
registered_model_name="recommendation_model"
)
# Batch inference
# If the model at model_uri is packaged with the features, the FeatureStoreClient.score_batch()
# call automatically retrieves the required features from Feature Store before scoring the model.
# The DataFrame returned by score_batch() augments batch_df with
# columns containing the feature values and a column containing model predictions.
fe = FeatureEngineeringClient()
# batch_df has columns ‘customer_id’ and ‘product_id’
predictions = fe.score_batch(
model_uri=model_uri,
df=batch_df
)
# The ‘predictions’ DataFrame has these columns:
# ‘customer_id’, ‘product_id’, ‘total_purchases_30d’, ‘category’, ‘prediction’
Werkruimtefunctiearchief
# Train model
import mlflow
from sklearn import linear_model
feature_lookups = [
FeatureLookup(
table_name='recommender_system.customer_features',
feature_names=['total_purchases_30d'],
lookup_key='customer_id',
),
FeatureLookup(
table_name='recommender_system.product_features',
feature_names=['category'],
lookup_key='product_id'
)
]
fs = FeatureStoreClient()
with mlflow.start_run():
# df has columns ['customer_id', 'product_id', 'rating']
training_set = fs.create_training_set(
df=df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id', 'product_id']
)
training_df = training_set.load_df().toPandas()
# "training_df" columns ['total_purchases_30d', 'category', 'rating']
X_train = training_df.drop(['rating'], axis=1)
y_train = training_df.rating
model = linear_model.LinearRegression().fit(X_train, y_train)
fs.log_model(
model=model,
artifact_path="recommendation_model",
flavor=mlflow.sklearn,
training_set=training_set,
registered_model_name="recommendation_model"
)
# Batch inference
# If the model at model_uri is packaged with the features, the FeatureStoreClient.score_batch()
# call automatically retrieves the required features from Feature Store before scoring the model.
# The DataFrame returned by score_batch() augments batch_df with
# columns containing the feature values and a column containing model predictions.
fs = FeatureStoreClient()
# batch_df has columns ‘customer_id’ and ‘product_id’
predictions = fs.score_batch(
model_uri=model_uri,
df=batch_df
)
# The ‘predictions’ DataFrame has these columns:
# ‘customer_id’, ‘product_id’, ‘total_purchases_30d’, ‘category’, ‘prediction’
Aangepaste functiewaarden gebruiken bij het scoren van een model dat is verpakt met metagegevens van functies
Standaard zoekt een model dat is verpakt met functiemetagegevens functies uit functietabellen bij deductie. Als u aangepaste functiewaarden wilt gebruiken voor scoren, neemt u deze op in het DataFrame dat is doorgegeven aan FeatureEngineeringClient.score_batch
(voor Functie-engineering in Unity Catalog) of FeatureStoreClient.score_batch
(voor werkruimtefunctiearchief).
Stel dat u een model met deze twee functies inpakt:
Functie-engineering in Unity Catalog
feature_lookups = [
FeatureLookup(
table_name='ml.recommender_system.customer_features',
feature_names=['account_creation_date', 'num_lifetime_purchases'],
lookup_key='customer_id',
),
]
Werkruimtefunctiearchief
feature_lookups = [
FeatureLookup(
table_name='recommender_system.customer_features',
feature_names=['account_creation_date', 'num_lifetime_purchases'],
lookup_key='customer_id',
),
]
Bij deductie kunt u aangepaste waarden voor de functie account_creation_date
opgeven door een DataFrame aan te roepen score_batch
dat een kolom met de naam account_creation_date
bevat. In dit geval zoekt de API alleen de num_lifetime_purchases
functie uit de Feature Store op en gebruikt de opgegeven aangepaste account_creation_date
kolomwaarden voor het scoren van modellen.
Functie-engineering in Unity Catalog
# batch_df has columns ['customer_id', 'account_creation_date']
predictions = fe.score_batch(
model_uri='models:/ban_prediction_model/1',
df=batch_df
)
Werkruimtefunctiearchief
# batch_df has columns ['customer_id', 'account_creation_date']
predictions = fs.score_batch(
model_uri='models:/ban_prediction_model/1',
df=batch_df
)
Een model trainen en beoordelen met behulp van een combinatie van functies en gegevens die zich buiten de functieopslag bevinden
U kunt een model trainen met behulp van een combinatie van functies en gegevens van buiten het functiearchief. Wanneer u het model inpakt met metagegevens van functies, haalt het model functiewaarden op uit het functiearchief voor deductie.
Als u een model wilt trainen, moet u de extra gegevens opnemen als kolommen in het DataFrame dat wordt doorgegeven aan FeatureEngineeringClient.create_training_set
(voor Functie-engineering in Unity Catalog) of FeatureStoreClient.create_training_set
(voor werkruimtefunctiearchief). In dit voorbeeld wordt de functie total_purchases_30d
uit Feature Store en de externe kolom gebruikt browser
.
Functie-engineering in Unity Catalog
feature_lookups = [
FeatureLookup(
table_name='ml.recommender_system.customer_features',
feature_names=['total_purchases_30d'],
lookup_key='customer_id',
),
]
fe = FeatureEngineeringClient()
# df has columns ['customer_id', 'browser', 'rating']
training_set = fe.create_training_set(
df=df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id'] # 'browser' is not excluded
)
Werkruimtefunctiearchief
feature_lookups = [
FeatureLookup(
table_name='recommender_system.customer_features',
feature_names=['total_purchases_30d'],
lookup_key='customer_id',
),
]
fs = FeatureStoreClient()
# df has columns ['customer_id', 'browser', 'rating']
training_set = fs.create_training_set(
df=df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id'] # 'browser' is not excluded
)
Bij deductie moet het DataFrame dat wordt FeatureStoreClient.score_batch
gebruikt, de browser
kolom bevatten.
Functie-engineering in Unity Catalog
# At inference, 'browser' must be provided
# batch_df has columns ['customer_id', 'browser']
predictions = fe.score_batch(
model_uri=model_uri,
df=batch_df
)
Werkruimtefunctiearchief
# At inference, 'browser' must be provided
# batch_df has columns ['customer_id', 'browser']
predictions = fs.score_batch(
model_uri=model_uri,
df=batch_df
)
Modellen laden en batchdeductie uitvoeren met behulp van MLflow
Nadat een model is geregistreerd met behulp van de log_model
methode (voor Functie-engineering in Unity Catalog) of FeatureStoreClient
(voor werkruimtefunctiearchief), kan MLflow worden gebruikt bij deductie FeatureEngineeringClient
. MLflow.pyfunc.predict
haalt functiewaarden op uit het Functiearchief en voegt ook alle waarden toe die tijdens deductietijd worden opgegeven. U moet de primaire sleutel(s) opgeven van de functies die in het model worden gebruikt.
Notitie
Batchdeductie met MLflow vereist MLflow versie 2.11 en hoger. Modellen die gebruikmaken van tijdreeksfunctietabellen worden niet ondersteund. Als u batchdeductie wilt uitvoeren met tijdreeksfunctietabellen, gebruikt u score_batch
. Zie Modellen trainen en batchdeductie uitvoeren met functietabellen.
# Train model
import mlflow
from sklearn import linear_model
feature_lookups = [
FeatureLookup(
table_name='ml.recommender_system.customer_features',
feature_names=['total_purchases_30d'],
lookup_key='customer_id',
),
FeatureLookup(
table_name='ml.recommender_system.product_features',
feature_names=['category'],
lookup_key='product_id'
)
]
fe = FeatureEngineeringClient()
with mlflow.start_run():
# df has columns ['customer_id', 'product_id', 'rating']
training_set = fe.create_training_set(
df=df,
feature_lookups=feature_lookups,
label='rating',
exclude_columns=['customer_id', 'product_id']
)
training_df = training_set.load_df().toPandas()
# "training_df" columns ['total_purchases_30d', 'category', 'rating']
X_train = training_df.drop(['rating'], axis=1)
y_train = training_df.rating
model = linear_model.LinearRegression().fit(X_train, y_train)
fe.log_model(
model=model,
artifact_path="recommendation_model",
flavor=mlflow.sklearn,
training_set=training_set,
registered_model_name="recommendation_model",
#refers to the default value of "result_type" if not provided at inference
params={"result_type":"double"},
)
# Batch inference with MLflow
# NOTE: the result_type parameter can only be used if a default value
# is provided in log_model. This is automatically done for all models
# logged using Databricks Runtime for ML 15.0 or above.
# For earlier Databricks Runtime versions, use set_result as shown below.
# batch_df has columns ‘customer_id’ and ‘product_id’
model = mlflow.pyfunc.load_model(model_version_uri)
# If result_type parameter is provided in log_model
predictions = model.predict(df, {"result_type":"double"})
# If result_type parameter is NOT provided in log_model
model._model_impl.set_result_type("double")
predictions = model.predict(df)
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor