Condividi tramite


Ottimizzazione degli iperparametri con Optuna

Optuna è una libreria Python open source per l’ottimizzazione degli iperparametri che può essere ridimensionata orizzontalmente tra più risorse di calcolo.

MLflow 3.0 introduce nuove potenti funzionalità per l'ottimizzazione degli iperparametri grazie all'integrazione con Optuna.

  • MlflowStorage La classe consente a Optuna di usare il server di rilevamento MLflow come back-end di archiviazione.
  • MlflowSparkStudy classe abilita l'avvio di studi paralleli Optuna usando executor PySpark.

Installare Optuna

MLflow 3.0 è preinstallato in Databricks Runtime 17.0 ML e versioni successive. Nei runtime meno recenti usare i comandi seguenti per installare la versione più recente di Optuna e MLFlow.

%pip install mlflow --upgrade
%pip install optuna

Eseguire l'ottimizzazione Optuna in parallelo

Ecco i passaggi in un flusso di lavoro Optuna:

  1. Come definire una funzione obiettivo. All’interno della funzione obiettivo definire lo spazio di ricerca degli iperparametri. Per altri dettagli, vedere la documentazione di Optuna.

    Di seguito è riportato un esempio per la selezione del modello e l'ottimizzazione degli iperparametri con sckit-learn. L'esempio definisce la funzione objectiveobiettivo e chiama la suggest_float funzione per definire lo spazio di ricerca per il parametro 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. Creare una risorsa di archiviazione condivisa per l'ottimizzazione distribuita. Con MlflowStorageè possibile usare MLflow Tracking Server come back-end di archiviazione.
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. Creare un oggetto Optuna Study ed eseguire l’algoritmo di ottimizzazione chiamando la optimize funzione dell’oggetto Study. MlflowSparkStudy può avviare studi Optuna paralleli usando gli executor PySpark.

Di seguito è riportato un esempio della documentazione di Optuna.

  • Creare uno studio e ottimizzare la objective funzione con 8 prove (8 chiamate della objective funzione con valori diversi di x).
  • Ottenere i parametri migliori dello studio
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

Esempio di notebook

Questo notebook fornisce un esempio di uso di Optuna per selezionare un modello scikit-learn e un set di iperparametri per il set di dati Iris.

Aumento dell'ottimizzazione degli iperparametri con Optuna e MLflow

Ottenere il notebook

API di integrazione di MLFlow Optuna

MlflowStorage

MlflowStorage è una classe di archiviazione con base MLflow per Optuna con elaborazione batch per evitare il throttling dell'API REST.

Nome del parametro della classe TIPO Descrizione
experiment_id str L'ID dell'esperimento MLflow per l'archiviazione
name str Nome dell'archiviazione
batch_flush_interval float Tempo in secondi tra gli scaricamenti automatici del batch (impostazione predefinita: 1,0)
batch_size_threshold float Numero massimo di elementi in batch prima di attivare uno scaricamento (impostazione predefinita: 100)

MlflowSparkStudy

MlflowSparkStudy è un wrapper della classe ~optuna.study.Study per incorporare Optuna con Spark tramite l'esperimento MLflow.

Parametro della classe TIPO Descrizione
study_name str Nome dello studio
storage mlflow.optuna.MlflowStorage Classe di archiviazione basata su MLflow
sampler samplers.BaseSampler Oggetto sampler che implementa l'algoritmo di sfondo per il suggerimento di valore. optuna.samplers.TPESampler viene usato
come impostazione predefinita.
pruner float Oggetto di potatura che decide l'interruzione anticipata delle prove non promettenti. optuna.pruners.MedianPruner viene usato
come impostazione predefinita.