Zdieľať cez


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.

    Snímka obrazovky ponuky prepínača prostredí zobrazujúca, kde vybrať položku Dátová veda.

  • 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.")