Оптимизация гиперпараметров с помощью Optuna

Завершено

Optuna — это библиотека Python с открытым кодом для оптимизации гиперпараметров. Optuna широко используется для эффективной и гибкой настройки гиперпараметров. Чтобы использовать его при обучении модели, выполните следующие действия.

  1. Определите целевую функцию для обучения и оценки модели.
  2. Создайте исследование Optuna для управления процессом оптимизации.
  3. Выполните оптимизацию Optuna, чтобы найти лучшие гиперпараметры.

Определение целевой функции

Optuna работает путем итеративного вызова целевой функции, которая возвращает числовое значение, которое будет свернуто, это цель оптимизации. Необходимо инкапсулировать логику обучения и оценки модели в функции, которая:

  • Принимает параметр (обычно объект), используемый trial для предложения значений гиперпараметров.
  • Обучает модель с помощью предлагаемых значений гиперпараметров.
  • Оценивает модель на основе целевой метрики для прогнозной производительности.
  • Возвращает числовое значение, которое отражает метрику производительности, таким образом, что повышение производительности модели снижает возвращаемое значение.

Например, следующая функция обучает модель машинного обучения с помощью алгоритма LogisticRegression из библиотеки Spark MLlib с гиперпараметрами, предлагаемыми 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

В этом примере пробный параметр — это объект Optuna, используемый для предложения значений гиперпараметров итерации и нормализации . Эти значения назначаются параметрам maxIter и regParam алгоритма логистической регрессии. Функция оценивает точность обученной модели и возвращает отрицательное значение, чтобы Optuna максимально повысить точность, свести к минимуму возвращаемое значение.

Определение пространства поиска гиперпараметров

Каждый раз при вызове целевой функции требуется параметр, содержащий значения гиперпараметра. Чтобы изучить различные сочетания значений, необходимо определить пространство поиска для Optuna для выборки из каждой пробной версии.

Optuna предоставляет методы объекта для предложения значений trial для каждого гиперпараметра, в том числе:

  • trial.suggest_int(name, low, high): предлагает целочисленное значение между low и high (инклюзивным).
  • trial.suggest_float(name, low, high): предлагает значение с плавающей запятой между low и high.
  • trial.suggest_categorical(name, choices): предлагает значение из списка категориальных вариантов.

Подсказка

Полный список методов предложения см. в документации по Optuna.

В предыдущем примере пространство поиска определяется непосредственно в objective функции с помощью trial объекта:

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 ...

Этот подход позволяет Optuna динамически образец значений гиперпараметров для каждой пробной версии, что позволяет гибко и легко изменять пространство поиска.

Указание алгоритма поиска

Optuna использует образец для выбора значений гиперпараметров из пространства поиска и оптимизации целевой функции. Наиболее часто используемый пример — это структурированный деревом оценщик Парзен (TPE), который является алгоритмом оптимизации Байеса, который адаптивно выбирает новые параметры гиперпараметров на основе предыдущих результатов.

При создании исследования Optuna можно указать образец. Например, чтобы использовать пример TPE:

import optuna

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

Optuna также поддерживает другие примеры, такие как случайный поиск optuna.samplers.RandomSampler. В большинстве случаев рекомендуется использовать пример TPE по умолчанию.

Запуск оптимизации Optuna

Наконец, чтобы выполнить оптимизацию, используйте метод study.optimize , который неоднократно вызывает целевую функцию с помощью сочетаний гиперпараметров из пространства поиска на основе алгоритма поиска. Цель заключается в том, чтобы свести к минимуму значение, возвращаемое целевой функцией (и, следовательно, оптимизировать производительность модели).

В следующем примере кода используется метод study.optimize для вызова целевой функции, определенной ранее. Функция вычисляется до 100 раз, прежде чем исследование возвращает оптимальное сочетание значений параметров, которое было найдено.

study.optimize(objective, n_trials=100)

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

Выходные данные из предыдущего кода выглядят примерно так, как показано в следующем примере.

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