Comparteix via


Ajuste de hiperparámetros con Optuna

Optuna es una biblioteca de Python de código abierto para el ajuste de hiperparámetros que se puede escalar horizontalmente entre varios recursos de proceso.

MLflow 3.0 presenta nuevas funcionalidades eficaces para la optimización de hiperparámetros mediante la integración con Optuna.

  • MlflowStorage La clase permite a Optuna usar el servidor de seguimiento de MLflow como back-end de almacenamiento.
  • MlflowSparkStudy La clase habilita el inicio de estudios Optuna paralelos mediante ejecutores de PySpark.

Instalar Optuna

MLflow 3.0 está preinstalado en Databricks Runtime 17.0 ML y versiones posteriores. En entornos de ejecución anteriores, use los siguientes comandos para instalar la versión más reciente de Optuna y MLFlow.

%pip install mlflow --upgrade
%pip install optuna

Ejecutar la optimización Optuna en paralelo

Estos son los pasos de un flujo de trabajo de Optuna:

  1. Definir una función objetivo para optimizar. Dentro de la función objetivo, defina el espacio de búsqueda de hiperparámetros. Para obtener más información, consulte la documentación de Optuna.

    A continuación se muestra un ejemplo de selección de modelos e ajuste de hiperparámetros con sckit-learn. En el ejemplo se define la función objectiveobjetivo y se llama a la suggest_float función para definir el espacio de búsqueda del parámetro x.

import sklearn

def objective(trial):
    # Invoke suggest methods of a Trial object to generate hyperparameters.
    regressor_name = trial.suggest_categorical('classifier', ['SVR', 'RandomForest'])
    if regressor_name == 'SVR':
        svr_c = trial.suggest_float('svr_c', 1e-10, 1e10, log=True)
        regressor_obj = sklearn.svm.SVR(C=svr_c)
    else:
        rf_max_depth = trial.suggest_int('rf_max_depth', 2, 32)
        regressor_obj = sklearn.ensemble.RandomForestRegressor(max_depth=rf_max_depth)

    X, y = sklearn.datasets.fetch_california_housing(return_X_y=True)
    X_train, X_val, y_train, y_val = sklearn.model_selection.train_test_split(X, y, random_state=0)

    regressor_obj.fit(X_train, y_train)
    y_pred = regressor_obj.predict(X_val)

    error = sklearn.metrics.mean_squared_error(y_val, y_pred)

    return error  # An objective value linked with the Trial object
  1. Cree un almacenamiento compartido para la optimización distribuida. Con MlflowStorage, puede usar el servidor de seguimiento de MLflow como back-end de almacenamiento.
import mlflow
from mlflow.optuna.storage import MlflowStorage

experiment_id = mlflow.get_experiment_by_name(dbutils.notebook.entry_point.getDbutils().notebook().getContext().notebookPath().get()).experiment_id

mlflow_storage = MlflowStorage(experiment_id=experiment_id)
  1. Cree un objeto Optuna Study y ejecute el algoritmo de optimización llamando a la función optimize del objeto Study. MlflowSparkStudy puede ejecutar en paralelo estudios de Optuna mediante ejecutores de PySpark.

A continuación se muestra un ejemplo de la documentación de Optuna.

  • Cree un estudio y optimice la objective función con 8 evaluaciones (8 llamadas de la objective función con valores diferentes de x).
  • Obtener los mejores parámetros del Study
from mlflow.pyspark.optuna.study import MlflowSparkStudy

mlflow_study = MlflowSparkStudy(
    study_name="spark-mlflow-tuning",
    storage=mlflow_storage,
)

mlflow_study.optimize(objective, n_trials=8, n_jobs=4)

best_params = study.best_params

Ejemplo de cuaderno

En este cuaderno se proporciona un ejemplo del uso de Optuna para seleccionar un modelo scikit-learn y un conjunto de hiperparámetros para el conjunto de datos Iris.

Escalado vertical del ajuste de hiperparámetros con Optuna y MLflow

Obtener el cuaderno

MLFlow Optuna Integration API

MlflowStorage

MlflowStorage es una clase de almacenamiento basada en MLflow para Optuna con procesamiento por lotes para evitar la limitación de la API REST.

Nombre del parámetro de clase Tipo Description
experiment_id str Identificador del experimento de MLflow para el almacenamiento
name str Nombre del almacenamiento
batch_flush_interval float Tiempo en segundos entre vaciados automáticos por lotes (valor predeterminado: 1.0)
batch_size_threshold float Número máximo de elementos por lotes antes de desencadenar un vaciado (valor predeterminado: 100)

MlflowSparkStudy

MlflowSparkStudy es un contenedor de la clase ~optuna.study.Study para incorporar Optuna con Spark a través del experimento de MLflow.

Nombre del parámetro de clase Tipo Description
study_name str Nombre del estudio
storage mlflow.optuna.MlflowStorage Clase de almacenamiento basada en MLflow
sampler samplers.BaseSampler Objeto de muestreo que implementa un algoritmo que opera en segundo plano para la sugerencia de valor. optuna.samplers.TPESampler se usa
como valor predeterminado.
pruner float Un objeto pruner que decide la detención temprana de ensayos poco prometedores. optuna.pruners.MedianPruner se usa
como valor predeterminado.