Compartilhar via


Ajuste de hiperparâmetro com Optuna

Optuna é uma biblioteca Python de software livre para ajuste de hiperparâmetro que pode ser dimensionada horizontalmente em vários recursos de computação.

O MLflow 3.0 apresenta novos recursos avançados para otimização de hiperparâmetro integrando-se ao Optuna.

  • MlflowStorage A classe permite que o Optuna use o Servidor de Acompanhamento do MLflow como seu back-end de armazenamento.
  • MlflowSparkStudy A classe permite iniciar estudos paralelos do Optuna usando executores do PySpark.

Instalar o Optuna

O MLflow 3.0 é pré-instalado no Databricks Runtime 17.0 ML e superior. Em runtimes mais antigos, use os comandos a seguir para instalar a versão mais recente do Optuna e do MLFlow.

%pip install mlflow --upgrade
%pip install optuna

Executar a otimização do Optuna em paralelo

Estas são as etapas em um fluxo de trabalho do Optuna:

  1. Defina uma função objetiva para otimizar. Dentro da função de objetivo, defina o espaço de pesquisa do hiperparâmetro. Para obter mais detalhes, consulte a documentação do Optuna.

    Veja abaixo um exemplo de seleção de modelo e ajuste de hiperparâmetro com sckit-learn. O exemplo define a função objectivede objetivo e chama a suggest_float função para definir o espaço de pesquisa para o 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. Crie um armazenamento compartilhado para otimização distribuída. Com MlflowStorage, você pode usar o Servidor de Acompanhamento do MLflow como o back-end de armazenamento.
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. Crie um objeto Optuna Study e execute o algoritmo de ajuste chamando a função optimize do objeto Study. MlflowSparkStudy pode executar o lançamento de estudos paralelos do Optuna usando executores do PySpark.

Veja abaixo um exemplo da documentação do Optuna.

  • Crie um Estudo e otimize a função objective com 8 avaliações (8 chamadas da função objective com valores diferentes da função x).
  • Obter os melhores parâmetros do Estudo
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

Exemplo de notebook

Este notebook fornece um exemplo de como usar o Optuna para selecionar um modelo scikit-learn e um conjunto de hiperparâmetros para o conjunto de dados Iris.

Dimensionando o ajuste do hiperparâmetro com Optuna e MLflow

Obter notebook

API de integração do MLFlow Optuna

MlflowStorage

MlflowStorage é uma classe de armazenamento baseada em MLflow para Optuna com processamento em lote para evitar a limitação da API REST.

Nome do parâmetro de classe Tipo Description
experiment_id str ID do experimento do MLflow relacionado ao armazenamento
name str Nome do armazenamento
batch_flush_interval float Tempo em segundos entre liberações automáticas em lotes (padrão: 1.0)
batch_size_threshold float Número máximo de itens em lote antes de disparar uma liberação (padrão: 100)

MlflowSparkStudy

MlflowSparkStudy é um wrapper da classe ~optuna.study.Study para incorporar Optuna ao Spark por meio do experimento MLflow.

Nome do parâmetro de classe Tipo Description
study_name str Nome do estudo
storage mlflow.optuna.MlflowStorage Classe de armazenamento baseada em MLflow
sampler samplers.BaseSampler Um objeto amostrador que implementa o algoritmo de segundo plano para sugestão de valor. optuna.samplers.TPESampler é usado
como o padrão.
pruner float Um objeto aparador que decide a interrupção antecipada de testes não promissores. optuna.pruners.MedianPruner é usado
como o padrão.