Optimización de hiperparámetros con Optuna
Optuna es una biblioteca de Python de código abierto para la optimización de hiperparámetros. Optuna se usa ampliamente para el ajuste eficaz y flexible de hiperparámetros. Siga estos pasos para usarla al entrenar un modelo:
- Defina una función objetivo para entrenar y evaluar un modelo.
- Cree un estudio optuna para administrar el proceso de optimización.
- Ejecute la optimización optuna para buscar los mejores hiperparámetros.
Definición de una función objetivo
Optuna funciona llamando iterativamente a una función objetivo que devuelve un valor numérico que se va a minimizar, este es el destino de optimización. Debe encapsular la lógica de entrenamiento y evaluación del modelo en una función que:
- Acepta un parámetro (normalmente un
trialobjeto) que se usa para sugerir valores de hiperparámetros. - Entrena un modelo mediante los valores de hiperparámetros sugeridos.
- Evalúe el modelo en función de una métrica de destino para el rendimiento predictivo.
- Devuelve un valor numérico que refleja la métrica de rendimiento, de modo que la mejora del rendimiento del modelo reduce el valor devuelto.
Por ejemplo, la siguiente función entrena un modelo de aprendizaje automático mediante el algoritmo LogisticRegression de la biblioteca MLlib de Spark, con hiperparámetros sugeridos por 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
En este ejemplo, el parámetro de prueba es un objeto Optuna que se usa para sugerir valores para los hiperparámetros de iteraciones y regularización . Estos valores se asignan a los parámetros maxIter y regParam del algoritmo de regresión logística. La función evalúa la precisión del modelo entrenado y devuelve su valor negativo, de modo que Optuna maximizará la precisión minimizando el valor devuelto.
Definir el espacio de búsqueda de hiperparámetros
Cada vez que se llama a la función objetivo, requiere que se pruebe un parámetro que contenga los valores de hiperparámetros. Para explorar diferentes combinaciones de valores, debe definir un espacio de búsqueda para que Optuna muestree desde durante cada prueba.
Optuna proporciona métodos en el trial objeto para sugerir valores para cada hiperparámetros, entre los que se incluyen:
-
trial.suggest_int(name, low, high): sugiere un valor entero entrelowyhigh(inclusivo). -
trial.suggest_float(name, low, high): sugiere un valor de punto flotante entrelowyhigh. -
trial.suggest_categorical(name, choices): sugiere un valor de una lista de opciones de categorías.
Sugerencia
Para obtener la lista completa de métodos de sugerencia, consulte la documentación de Optuna.
En el ejemplo anterior, el espacio de búsqueda se define directamente en la objective función mediante el trial objeto :
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 ...
Este enfoque permite a Optuna muestrear dinámicamente los valores de hiperparámetros para cada prueba, lo que hace que el espacio de búsqueda sea flexible y fácil de modificar.
Especificación del algoritmo de búsqueda
Optuna usa un sampler para seleccionar valores de hiperparámetros en el espacio de búsqueda y optimizar la función objetivo. El sampler más usado es el Estimador de Parzen estructurado por árbol (TPE), que es un algoritmo de optimización bayesiano que selecciona de forma adaptable la nueva configuración de hiperparámetros en función de los resultados anteriores.
Puede especificar el muestreador al crear un estudio optuna. Por ejemplo, para usar el muestreador de TPE:
import optuna
sampler = optuna.samplers.TPESampler()
study = optuna.create_study(direction="minimize", sampler=sampler)
Optuna también admite otros muestreadores, como la búsqueda optuna.samplers.RandomSampleraleatoria. Para la mayoría de los casos de uso, se recomienda el ejemplo de TPE predeterminado.
Ejecución de la optimización de Optuna
Por último, para ejecutar la optimización, use el método study.optimize , que llama repetidamente a la función objetivo mediante combinaciones de hiperparámetros del espacio de búsqueda basado en el algoritmo de búsqueda. El objetivo es minimizar el valor devuelto por la función objetivo (y, por tanto, optimizar el rendimiento del modelo).
En el código de ejemplo siguiente se usa el método study.optimize para llamar a la función objetivo definida anteriormente. La función se evalúa hasta 100 veces antes de que el estudio devuelva la combinación de valor de parámetro de mejor rendimiento que se encontró.
study.optimize(objective, n_trials=100)
print("Best param values: ", study.best_params)
La salida del código anterior es similar al ejemplo siguiente.
Best param values: {'Iterations': 6, 'Regularization': 0.5461699702338606}