Κοινή χρήση μέσω


Εκτέλεση ρύθμισης υπερπαραμετέρου στο Fabric (προεπισκόπηση)

Η ρύθμιση υπερπαραμέτρου είναι η διαδικασία εύρεσης των βέλτιστων τιμών για τις παραμέτρους ενός μοντέλου εκμάθησης μηχανής που επηρεάζουν τις επιδόσεις του. Μπορεί να είναι δύσκολο και χρονοβόρο, ιδιαίτερα όταν χειρίζεστε σύνθετα μοντέλα και μεγάλα σύνολα δεδομένων. Σε αυτό το άρθρο, θα σας δείξουμε πώς μπορείτε να εκτελέσετε ρύθμιση υπερπαραμετρικού στο Fabric.

Σε αυτό το εκπαιδευτικό βοήθημα, θα χρησιμοποιήσουμε το σύνολο δεδομένων στέγασης στην Καλιφόρνια, το οποίο περιέχει πληροφορίες σχετικά με τη διάμεσο τιμή κατοικίας και άλλες δυνατότητες για διαφορετικά μπλοκ απογραφής στην Καλιφόρνια. Όταν ολοκληρωθεί η προετοιμασία των δεδομένων, θα εκπαιδεύσουμε ένα μοντέλο SynapseML LightGBM για πρόβλεψη της τιμής κατοικίας με βάση τις δυνατότητες. Στη συνέχεια, θα χρησιμοποιήσουμε τη συνάρτηση FLAML, μια γρήγορη και ελαφριά βιβλιοθήκη AutoML για την εύρεση των καλύτερων υπερπαραμετών για το μοντέλο LightGBM. Τέλος, θα συγκρίνουμε τα αποτελέσματα του ρυθμισμένου μοντέλου με το μοντέλο γραμμής βάσης που χρησιμοποιεί τις προεπιλεγμένες παραμέτρους.

Σημαντικός

Αυτή η δυνατότητα βρίσκεται προεπισκόπηση.

Προϋποθέσεις

  • Λάβετε μια συνδρομής Microsoft Fabric . Εναλλακτικά, εγγραφείτε για μια δωρεάν δοκιμαστική έκδοση microsoft Fabric.

  • Εισέλθετε για να το Microsoft Fabric.

  • Χρησιμοποιήστε την εναλλαγή εμπειρίας στην κάτω αριστερή πλευρά της αρχικής σελίδας σας για να μεταβείτε σε Fabric.

    Στιγμιότυπο οθόνης του μενού εναλλαγής εμπειρίας, που εμφανίζει πού μπορείτε να επιλέξετε Επιστήμη δεδομένων.

  • Δημιουργήστε ένα νέο περιβάλλον Fabric ή βεβαιωθείτε ότι εκτελείτε στο Fabric Runtime 1.2 (Spark 3.4 (ή νεότερη έκδοση) και Delta 2.4)
  • Δημιουργήστε ένα νέο σημειωματάριο.
  • Επισυνάψτε το σημειωματάριό σας σε έναlakehouse . Στην αριστερή πλευρά του σημειωματάριού σας, επιλέξτε Προσθήκη για να προσθέσετε μια υπάρχουσα λίμνη ή να δημιουργήσετε μια νέα.

Προετοιμασία συνόλων δεδομένων εκπαίδευσης και δοκιμής

Σε αυτή την ενότητα, προετοιμάζουμε τα σύνολα δεδομένων εκπαίδευσης και δοκιμής για το μοντέλο LightGBM. Χρησιμοποιούμε το σύνολο δεδομένων στέγασης στην Καλιφόρνια από τη Sklearn. Δημιουργούμε ένα πλαίσιο δεδομένων Spark από τα δεδομένα και χρησιμοποιούμε ένα VectorAssembler για να συνδυάσουμε τις δυνατότητες σε μια μοναδική στήλη διανυσματικών.

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)

Έπειτα, διαιρούμε τυχαία τα δεδομένα σε τρία υποσύνολα: εκπαίδευση, επικύρωση και δοκιμή, με 85%, 12,75%και 2,25% των δεδομένων αντίστοιχα. Χρησιμοποιούμε τα σύνολα εκπαίδευσης και επικύρωσης για ρύθμιση υπερπαραμετέρων και το σύνολο δοκιμών για την αξιολόγηση του μοντέλου.

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)

Ρύθμιση του πειράματος εκμάθησης μηχανής

Ρύθμιση παραμέτρων ροής ML

Πριν εκτελέσουμε τη ρύθμιση του υπερπαραμετρικού, πρέπει να ορίσουμε μια συνάρτηση train που μπορεί να λάβει διαφορετικές τιμές υπερπαραμετών και να εκπαιδεύσει ένα μοντέλο LightGBM στα δεδομένα εκπαίδευσης. Πρέπει επίσης να αξιολογήσουμε τις επιδόσεις του μοντέλου στα δεδομένα επικύρωσης χρησιμοποιώντας τη βαθμολογία R2, η οποία μετρά πόσο καλά ταιριάζει τα δεδομένα το μοντέλο.

Για να το κάνουμε αυτό, θα εισαγάγουμε πρώτα τις απαραίτητες λειτουργικές μονάδες και θα ρυθμίσουμε το πείραμα MLflow. Το MLflow είναι μια πλατφόρμα ανοιχτού κώδικα για τη διαχείριση του κύκλου ζωής εκμάθησης μηχανής από άκρο σε άκρο. Μας βοηθά να παρακολουθούμε και να συγκρίνουμε τα αποτελέσματα διαφορετικών μοντέλων και υπερπαραμετών.

# 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)

Ορισμός επιπέδου καταγραφής

Εδώ, διαμορφώνουμε τις παραμέτρους του επιπέδου καταγραφής για να καταστείλουν τα περιττά δεδομένα εξόδου από τη βιβλιοθήκη Synapse.ml, διατηρώντας τα αρχεία καταγραφής καθαρότερα.

import logging
 
logging.getLogger('synapse.ml').setLevel(logging.ERROR)

Μοντέλο γραμμής βάσης εκπαίδευσης

Στη συνέχεια, ορίζουμε τη συνάρτηση train που λαμβάνει τέσσερις υπερπαραμετρικούς ως εισόδους: alpha, learningRate, numLeaves και numIterations. Αυτοί είναι οι υπερπαραμετρητές που θέλουμε να συντονίσουμε αργότερα χρησιμοποιώντας το FLAML.

Η συνάρτηση train λαμβάνει επίσης δύο πλαίσια δεδομένων ως δεδομένα εισόδου: train_data και val_data, τα οποία είναι τα σύνολα δεδομένων εκπαίδευσης και επικύρωσης αντίστοιχα. Η συνάρτηση train επιστρέφει δύο εξόδους: το εκπαιδευμένο μοντέλο και τη βαθμολογία R2 στα δεδομένα επικύρωσης.

# 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

Τέλος, χρησιμοποιούμε τη συνάρτηση train για την εκπαίδευση ενός μοντέλου γραμμής βάσης με τις προεπιλεγμένες τιμές των υπερπαραμετών. Αξιολογούμε επίσης το μοντέλο γραμμής βάσης στα δεδομένα δοκιμής και εκτυπώνουμε τη βαθμολογία 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)

Εκτέλεση ρύθμισης υπερπαραμετέρου με το FLAML

Το FLAML είναι μια γρήγορη και ελαφριά βιβλιοθήκη AutoML που μπορεί να βρει αυτόματα τους καλύτερους υπερπαραμετήρες για ένα συγκεκριμένο μοντέλο και σύνολο δεδομένων. Χρησιμοποιεί μια στρατηγική αναζήτησης χαμηλού κόστους που προσαρμόζεται στα σχόλια από το μετρικό αξιολόγησης. Σε αυτήν την ενότητα, θα χρησιμοποιήσουμε το FLAML για να ρυθμίσουμε τις υπερπαραμετρητήρες του μοντέλου LightGBM που ορίσαμε στην προηγούμενη ενότητα.

Ορισμός συνάρτησης συντονισμού

Για να χρησιμοποιήσετε το FLAML, πρέπει να ορίσετε μια συνάρτηση συντονισμού που λαμβάνει ένα λεξικό ρύθμισης παραμέτρων ως είσοδο και επιστρέφει ένα λεξικό με το μετρικό αξιολόγησης ως κλειδί και την τιμή του μετρικού ως τιμή.

Το λεξικό ρύθμισης παραμέτρων περιέχει τους υπερπαραμετρητές που θέλουμε να ρυθμίσουμε και τις τιμές τους. Η συνάρτηση tune θα χρησιμοποιήσει τη συνάρτηση train που ορίσαμε νωρίτερα για την εκπαίδευση και αξιολόγηση του μοντέλου με τη δεδομένη διαμόρφωση.

# 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}

Ορισμός χώρου αναζήτησης

Στη συνέχεια, πρέπει να ορίσουμε τον χώρο αναζήτησης για τους υπερπαραμετήρες που θέλουμε να ρυθμίσουμε. Ο χώρος αναζήτησης είναι ένα λεξικό που αντιστοιχίζει τα ονόματα υπερπαραμετήρα στις περιοχές τιμών που θέλουμε να εξερευνήσουμε. Το FLAML παρέχει ορισμένες βολικές συναρτήσεις για τον ορισμό διαφορετικών τύπων περιοχών, όπως ομοιόμορφες, λογομορφές και randint.

Σε αυτήν την περίπτωση, θέλουμε να ρυθμίσουμε τις ακόλουθες τέσσερις υπερπαραμετρήσεις: alpha, learningRate, numLeaves και 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),
}

Ορισμός δοκιμαστικής έκδοσης υπερπαραμετέρου

Τέλος, πρέπει να ορίσουμε μια δοκιμαστική έκδοση υπερπαραμετέρου που θα χρησιμοποιεί το FLAML για τη βελτιστοποίηση των υπερπαραμετών. Πρέπει να διαβιβάσουμε τη συνάρτηση συντονισμού, τον χώρο αναζήτησης, τον προϋπολογισμό χρόνου, τον αριθμό των δειγμάτων, το όνομα του μετρικού, τη λειτουργία και το επίπεδο verbosity στη συνάρτηση flaml.tune.run. Πρέπει επίσης να ξεκινήσουμε μια ένθετες εκτελέσεις MLflow για να παρακολουθούμε τα αποτελέσματα της δοκιμαστικής έκδοσης.

Η flaml.tune.run function θα επιστρέψει ένα αντικείμενο ανάλυσης που περιέχει την καλύτερη διαμόρφωση και την καλύτερη τιμή μετρικού.

# 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,
        )

Μετά την ολοκλήρωση της δοκιμαστικής έκδοσης, μπορούμε να δούμε την καλύτερη ρύθμιση παραμέτρων και την καλύτερη τιμή μετρικού από το αντικείμενο ανάλυσης.

# 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"])

Σύγκριση αποτελεσμάτων

Μετά την εύρεση των καλύτερων υπερπαραμετρητών με ΤΟ FLAML, πρέπει να αξιολογήσουμε πόσο βελτιώνουν τις επιδόσεις του μοντέλου. Για να το κάνουμε αυτό, χρησιμοποιούμε τη συνάρτηση train για να δημιουργήσουμε ένα νέο μοντέλο με τους καλύτερους υπερπαραμετήρες στο σύνολο δεδομένων πλήρους εκπαίδευσης. Στη συνέχεια, χρησιμοποιούμε το σύνολο δεδομένων δοκιμής για να υπολογίσουμε τη βαθμολογία R2 τόσο για το νέο μοντέλο όσο και για το μοντέλο γραμμής βάσης.

# 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)

Αποθήκευση τελικού μοντέλου

Μόλις ολοκληρώσουμε τη δοκιμαστική έκδοση υπερπαραμετέρου, μπορούμε τώρα να αποθηκεύσουμε το τελικό, συντονισμένο μοντέλο ως μοντέλο εκμάθησης μηχανής στο 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.")