Поделиться через


Настройка гиперпараметров в Fabric (предварительная версия)

Настройка гиперпараметров — это процесс поиска оптимальных значений для параметров модели машинного обучения, влияющих на ее производительность. Это может быть сложно и много времени, особенно при работе с сложными моделями и большими наборами данных. В этой статье показано, как выполнять настройку гиперпараметров в Fabric.

В этом руководстве мы будем использовать набор данных о жилье Калифорнии, который содержит сведения о значении медиана дома и других функциях для различных блоков переписи населения в Калифорнии. После подготовки данных мы обучим модель SynapseML LightGBM для прогнозирования значения дома на основе функций. Далее мы будем использовать FLAML, быструю и упрощенную библиотеку AutoML, чтобы найти лучшие гиперпараметры для модели LightGBM. Наконец, мы сравните результаты настроенной модели с базовой моделью, которая использует параметры по умолчанию.

Внимание

Эта функция доступна в предварительной версии.

Необходимые компоненты

  • Получение подписки Microsoft Fabric. Или зарегистрируйте бесплатную пробную версию Microsoft Fabric.

  • Войдите в Microsoft Fabric.

  • Используйте переключатель интерфейса в левой части домашней страницы, чтобы перейти на интерфейс Synapse Обработка и анализ данных.

    Снимок экрана: меню переключателя интерфейса, в котором показано, где выбрать Обработка и анализ данных.

Подготовка обучающих и тестовых наборов данных

В этом разделе мы подготовим обучающие и тестовые наборы данных для модели 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)

Настройка эксперимента машинного обучения

Настройка MLflow

Прежде чем выполнять настройку гиперпараметра, необходимо определить функцию обучения, которая может принимать различные значения гиперпараметров и обучать модель 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)

Обучение базовой модели

Далее мы определим функцию обучения, которая принимает четыре гиперпараметра в качестве входных данных: альфа, learningRate, numLeaves и numIterations. Это гиперпараметры, которые мы хотим настроить позже с помощью FLAML.

Функция обучения также принимает два кадра данных в качестве входных данных: train_data и val_data, которые являются наборами данных обучения и проверки соответственно. Функция обучения возвращает два выходных данных: обученную модель и оценку 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,
        )

        # 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

Наконец, мы используем функцию обучения для обучения базовой модели со значениями по умолчанию гиперпараметров. Мы также оцениваем базовую модель на тестовых данных и печатаем оценку 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, необходимо определить функцию настройки, которая принимает словарь конфигурации в качестве входных данных и возвращает словарь с метрикой оценки в качестве ключа и значения метрик в качестве значения.

Словарь конфигурации содержит гиперпараметры, которые мы хотим настроить и их значения. Функция настройки будет использовать функцию обучения, определенную ранее для обучения и оценки модели с заданной конфигурацией.

# 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 предоставляет некоторые удобные функции для определения различных типов диапазонов, таких как униформа, loguniform и 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 для оптимизации гиперпараметров. Необходимо передать функцию настройки, пространство поиска, бюджет времени, количество примеров, имя метрик, режим и уровень детализации функции 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 необходимо оценить, сколько они повышают производительность модели. Для этого мы используем функцию обучения для создания новой модели с лучшими гиперпараметрами в полном наборе данных обучения. Затем мы используем тестовый набор данных для вычисления оценки 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.")