Настройка гиперпараметров в Fabric (предварительная версия)
Настройка гиперпараметров — это процесс поиска оптимальных значений для параметров модели машинного обучения, влияющих на ее производительность. Это может быть сложно и много времени, особенно при работе с сложными моделями и большими наборами данных. В этой статье показано, как выполнять настройку гиперпараметров в Fabric.
В этом руководстве мы будем использовать набор данных о жилье Калифорнии, который содержит сведения о значении медиана дома и других функциях для различных блоков переписи населения в Калифорнии. После подготовки данных мы обучим модель SynapseML LightGBM для прогнозирования значения дома на основе функций. Далее мы будем использовать FLAML, быструю и упрощенную библиотеку AutoML, чтобы найти лучшие гиперпараметры для модели LightGBM. Наконец, мы сравните результаты настроенной модели с базовой моделью, которая использует параметры по умолчанию.
Внимание
Эта функция доступна в предварительной версии.
Необходимые компоненты
Получение подписки Microsoft Fabric. Или зарегистрируйте бесплатную пробную версию Microsoft Fabric.
Войдите в Microsoft Fabric.
Используйте переключатель интерфейса в левой части домашней страницы, чтобы перейти на интерфейс Synapse Обработка и анализ данных.
- Создайте новую среду Fabric или убедитесь, что вы работаете в среде выполнения Fabric 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)
Настройка эксперимента машинного обучения
Настройка 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,
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
Наконец, мы используем функцию обучения для обучения базовой модели со значениями по умолчанию гиперпараметров. Мы также оцениваем базовую модель на тестовых данных и печатаем оценку 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.")