Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
A versão de código aberto do Hyperopt não está mais sendo mantida.
O Hyperopt não está incluído no Databricks Runtime para Machine Learning após o 16.4 LTS ML. O Azure Databricks recomenda usar Optuna para otimização de nó único ou RayTune para uma experiência semelhante à funcionalidade de ajuste de hiperparâmetro distribuído do Hyperopt obsoleto. Saiba mais sobre como usar o RayTune no Azure Databricks.
Este notebook de exemplo mostra como dimensionar o ajuste de hiperparâmetros em uma única máquina para um cluster do Azure Databricks usando o Hyperopt com SparkTrials. Ajustando um classificador SVM do scikit-learn no conjunto de dados Iris, primeiro você cria um fluxo de trabalho de máquina fmin() única e, em seguida, paraleliza-o entre os nós do Spark com o MLflow acompanhando automaticamente cada teste.
Importar pacotes necessários e carregar conjunto de dados
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
from hyperopt import fmin, tpe, hp, SparkTrials, STATUS_OK, Trials
# If you are running Databricks Runtime for Machine Learning, `mlflow` is already installed and you can skip the following line.
import mlflow
# Load the iris dataset from scikit-learn
iris = iris = load_iris()
X = iris.data
y = iris.target
Parte 1. Fluxo de trabalho do Hyperopt de computador único
Estas são as etapas em um fluxo de trabalho do Hyperopt:
- Defina uma função a ser minimizada.
- Defina um espaço de pesquisa sobre hiperparâmetros.
- Selecione um algoritmo de pesquisa.
- Execute o algoritmo de ajuste com o Hyperopt
fmin().
Para obter mais informações, consulte a documentação do Hyperopt.
Definir uma função para minimizar
Neste exemplo, usamos um classificador de computador vetor de suporte. O objetivo é encontrar o melhor valor para o parâmetro Cde regularização.
A maior parte do código para um fluxo de trabalho do Hyperopt está na função objetiva. Este exemplo usa o classificador de vetor de suporte do scikit-learn.
Se o cluster usar o Databricks Runtime 11.3 ML, edite o classificador de vetor de suporte para usar um argumento posicional clf = SVC(C).
def objective(C):
# Create a support vector classifier model
clf = SVC(C=C)
# Use the cross-validation accuracy to compare the models' performance
accuracy = cross_val_score(clf, X, y).mean()
# Hyperopt tries to minimize the objective function. A higher accuracy value means a better model, so you must return the negative accuracy.
return {'loss': -accuracy, 'status': STATUS_OK}
Definir o espaço de pesquisa sobre hiperparâmetros
Consulte os documentos do Hyperopt para obter detalhes sobre como definir um espaço de pesquisa e expressões de parâmetro.
search_space = hp.lognormal('C', 0, 1.0)
Selecionar um algoritmo de pesquisa
As duas principais opções são:
-
hyperopt.tpe.suggest: Árvore de Estimativas do Parzen, uma abordagem bayesiana que seleciona de forma iterativa e adaptável novas configurações de hiperparâmetro a serem exploradas com base nos resultados passados -
hyperopt.rand.suggest: pesquisa aleatória, uma abordagem não adaptativa que amostra o espaço de busca
algo=tpe.suggest
Executar o algoritmo de ajuste com o Hyperopt fmin()
Defina max_evals como o número máximo de pontos no espaço do hiperparâmetro para testar, ou seja, o número máximo de modelos a serem ajustados e avaliados.
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16)
# Print the best value found for C
print("Best value found: ", argmin)
Parte 2. Ajuste distribuído usando Apache Spark e MLflow
Para distribuir o ajuste, adicione mais um argumento a fmin(): uma Trials classe chamada SparkTrials.
SparkTrials usa dois argumentos opcionais:
-
parallelism: número de modelos a serem ajustados e avaliados simultaneamente. O padrão é o número de slots de tarefa do Spark disponíveis. -
timeout: tempo máximo (em segundos) quefmin()pode ser executado. O padrão é não ter um limite de tempo máximo.
Este exemplo usa a função de objetivo muito simples definida no Cmd 7. Nesse caso, a função é executada rapidamente e a sobrecarga de iniciar os trabalhos do Spark domina o tempo de cálculo, portanto, os cálculos para o caso distribuído levam mais tempo. Para problemas típicos do mundo real, a função objetiva é mais complexa e usar SparkTrails para distribuir os cálculos é mais rápido do que o ajuste de máquina única.
O acompanhamento automatizado do MLflow está habilitado por padrão. Para usá-lo, chame mlflow.start_run() antes de chamar fmin(), conforme mostrado no exemplo.
from hyperopt import SparkTrials
# To display the API documentation for the SparkTrials class, uncomment the following line.
# help(SparkTrials)
spark_trials = SparkTrials()
with mlflow.start_run():
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16,
trials=spark_trials)
# Print the best value found for C
print("Best value found: ", argmin)
Para exibir o experimento do MLflow associado ao bloco de anotações, clique no ícone Experimento na barra de contexto do bloco de anotações no canto superior direito. Lá, você pode visualizar todas as execuções. Para exibir execuções na interface do usuário do MLflow, clique no ícone à direita ao lado de Execuções de Experimento.
Para examinar o efeito do ajuste C:
- Selecione as execuções resultantes e clique em Comparar.
- No Gráfico de Dispersão, selecione C para eixo X e perda para o eixo Y.
Após a execução das ações na última célula do notebook, sua interface do usuário do MLflow deverá exibir: