Vykonanie ladenia hyperparametrov v službe Fabric (Preview)
Ladenie hyperparametrov je proces hľadania optimálnych hodnôt pre parametre modelu strojového učenia, ktoré ovplyvňujú jeho výkon. Môže to byť náročné a časovo náročné, najmä ak sa zaoberáte zložitými modelmi a veľkými množinami údajov. V tomto článku vám ukážeme, ako vykonať ladenie hyperparametrov v službe Fabric.
V tomto kurze použijeme množinu údajov o bývanie v Kalifornii, ktorá obsahuje informácie o mediánovej hodnote domu a ďalších funkciách pre rôzne bloky sčítania v Kalifornii. Po predbežnom vytvorení údajov trénujeme model SynapseML LightGBM, aby sme mohli predpovedať hodnotu domu na základe daných funkcií. V ďalšom kroku použijeme knižnicu FLAML, rýchlu a ľahkú knižnicu automatizovaného strojového učenia, aby sme našli najlepšie hyperparametre pre model LightGBM. Nakoniec porovnáme výsledky vyladeného modelu so základným modelom, ktorý používa predvolené parametre.
Dôležitý
Táto funkcia je ukážky.
Predpoklady
Získajte predplatné služby Microsoft Fabric . Alebo si zaregistrujte bezplatnú skúšobnú služby Microsoft Fabric.
Prihláste sa do služby Microsoft Fabric.
Pomocou prepínača skúseností v ľavej dolnej časti domovskej stránky sa prepnete na službu Fabric.
- Vytvorte nové prostredie služby Fabric alebo skontrolujte, či je spustené na fabricskom režime runtime 1.2 (Spark 3.4 (alebo vyššia) a Delta 2.4)
- Vytvorte nový poznámkový blok.
- Pripojte poznámkový blok k lakehouse. Na ľavej strane poznámkového bloku vyberte položky Pridať a pridajte existujúce jazero alebo vytvorte nový.
Príprava tréningových a testovacích množín údajov
V tejto časti pripravujeme trénované a testovacie množiny údajov pre model LightGBM. Používame kalifornia bývanie množiny údajov zo Sklearn. Z údajov služby Spark vytvoríme údajový rámec a pomocou VectorAssembler skombinujeme funkcie do jedného vektorového stĺpca.
from sklearn.datasets import fetch_california_housing
from pyspark.sql import SparkSession
# Load the Scikit-learn California Housing dataset
sklearn_dataset = fetch_california_housing()
# Convert the Scikit-learn dataset to a Pandas DataFrame
import pandas as pd
pandas_df = pd.DataFrame(sklearn_dataset.data, columns=sklearn_dataset.feature_names)
pandas_df['target'] = sklearn_dataset.target
# Create a Spark DataFrame from the Pandas DataFrame
spark_df = spark.createDataFrame(pandas_df)
# Display the data
display(spark_df)
Potom náhodne rozdelíme údaje do troch podmnožín: trénovania, overenia a testovania, pričom 85%, 12,75%a 2,25% údajov. Na ladenie hyperparametrov a testovaciu množinu na vyhodnocovanie modelu používame množiny trénovania a overenia.
from pyspark.ml.feature import VectorAssembler
# Combine features into a single vector column
featurizer = VectorAssembler(inputCols=sklearn_dataset.feature_names, outputCol="features")
data = featurizer.transform(spark_df)["target", "features"]
# Split the data into training, validation, and test sets
train_data, test_data = data.randomSplit([0.85, 0.15], seed=41)
train_data_sub, val_data_sub = train_data.randomSplit([0.85, 0.15], seed=41)
Nastavenie experimentu strojového učenia
Konfigurácia toku MLflow
Skôr než vykonáme ladenie hyperparametrov, musíme definovať funkciu vlaku, ktorá môže mať rôzne hodnoty hyperparametrov a trénovať model LightGBM na tréningových údajoch. Musíme tiež vyhodnotiť výkon modelu v overovacích údajoch pomocou skóre R2, ktoré meria, do akej miery model zodpovedá údajom.
Najskôr importujeme potrebné moduly a nastavíme experiment toku MLflow. MLflow je open-source platforma na spravovanie životného cyklu strojového učenia od konca. Pomáha nám sledovať a porovnávať výsledky rôznych modelov a hyperparametrov.
# Import MLflow and set up the experiment name
import mlflow
mlflow.set_experiment("flaml_tune_sample")
# Enable automatic logging of parameters, metrics, and models
mlflow.autolog(exclusive=False)
Nastavenie úrovne zapisovania do denníka
Tu nakonfigurujeme úroveň zapisovania do denníka tak, aby potlačila nepotrebný výstup z knižnice Synapse.ml, aby denníky boli prehľadnejšie.
import logging
logging.getLogger('synapse.ml').setLevel(logging.ERROR)
Model pôvodného plánu trénovať
Ďalej definujeme funkciu train, ktorá použije štyri hyperparametre ako vstupy: alfa, learningRate, numLeaves a numIterations. Toto sú hyperparametre, ktoré si chceme neskôr pomocou flaml vyladiť.
Funkcia train tiež berie ako vstup dva údajové rámce: train_data a val_data, čo sú tréningové a overovacie množiny údajov. Funkcia train vráti dva výstupy: trénovaný model a skóre R2 v overovacích údajoch.
# Import LightGBM and RegressionEvaluator
from synapse.ml.lightgbm import LightGBMRegressor
from pyspark.ml.evaluation import RegressionEvaluator
def train(alpha, learningRate, numLeaves, numIterations, train_data=train_data_sub, val_data=val_data_sub):
"""
This train() function:
- takes hyperparameters as inputs (for tuning later)
- returns the R2 score on the validation dataset
Wrapping code as a function makes it easier to reuse the code later for tuning.
"""
with mlflow.start_run() as run:
# Capture run_id for prediction later
run_details = run.info.run_id
# Create a LightGBM regressor with the given hyperparameters and target column
lgr = LightGBMRegressor(
objective="quantile",
alpha=alpha,
learningRate=learningRate,
numLeaves=numLeaves,
labelCol="target",
numIterations=numIterations,
dataTransferMode="bulk"
)
# Train the model on the training data
model = lgr.fit(train_data)
# Make predictions on the validation data
predictions = model.transform(val_data)
# Define an evaluator with R2 metric and target column
evaluator = RegressionEvaluator(predictionCol="prediction", labelCol="target", metricName="r2")
# Compute the R2 score on the validation data
eval_metric = evaluator.evaluate(predictions)
mlflow.log_metric("r2_score", eval_metric)
# Return the model and the R2 score
return model, eval_metric, run_details
Nakoniec použijeme funkciu train na trénovaie základného modelu s predvolenými hodnotami hyperparametrov. Vyhodnotíme aj základný model v testovacích údajoch a vytlačíme skóre R2.
# Train the baseline model with the default hyperparameters
init_model, init_eval_metric, init_run_id = train(alpha=0.2, learningRate=0.3, numLeaves=31, numIterations=100, train_data=train_data, val_data=test_data)
# Print the R2 score of the baseline model on the test data
print("R2 of initial model on test dataset is: ", init_eval_metric)
Vykonanie ladenia hyperparametrov pomocou flaml
FLAML je rýchla a ľahká knižnica automatizovaného strojového učenia, ktorá automaticky dokáže nájsť najlepšie hyperparametre pre daný model a množinu údajov. Používa stratégiu vyhľadávania za nízku cenu, ktorá sa prispôsobí spätnej väzbe z metriky hodnotenia. V tejto časti použijeme protokol FLAML na vyladenie hyperparametrov modelu LightGBM, ktorý sme definovali v predchádzajúcej časti.
Definovanie funkcie tune
Ak chcete používať FLAML, musíme definovať funkciu tune, ktorá vezme slovník konfigurácie ako vstup a vráti slovník s metrikou vyhodnotenia ako kľúčom a metrickou hodnotou ako hodnotou.
Slovník konfigurácie obsahuje hyperparametre, ktoré chceme vyladiť a ich hodnoty. Funkcia tune bude používať funkciu train, ktorú sme definovali predtým na trénovanie a vyhodnotenie modelu pomocou danej konfigurácie.
# Import FLAML
import flaml
# Define the tune function
def flaml_tune(config):
# Train and evaluate the model with the given config
_, metric, run_id = train(**config)
# Return the evaluation metric and its value
return {"r2": metric}
Definovanie priestoru vyhľadávania
V ďalšom kroku musíme definovať priestor vyhľadávania pre hyperparametre, ktoré chceme vyladiť. Medzera hľadania je slovník, ktorý primapuje názvy hyperparametrov k rozsahom hodnôt, ktoré chceme preskúmať. Jazyk FLAML poskytuje niekoľko pohodlných funkcií na definovanie rôznych typov rozsahov, ako sú napríklad uniformy, loguniform a randint.
V tomto prípade chceme vyladiť nasledujúce štyri hyperparametre: alfa, learningRate, numLeaves a numIterations.
# Define the search space
params = {
# Alpha is a continuous value between 0 and 1
"alpha": flaml.tune.uniform(0, 1),
# Learning rate is a continuous value between 0.001 and 1
"learningRate": flaml.tune.uniform(0.001, 1),
# Number of leaves is an integer value between 30 and 100
"numLeaves": flaml.tune.randint(30, 100),
# Number of iterations is an integer value between 100 and 300
"numIterations": flaml.tune.randint(100, 300),
}
Definovanie skúšobnej verzie hyperparametrov
Nakoniec musíme definovať skúšobnú verziu hyperparametrov, ktorá použije funkciu FLAML na optimalizáciu hyperparametrov. Funkcii tune, priestoru vyhľadávania, rozpočtu času, počtu vzoriek, názvu metriky, režimu a úrovne verbosity musíme odovzdať funkciu flaml.tune.run. Tiež musíme spustiť spustenie vnoreného toku MLflow, aby sme mohli sledovať výsledky skúšobnej verzie.
flaml.tune.run function
vráti objekt analýzy, ktorý obsahuje najlepšiu konfiguráciu a najlepšiu hodnotu metriky.
# Start a nested MLflow run
with mlflow.start_run(nested=True, run_name="Child Run: "):
# Run the hyperparameter trial with FLAML
analysis = flaml.tune.run(
# Pass the tune function
flaml_tune,
# Pass the search space
params,
# Set the time budget to 120 seconds
time_budget_s=120,
# Set the number of samples to 100
num_samples=100,
# Set the metric name to r2
metric="r2",
# Set the mode to max (we want to maximize the r2 score)
mode="max",
# Set the verbosity level to 5
verbose=5,
)
Po dokončení skúšobnej verzie si môžeme z objektu analýzy zobraziť najlepšiu konfiguráciu a najlepšiu hodnotu metriky.
# Get the best config from the analysis object
flaml_config = analysis.best_config
# Print the best config
print("Best config: ", flaml_config)
print("Best score on validation data: ", analysis.best_result["r2"])
Porovnanie výsledkov
Po nájdení najlepších hyperparametrov s funkciou FLAML musíme vyhodnotiť, o koľko sa majú zlepšiť výkon modelu. Na tento účel použijeme funkciu trénovania na vytvorenie nového modelu s najlepšími hyperparametrami na úplnú tréningovú množinu údajov. Potom použijeme testovaciu množinu údajov na výpočet skóre R2 pre nový model aj základný model.
# Train a new model with the best hyperparameters
flaml_model, flaml_metric, flaml_run_id = train(train_data=train_data, val_data=test_data, **flaml_config)
# Print the R2 score of the baseline model on the test dataset
print("On the test dataset, the initial (untuned) model achieved R^2: ", init_eval_metric)
# Print the R2 score of the new model on the test dataset
print("On the test dataset, the final flaml (tuned) model achieved R^2: ", flaml_metric)
Uloženie konečného modelu
Po dokončení skúšobnej verzie hyperparametra môžeme uložiť finálny, naladený model ako model strojového učenia v službe Fabric.
# Specify the model name and the path where you want to save it in the registry
model_name = "housing_model" # Replace with your desired model name
model_path = f"runs:/{flaml_run_id}/model"
# Register the model to the MLflow registry
registered_model = mlflow.register_model(model_uri=model_path, name=model_name)
# Print the registered model's name and version
print(f"Model '{registered_model.name}' version {registered_model.version} registered successfully.")