Optuna optymalizuj hiperparametry

Ukończone

Optuna to biblioteka języka Python typu open source do optymalizacji hiperparametrów. Optuna jest powszechnie używana do wydajnego i elastycznego dostrajania hiperparametrów. Aby użyć go podczas trenowania modelu, wykonaj następujące kroki:

  1. Definiowanie funkcji celu w celu trenowania i oceniania modelu.
  2. Utwórz badanie Optuna w celu zarządzania procesem optymalizacji.
  3. Uruchom optymalizację Optuna, aby wyszukać najlepsze hiperparametry.

Definiowanie funkcji objective

Optuna działa iteracyjnie wywołując funkcję celu , która zwraca wartość liczbową do zminimalizowania. Jest to cel optymalizacji. Musisz hermetyzować logikę trenowania i oceny modelu w funkcji, która:

  • Akceptuje parametr (zazwyczaj trial obiekt) używany do sugerowania wartości hiperparametrów.
  • Trenuje model przy użyciu sugerowanych wartości hiperparametrów.
  • Ocenia model na podstawie docelowej metryki pod kątem wydajności predykcyjnej.
  • Zwraca wartość liczbową, która odzwierciedla metrykę wydajności, tak aby poprawa wydajności modelu obniżyła wartość zwracaną.

Na przykład następująca funkcja szkoli model uczenia maszynowego przy użyciu algorytmu LogisticsRegression z biblioteki MLlib platformy Spark z hiperparametrami sugerowanymi przez Optuna:

def objective(trial):
  from pyspark.ml.classification import LogisticRegression
  from pyspark.ml.evaluation import MulticlassClassificationEvaluator

  data_df = get_training_data()  # This is just an example!
  splits = data_df.randomSplit([0.7, 0.3])
  training_df = splits[0]
  validation_df = splits[1]

  # Suggest hyperparameters using Optuna's trial object
  max_iter = trial.suggest_int('Iterations', 1, 10)
  reg_param = trial.suggest_float('Regularization', 0.0, 1.0)

  # Train a model using the suggested hyperparameters
  lr = LogisticRegression(labelCol="label", featuresCol="features",
              maxIter=max_iter,
              regParam=reg_param)
  model = lr.fit(training_df)

  # Evaluate the model
  predictions = model.transform(validation_df)
  eval = MulticlassClassificationEvaluator(labelCol="label",
                       predictionCol="prediction",
                       metricName="accuracy")
  accuracy = eval.evaluate(predictions)

  # Optuna minimizes the objective, so return negative accuracy
  return -accuracy

W tym przykładzie parametr próbny jest obiektem Optuna używanym do sugerowania wartości hiperparametrów iteracji i regularyzacji . Te wartości są przypisywane do parametrów maxIter i regParam algorytmu regresji logistycznej. Funkcja ocenia dokładność wytrenowanego modelu i zwraca jego wartość ujemną, dzięki czemu Optuna zmaksymalizuje dokładność, minimalizując zwracaną wartość.

Definiowanie przestrzeni wyszukiwania hiperparametrów

Za każdym razem, gdy wywoływana jest funkcja objective, wymaga ona parametru zawierającego wartości hiperparametrów, które mają być wypróbowane. Aby zapoznać się z różnymi kombinacjami wartości, należy zdefiniować przestrzeń wyszukiwania optuna do próbkowania z poziomu każdej wersji próbnej.

Optuna udostępnia metody na trial obiekcie sugerujące wartości dla każdego hiperparametru, w tym:

  • trial.suggest_int(name, low, high): Sugeruje wartość całkowitą między low i high (włącznie).
  • trial.suggest_float(name, low, high): Sugeruje wartość zmiennoprzecinkowa między low i high.
  • trial.suggest_categorical(name, choices): sugeruje wartość z listy opcji kategorii.

Wskazówka

Pełną listę metod sugestii można znaleźć w dokumentacji optuna.

W poprzednim przykładzie przestrzeń wyszukiwania jest definiowana bezpośrednio w objective funkcji przy użyciu trial obiektu :

def objective(trial):
  max_iter = trial.suggest_int('Iterations', 1, 10)
  reg_param = trial.suggest_float('Regularization', 0.0, 1.0)
  # ... rest of the function ...

Takie podejście umożliwia optuna dynamiczne próbkowania wartości hiperparametrów dla każdej wersji próbnej, dzięki czemu przestrzeń wyszukiwania jest elastyczna i łatwa do zmodyfikowania.

Określanie algorytmu wyszukiwania

Optuna używa próbkatora do wybierania wartości hiperparametrów w przestrzeni wyszukiwania i optymalizowania funkcji celu. Najczęściej używanym próbkatorem jest narzędzie do szacowania Parzen ze strukturą drzewa (TPE), czyli algorytm optymalizacji bayesowskiej, który adaptacyjnie wybiera nowe ustawienia hiperparametrów na podstawie poprzednich wyników.

Próbkator można określić podczas tworzenia badania Optuna. Aby na przykład użyć przykładowego modułu TPE:

import optuna

sampler = optuna.samplers.TPESampler()
study = optuna.create_study(direction="minimize", sampler=sampler)

Optuna obsługuje również inne próbkatory, takie jak wyszukiwanie optuna.samplers.RandomSamplerlosowe. W większości przypadków użycia zaleca się użycie domyślnego przykładu TPE.

Uruchamianie optymalizacji Optuna

Na koniec, aby wykonać optymalizację, użyj metody study.optimize , która wielokrotnie wywołuje funkcję objective przy użyciu kombinacji hiperparametrów z przestrzeni wyszukiwania na podstawie algorytmu wyszukiwania. Celem jest zminimalizowanie wartości zwracanej przez funkcję celu (i w związku z tym zoptymalizować wydajność modelu).

Poniższy przykładowy kod używa metody study.optimize do wywołania wcześniej zdefiniowanej funkcji objective . Funkcja jest obliczana do 100 razy, zanim badanie zwróci kombinację wartości parametru o najlepszej wydajności, która została znaleziona.

study.optimize(objective, n_trials=100)

print("Best param values: ", study.best_params)

Dane wyjściowe z poprzedniego kodu wyglądają podobnie jak w poniższym przykładzie.

Best param values:  {'Iterations': 6, 'Regularization': 0.5461699702338606}