Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga
Wersja biblioteki Hyperopt typu open source nie jest już utrzymywana.
Funkcja Hyperopt nie jest uwzględniona w środowisku Databricks Runtime for Machine Learning po 16.4 LTS ML. Usługa Azure Databricks zaleca użycie Optuna na potrzeby optymalizacji pojedynczego węzła lub RayTune w celu uzyskania podobnego doświadczenia do przestarzałej funkcjonalności rozproszonego dostrajania hiperparametrów przy użyciu Hyperopt. Dowiedz się więcej o korzystaniu z RayTune w usłudze Azure Databricks.
W tym przykładowym notesie pokazano, jak skalować dostrajanie hiperparametryczne pojedynczej maszyny do klastra Azure Databricks przy użyciu funkcji Hyperopt z SparkTrials. Dostrajasz klasyfikator SVM scikit-learn na zestawie danych Iris, najpierw tworząc przepływ pracy na pojedynczej maszynie fmin(), a następnie równoległy go pomiędzy pracownikami Spark, przy czym MLflow automatycznie śledzi każdą próbę.
Importowanie wymaganych pakietów i ładowanie zestawu danych
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
Część 1. Workflow Hyperopt na pojedynczej maszynie
Poniżej przedstawiono kroki przepływu pracy funkcji Hyperopt:
- Zdefiniuj funkcję w celu zminimalizowania.
- Zdefiniuj miejsce wyszukiwania na hiperparametrach.
- Wybierz algorytm wyszukiwania.
- Uruchom algorytm dostrajania za pomocą funkcji Hyperopt
fmin().
Aby uzyskać więcej informacji, zobacz dokumentację funkcji Hyperopt.
Definiowanie funkcji w celu zminimalizowania
W tym przykładzie używamy klasyfikatora maszyn wektorów nośnych. Celem jest znalezienie najlepszej wartości parametru Cregularyzacji .
Większość kodu dla przepływu pracy Hyperopt znajduje się w funkcji celu. W tym przykładzie użyto klasyfikatora wektorów pomocniczych z pakietu scikit-learn.
Jeśli klaster używa środowiska Databricks Runtime 11.3 ML, zmodyfikuj klasyfikator wektorów nośnych, aby podjąć argument pozycyjny. 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}
Definiowanie miejsca wyszukiwania na hiperparametrach
Aby uzyskać szczegółowe informacje na temat definiowania przestrzeni wyszukiwania i wyrażeń parametrów, zobacz dokumentację funkcji Hyperopt .
search_space = hp.lognormal('C', 0, 1.0)
Wybieranie algorytmu wyszukiwania
Dwie główne opcje to:
-
hyperopt.tpe.suggest: Drzewo Estymatorów Parzena, podejście bayesowskie, które iteracyjnie i adaptacyjnie wybiera nowe hiperparametry do eksplorowania na podstawie poprzednich wyników -
hyperopt.rand.suggest: Wyszukiwanie losowe, podejście nieadaptacyjne, które próbkuje w przestrzeni wyszukiwania
algo=tpe.suggest
Uruchamianie algorytmu dostrajania za pomocą funkcji Hyperopt fmin()
Ustaw max_evals maksymalną liczbę punktów w przestrzeni hiperparametrów do przetestowania, czyli maksymalną liczbę modeli do dopasowania i oceny.
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16)
# Print the best value found for C
print("Best value found: ", argmin)
Część 2. Dostrajanie rozproszone przy użyciu platformy Apache Spark i platformy MLflow
Aby dystrybuować dostrajanie, dodaj jeszcze jeden argument do fmin()klasy o Trials nazwie SparkTrials.
SparkTrials Przyjmuje 2 argumenty opcjonalne:
-
parallelism: liczba modeli do jednoczesnego dopasowania i oceny. Wartość domyślna to liczba dostępnych miejsc zadań platformy Spark. -
timeout: maksymalny czas (w sekundach), przez który można uruchamiaćfmin(). Wartość domyślna nie jest maksymalnym limitem czasu.
W tym przykładzie użyto bardzo prostej funkcji celu zdefiniowanej w programie Cmd 7. W takim przypadku funkcja jest uruchamiana szybko, a obciążenie uruchamiania zadań platformy Spark dominuje w czasie obliczania, więc obliczenia dla przypadku rozproszonego zajmują więcej czasu. W przypadku typowych rzeczywistych problemów funkcja celu jest bardziej złożona, a użycie SparkTrails do dystrybucji obliczeń jest szybsze niż optymalizacja sprzętu na jednej maszynie.
Automatyczne śledzenie MLflow jest domyślnie włączone. Aby go użyć, wywołaj metodę mlflow.start_run() przed wywołaniem fmin() , jak pokazano w przykładzie.
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)
Aby wyświetlić eksperyment MLflow skojarzony z notesem, kliknij ikonę Eksperyment na pasku kontekstu notesu w prawym górnym rogu. W tym miejscu można obejrzeć wszystkie przebiegi. Aby wyświetlić przebiegi w interfejsie użytkownika platformy MLflow, kliknij ikonę po prawej stronie obok pozycji Przebiegi eksperymentów.
Aby zbadać efekt dostrajania C:
- Wybierz przebiegi wynikowe i kliknij Porównaj.
- Na wykresie punktowym wybierz pozycję C dla osi X i straty dla osi Y.
Po wykonaniu czynności w ostatniej komórce w notesie, powinien wyświetlić się interfejs użytkownika MLflow.
Przykładowy notatnik
Paralelizacja hiperparametryzacji w Hyperopt
Pobierz notatnik