• Saltar a la navegación principal
  • Saltar al contenido principal
Logo Codificando Bits

Codificando Bits

  • Academia
    • Rutas
    • Cursos
    • Proyectos
    • Tutoriales
  • Acceder
  • Suscribirse

Afinación de hiper-parámetros con Optuna

La afinación de hiper-parámetros es una de las fases esenciales al momento de construir un modelo de Machine Learning y consiste en encontrar el conjunto de hiper-parámetros que genere el mejor desempeño posible del modelo.

Así que en este tutorial veremos cómo usar la librería Optuna de Python para realizar la afinación de hiper-parámetros de un modelo de Machine Learning usando tres diferentes métodos: la búsqueda Bayesiana, la búsqueda aleatoria y la búsqueda exhaustiva.

Y recuerda que si estás suscrito a la Academia Online puedes acceder al enlace de descarga del set de datos y el código fuente de este proyecto (que se encuentran al final de este tutorial).

¿Qué son los hiper-parámetros?

En un artículo anterior vimos en detalle de qué son los parámetros y los hiper-parámetros de un modelo de Machine Learning.

Sin embargo, para los propósitos de este tutorial, podemos decir que los hiper-parámetros son variables externas al modelo que debemos definir manualmente al momento de programar el algoritmo de entrenamiento.

Así, el número de iteraciones o la tasa de aprendizaje definidas al momento de entrenar una Red Neuronal, son ejemplos de hiper-parámetros. Otro ejemplo es la profundidad o el número de hojas de un árbol de decisión.

Y debemos tener en cuenta que dependiendo de la escogencia que hagamos de estos hiper-parámetros tendremos un mejor o peor desempeño en nuestro modelo.

Es por ello que esta selección de hiper-parámetros no es arbitraria y por el contrario debe seguir un proceso sistemático, que se conoce precisamente como afinación de hiper-parámetros. Veamos en qué consiste este proceso.

¿Qué es la afinación de hiper-parámetros?

La afinación es un procedimiento que nos permite encontrar la combinación de hiper-parámetros del modelo que arroja las mejores predicciones posibles.

Por ejemplo, volvamos al caso del árbol de decisión y supongamos que queremos afinar los hiper-parámetros «profundidad» y «número de hojas». Para lograr esto deberíamos llevar a cabo el siguiente procedimiento de afinación:

  1. Definir los posibles valores de cada hiper-parámetro. Por ejemplo:
    • «profundidad»: 5, 10, 15
    • «número de hojas»: 10, 20, 30
  2. Por cada posible combinación de hiper-parámetros entrenar un modelo. Así, en el ejemplo anterior tendremos 9 posibles combinaciones y tendremos que entrenar 9 modelos diferentes:
    • «modelo 1»: será entrenado con la combinación «profundidad = 5», «número de hojas = 10»
    • «modelo 2»: será entrenado con la combinación «profundidad = 5» y «número de hojas = 20»
    • … y así sucesivamente para los 7 modelos restantes
  3. Por cada uno de los modelos entrenados se calcula su desempeño y se almacena este valor. En el caso anterior, si se trata de árboles de clasificación, podemos medir su desempeño usando la exactitud, así que calcularemos y almacenaremos 9 diferentes valores de exactitud.
  4. Al final del proceso el mejor conjunto de hiper-parámetros será aquel que permita obtener el modelo con el mejor desempeño.

Estrategias para la afinación de hiper-parámetros

Dependiendo de la cantidad de hiper-parámetros a afinar y de todas las posibles combinaciones que tengamos, el tiempo de afinación puede requerir unas pocas iteraciones o puede resultar siendo muy prolongado.

Es por eso que en esencia existen tres estrategias para realizar esta afinación, dependiendo de cómo definamos las posibles combinaciones de hiperparámetros.

Búsqueda exhaustiva (o grid search)

En esta primera estrategia lo que se hace es entrenar un modelo por cada posible combinación de hiper-parámetros.

Aunque es la opción de afinación que idealmente deberíamos usar, su gran desventaja es que cuando tenemos modelos demasiado grandes o un número elevado de combinaciones de hiper-parámetros, puede ser requerido un elevado tiempo de cómputo y esto limita el uso de este enfoque.

Búsqueda aleatoria (o random search)

En este enfoque de afinación lo que se hace es seleccionar aleatoriamente una porción del total de combinaciones de hiper-parámetros y entrenar únicamente el número correspondiente de modelos.

La ventaja de este método es que no se prueban todas las posibles combinaciones (como en la búsqueda exhaustiva) pero la desventaja es que las combinaciones elegidas aleatoriamente pueden no resultar siendo las mejores en términos del desempeño del modelo afinado.

Búsqueda Bayesiana

En este caso lo que se hace es usar un método probabilístico (basado en probabilidad bayesiana) que permite modelar la relación existente entre los hiper-parámetros y el desempeño del modelo.

De esta forma, en lugar de probar todas las posibles combinaciones (como en grid search) o una porción aleatoria de las mismas (como en random search) lo que hace este método probabilístico es predecir cuáles son las combinaciones de hiper-parámetros que tienen mayor probabilidad de arrojar mejores desempeños y se prueban únicamente dichas combinaciones.

Este método es mucho más eficiente que los dos métodos anteriores, computacionalmente hablando, y de hecho es uno de los más usados al momento de afinar modelos de Machine y Deep Learning.

¿Qué es Optuna?

Optuna es una librería de Python diseñada específicamente para realizar la afinación de hiper-parámetros de diferentes modelos de Machine y Deep Learning.

Entre sus principales características están:

  • El hecho de contar con una interfaz de uso muy sencilla: como veremos en este tutorial, con muy pocas líneas de código se puede realizar la afinación de hiper-parámetros
  • La posibilidad de implementar de diferentes métodos de afinación, incluyendo grid search, random search y búsqueda Bayesiana
  • Que es una librería compatible con modelos implementados en múltiples librerías (como Scikit-Learn, PyTorch, Keras y TensorFlow), entre otras

En este tutorial veremos una de estas integraciones, específicamente con la librería Scikit-Learn.

El problema a resolver

El objetivo de este tutorial es afinar un sencillo modelo de clasificación (árbol de decisión) que prediga si una persona tendrá o no una enfermedad cardiaca teniendo en cuenta diferentes variables fisiológicas.

El set de datos

El set de datos que usaremos en este tutorial contiene un total de 918 registros de personas con o sin enfermedad cardiaca.

Por cada persona se ha recolectado información sobre las siguientes variables fisiológicas (las columnas del set de datos):

  • Edad: la edad en años de la persona (variable numérica)
  • Sexo: masculino o femenino (variable categórica)
  • tipo_dolor: indica si la persona presenta algún tipo dolor en la zona del pecho (variable categórica)
  • presion_reposo: la presión sistólica en reposo (variable numérica)
  • colesterol: el nivel total de colesterol en sangre (variable numérica)
  • nivel_azucar_ayunas: el nivel de azúcar en sangre en ayunas (variables numérica)
  • ecg_reposo: las características del electrocardiograma en reposo (variable categórica)
  • frec_card_max: la frecuencia cardiaca máxima observada en un cierto periodo de tiempo (variable numérica)
  • angina_ejercicio: si la persona presenta angina (o dolor) de pecho tras llevar a cabo una actividad física exigente (variable categórica)
  • st: valor pico observado en el complejo ST del electrocardiograma (variable categórica)
  • pendiente_st: tipo de inclinación observada en la curva ST del electrocardiograma (variable categórica)
  • enf_cardiaca: si la persona tiene (1) o no (0) enfermedad cardiaca. Esta es la variable a predecir

Comencemos realizando la lectura del set de datos con ayuda de la librería Pandas:

Contenido exclusivo para suscriptores

Si eres suscriptor accede en este enlace ó suscríbete a la Academia Online y accede a todo el contenido (lecciones en video, código fuente, sets de datos y descargas) de todos los cursos, proyectos y tutoriales.

Conclusión

Muy bien, acabamos de ver un tutorial completo de afinación de hiper-parámetros de un modelo de Scikit-Learn haciendo uso de la librería Optuna e implementando los tres métodos de afinación más usados comúnmente: la búsqueda Bayesiana, la búsqueda aleatoria y la búsqueda exhaustiva.

Y como vimos realmente el procedimiento es muy sencillo: primero creamos una función objetivo (que contendrá el rango de hiper-parámetros a usar, el código para la creación del modelo y el código para su validación). Posteriormente creamos un «estudio» de Optuna en donde especificaremos el método de afinación a usar (a través del argumento «sampler») y finalmente ejecutamos el método «optimize» del estudio lo que permitirá realizar la afinación del modelo.

Y una vez afinado el modelo podemos extraer la mejor combinación de hiper-parámetros y entrenar el modelo final con estos hiper-parámetros afinados para así usar el modelo en la generación de predicciones a partir de datos nuevos.

Recuerda que si eres suscriptor me puedes contactar a través de la Intranet (sección «Soporte») para aclarar las dudas que tengas de este tutorial.

© Codificando Bits, LLC | Blog | Contacto | Servicios | Acerca de | Políticas

¿Has olvidado la contraseña?
¿Has perdido tu contraseña? Por favor, introduce tu nombre de usuario o dirección de correo electrónico. Recibirás por correo electrónico un enlace para crear una nueva contraseña.
body::-webkit-scrollbar { width: 7px; } body::-webkit-scrollbar-track { border-radius: 10px; background: #f0f0f0; } body::-webkit-scrollbar-thumb { border-radius: 50px; background: #dfdbdb }