Оптимизация гиперпараметров с помощью Hyperopt
Hyperopt — это библиотека Python открытый код для настройки гиперпараметров. Hyperopt устанавливается автоматически при создании кластера с вариантом машинного обучения среды выполнения Databricks. Чтобы использовать его при обучении модели, выполните следующие действия.
- Определите целевую функцию для обучения и оценки модели.
- Определите пространство поиска гиперпараметров.
- Укажите алгоритм поиска.
- Запустите функцию Hyperopt fmin , чтобы оптимизировать функцию обучения.
Определение целевой функции
Hyperopt работает путем итеративного вызова функции (часто называемой целевой функцией), которая возвращает числовое значение и настраивает параметры, передаваемые функции таким образом, чтобы возвращаемое значение было сведено к минимуму; подход, который обычно называется оптимизацией. Поэтому первое требование заключается в том, чтобы инкапсулировать логику обучения и оценки модели в функции, которая:
- Принимает параметр, содержащий список значений гиперпараметров.
- Обучает модель с помощью предоставленных значений гиперпараметра.
- Оценивает модель на основе целевой метрики для прогнозной производительности.
- Возвращает числовое значение, которое отражает метрику производительности, чтобы повысить производительность модели снижает возвращаемое значение.
Например, следующая функция обучает модель машинного обучения с помощью алгоритма LogisticRegression из библиотеки Spark MLlib.
def objective(params):
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from hyperopt import STATUS_OK
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]
# Train a model using the provided hyperparameter values
lr = LogisticRegression(labelCol="label", featuresCol="features",
maxIter=params['Iterations'],
regParam=params['Regularization'])
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)
# Hyperopt *minimizes* the function, so return *negative* accuracy.
return {'loss': -accuracy, 'status': STATUS_OK}
В этом примере параметр params — это словарь, содержащий значения для двух именованных значений: итерации и нормализации. Эти значения назначаются гиперпараметрам maxIter и regParam алгоритма логистической регрессии, используемого для обучения модели.
Затем функция вычисляет обученную модель для вычисления ее метрики точности , которая является значением от 0.0 до 1.0, указывая долю прогнозов, сделанных моделью, которая была правильной.
Наконец, функция возвращает значение, которое Hyperopt должен свести к минимуму, чтобы улучшить модель. В этом случае целевая метрика является точностью, для которой более высокое значение указывает на лучшую модель; поэтому функция возвращает отрицательное значение этого значения (поэтому чем выше точность, тем ниже возвращаемое значение).
Определение пространства поиска гиперпараметров
Каждый раз при вызове целевой функции требуется параметр, содержащий значения гиперпараметра. Чтобы попробовать все возможные сочетания значений, необходимо определить пространство поиска для Hyperopt, чтобы выбрать значения из каждой пробной версии.
Hyperopt предоставляет выражения, которые можно использовать для определения диапазона значений для каждого гиперпараметра, в том числе:
hp.choice(label, options)
возвращает один из элементовoptions
.hp.randint(label, upper)
возвращает случайное целое число в диапазоне [0, upper].hp.uniform(label, low, high)
возвращает значение, находящееся ровно междуlow
иhigh
.hp.normal(label, mu, sigma)
возвращает вещественное значение с нормальным распределением со среднимmu
и стандартным отклонениемsigma
.
Совет
Полный список выражений см. в документации по Hyperopt.
В следующем примере кода определяется пространство поиска для гиперпараметров, используемых в предыдущем примере:
from hyperopt import hp
search_space = {
'Iterations': hp.randint('Iterations', 10),
'Regularization': hp.uniform('Regularization', 0.0, 1.0)
}
Указание алгоритма поиска
Hyperopt использует алгоритм поиска для выбора значений гиперпараметров из пространства поиска и пытается оптимизировать целевую функцию. Существует два основных варианта использования примеров Hyperopt в пространстве поиска:
hyperopt.tpe.suggest
: дерево оценщиков Парзена (TPE), подход Байезиана, который адаптивно выбирает новые параметры гиперпараметра на основе прошлых результатов.hyperopt.rand.suggest
: случайный поиск, неадаптивный подход, который случайным образом выполняет выборку в пространстве поиска.
В следующем примере кода указывается алгоритм TPE.
from hyperopt import tpe
algo = tpe.suggest
Запуск функции Hyperopt fmin
Наконец, для выполнения запуска Hyperopt можно использовать функцию fmin , которая неоднократно вызывает целевую функцию с помощью сочетаний гиперпараметров из пространства поиска на основе алгоритма поиска. Целью функции fmin является минимизация значения, возвращаемого целевой функцией (и, следовательно, оптимизация производительности модели).
В следующем примере кода функция fmin используется для вызова целевой функции, определенной ранее. Используется пространство поиска и алгоритм, определенный в предыдущих примерах, и функция вычисляется до 100 раз до того, как функция fmin возвращает оптимальное сочетание значений параметров, которое было найдено.
from hyperopt import fmin
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=100)
print("Best param values: ", argmin)
Выходные данные из предыдущего кода выглядят примерно так, как показано в следующем примере.
Best param values: {'Iterations': 6, 'Regularization': 0.5461699702338606}