Freigeben über


Optimierung von Hyperparametern mit Optuna

Optuna ist eine Open-Source-Python-Bibliothek für die Optimierung von Hyperparametern, die horizontal über mehrere Computeressourcen skaliert werden kann.

MLflow 3.0 bietet leistungsstarke neue Funktionen für die Hyperparameteroptimierung durch Integration in Optuna.

  • MlflowStorage Klasse ermöglicht es Optuna, den MLflow Tracking Server als Backend für die Speicherung zu verwenden.
  • MlflowSparkStudy die Klasse ermöglicht das Starten paralleler Optuna-Studien mit PySpark-Executoren.

Optuna installieren

MLflow 3.0 ist in Databricks Runtime 17.0 ML und höher vorinstalliert. Verwenden Sie in älteren Laufzeiten die folgenden Befehle, um die neueste Version von Optuna und MLFlow zu installieren.

%pip install mlflow --upgrade
%pip install optuna

Parallele Optuna-Optimierung ausführen

Hier sind die Schritte in einem Optuna-Workflow:

  1. Definieren Sie eine Zielfunktion, die optimiert werden soll. Definieren Sie innerhalb der Zielfunktion den Suchbereich für Hyperparameter. Weitere Details finden Sie in der Optuna-Dokumentation.

    Nachfolgend finden Sie ein Beispiel für die Modellauswahl und die Hyperparameteroptimierung mit sckit-learn. Das Beispiel definiert die Zielfunktion objectiveund ruft die suggest_float Funktion auf, um den Suchbereich für den Parameter xzu definieren.

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. Erstellen Sie einen freigegebenen Speicherplatz für die verteilte Optimierung. Mit MlflowStorage, können Sie MLflow Tracking Server als Speicher-Back-End verwenden.
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. Erstellen Sie ein Optuna Study-Objekt, und führen Sie den Optimierungsalgorithmus aus, indem Sie die optimize-Funktion des Study-Objekts aufrufen. MlflowSparkStudy kann parallele Optuna-Studien mit PySpark-Executoren starten.

Nachfolgend finden Sie ein Beispiel aus der Optuna-Dokumentation.

  • Erstellen Sie eine Studie, und optimieren Sie die objective Funktion mit 8 Versuchen (8 Aufrufe der objective Funktion mit unterschiedlichen Werten von x).
  • Abrufen der besten Parameter des Study-Objekts
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

Notebook-Beispiel

Dieses Notebook enthält ein Beispiel für die Verwendung von Optuna zum Auswählen eines Scikit-learn-Modells und einer Reihe von Hyperparametern für das Iris-Dataset.

Hochskalieren der Optimierung von Hyperparametern mit Optuna und MLflow

Notebook abrufen

MLFlow Optuna-Integrations-API

MlflowStorage

MlflowStorage ist eine MLflow-basierte Speicherklasse für Optuna mit Batchverarbeitung, um die REST-API-Drosselung zu vermeiden.

Klassenparametername Typ Description
experiment_id str MLflow Experiment ID für den Speicher
name str Name des Speichers
batch_flush_interval float Zeit in Sekunden zwischen automatischen Batchlöschungen (Standard: 1,0)
batch_size_threshold float Maximale Anzahl von Elementen im Batch vor dem Auslösen einer Leerung (Standard: 100)

MlflowSparkStudy

MlflowSparkStudy ist ein Wrapper der Klasse ~optuna.study.Study , um Optuna mit Spark via MLflow Experiment zu integrieren.

Klassenparametername Typ Description
study_name str Name der Studie
storage mlflow.optuna.MlflowStorage MLflow-basierte Speicherklasse
sampler samplers.BaseSampler Ein Samplerobjekt, das den Hintergrundalgorithmus für Wertvorschlag implementiert. optuna.samplers.TPESampler wird verwendet
als Standard.
pruner float Ein Pruner-Objekt, das ein frühzeitiges Beenden von nicht vielversprechenden Versuchen bestimmt. optuna.pruners.MedianPruner wird verwendet
als Standard.