Modelos predictivos mediante optimización hiperparamétrica y Machine Learning

data science optimización paramétrica

El vino es una de las bebidas alcohólicas más consumidas del mundo. No es algo nuevo; existen referencias de que en el período Neolítico se dieron prácticas vitivinícolas. Después se fue extendiendo hasta tal punto de que en la cultura grecorromana existía un Dios del vino (Baco o Dionisio). Hoy por hoy, hay numerosas regiones a lo largo de nuestro planeta en las que se elaboran excelentes vinos.

Sin embargo, y a pesar de la larga tradición que hay alrededor del vino, siempre hay que tomar decisiones a la hora de producirlo. Pongámonos en la tesitura de que somos productores que queremos hacer un vino exquisito. Tendremos que elegir el tiempo de fermentación, el tiempo de maduración, la temperatura… Lo ideal sería probar todas las combinaciones posibles y ver el resultado, ¿no? Sin embargo, esta alternativa no es posible: tenemos restricciones de tiempo (hay vinos que tardan años en madurar) y, probablemente, tengamos restricciones presupuestarias.

Pero, ¿qué tiene que ver esto con el mundo de los datos?

Bien, acabamos de ver un ejemplo de caso de uso de optimización hiperparamétrica. En Machine Learning, nos encontramos con este problema constantemente. A la hora de generar un modelo predictivo (conocer la forma de hacer el mejor vino), necesitamos 3 cosas: los datos (la vid, las uvas), la función de coste (restricciones de tiempo, dinero, instalaciones), y los hiperparámetros (caracterizar esas restricciones, eligiendo sus límites).

Como nota aclaratoria, no confundir los parámetros con los hiperparámetros. La diferencia reside en que los parámetros se “aprenden” (de ahí el nombre de machine learning) mediante el ajuste matemático que subyace al modelo elegido junto con los datos (los coeficientes de una regresión, por ejemplo), mientras que los hiperparámetros no se pueden aprender en el proceso de ajuste, son propiedades del modelo que el científico de datos debe elegir para llegar a su objetivo. Es un proceso de prueba y error, poco intuitivo, dado que muchas veces nos encontramos con problemas con muchas dimensiones. Ejemplo de hiperparámetros:

  • Learning rate en la optimización de un gradiente descendente, por ejemplo.
  • Número de árboles en un random forest.
  • Número de capas en una red neuronal.

De la magia de la aleatoriedad…

Definamos formalmente el problema:

Nuestro vector óptimo de hiperparámetros proviene de minimizar el error generalizado F para nuestro sampleo x proveniente de una distribución subyacente Gx. Dicho error depende de la función de coste L, bajo un algoritmo de entrenamiento A optimizado para los hiperparámetros α y el subespacio de datos de entrenamiento xtrain. Resolviendo esta ecuación, llegamos a

Donde ψ es una función de respuesta que desconocemos. Para resolver esta ecuación, tendremos que evaluar las posibilidades del espacio Η de hiperparámetros hasta encontrar el vector óptimo de α.

El punto crítico es por lo tanto explorar este espacio de hiperparámetros. ¿Qué formas existen? ¿Son todas iguales de eficientes?

La intuición nos dice que tendríamos que hacer pruebas con cada una de las combinaciones posibles de hiperparámetros. Sin embargo, esta solución, llamada comúnmente Grid Search, es computacionalmente muy ineficiente, debido al problema de la dimensionalidad, es decir, el número de combinaciones posibles crece exponencialmente con el número de hiperparámetros. Al igual que el enólogo no tiene el tiempo suficiente para explorar todas las vías posibles de elaboración, nosotros, como científicos de datos, carecemos de capacidad computacional infinita.

Gráfica Grid Search. Fuente: Keepler.

Por otro lado, existen argumentos a favor del uso esta técnica:

  • Conoceríamos mejor la función de respuesta (conocemos mejor las sensibilidades de nuestro modelo a los hiperparámetros).
  • Paralelizar el proceso es trivial.
  • Es de fácil implementación.

Sin embargo, existe también otro tipo de búsqueda más rápida y eficiente, llamada Random Search. El motivo por el cual este algoritmo de búsqueda es mejor que el anterior, es que la función de respuesta es más sensible a cambios en algunas dimensiones que otras. Al explorar el espacio de combinaciones de manera aleatoria, estamos llegando a encontrar combinaciones que con una búsqueda uniforme (grid search) no lo haríamos, pues en una búsqueda uniforme los hiperparámetros se encuentran equitativamente distantes unos de otros. Con una búsqueda aleatoria, estamos cubriendo el espacio exploratorio más desigualmente, encontrando zonas donde con una búsqueda uniforme no encontraríamos. Si supiéramos a priori las zonas donde el modelo minimizara más el error, haríamos un grid search apropiado sobre esas zonas, pero como generalmente no lo sabemos, debemos explorar todo el espacio.

En la siguiente imagen se muestra este fenómeno con un experimento. Bajo un conjunto de datos generados aleatoriamente (pero con sentido estadístico), se ejecuta un modelo predictivo dos veces para cada dimensión de complejidad (primer experimento:10, segundo: 50), y se comparan los tiempos y el error. El número de computaciones que se ejecutan en cada búsqueda es exactamente la misma para poder medir la diferencia de tiempo de ejecución.

Experimento sobre modelos hiperparamétricos. Fuente: Keepler.

Como podemos observar, el tiempo es menor a medida que añadimos hiperparámetros al espacio, llegando en ocasiones a ser un 50% más rápido. Si bien con una dimensionalidad de 10, el primer experimento no fue aceptado por nuestra hipótesis, el resto de experimentos sí que lo hicieron. Cabe destacar que también la media del error es ligeramente menor (la distribución se encuentra más hacia la izquierda) en el random search. Por tanto, nunca desvirtuaremos nuestro estudio si utilizamos una búsqueda aleatoria, pero ¡sí ganaremos eficiencia!

…al poder del conocimiento

Existen otras técnicas muy potentes que hacen uso de la información generada en cada iteración de la búsqueda para saber hacia qué zona del espacio dirigirse, construyendo un modelo probabilístico sobre la función de coste. Este método se llama optimización Bayesiana, y lo deberíamos aplicar en situaciones en las que nuestro algoritmo de machine learning no tiene closed form, y se llega a su solución mediante una optimización generalmente costosa de evaluar.

Optimización Bayesiana. Fuente: Keepler.

Interpretemos este gráfico. Dada una función de utilidad Expected improvement,

En cada iteración hacemos lo siguiente:

  • Evaluamos la función de coste con los hiperparámetros.
  • Actualizamos nuestra “creencia” con un proceso gaussiano.
  • Dada nuestra nueva creencia podemos usar la función de utilidad para determinar unos nuevos hiperparámetros en zonas donde la incertidumbre (o desviación estándar) del proceso gaussiano sea menor. Es decir, obtenemos un nuevo mejor vector de hiperparámetros óptimos.
  • Volvemos al primer paso con los nuevos hiperparámetros.

Estamos construyendo un modelo probabilístico de F repetidamente hasta que nuestra función de utilidad no se puede maximizar más. Como vemos en el gráfico, la búsqueda bayesiana converge hacia la iteración 20 aproximadamente. Como es de esperar, tenemos mejores resultados, pues el error es menor.

Si has llegado hasta aquí, espero que este recap de métodos de optimización hiperparamétrica te sea de utilidad. Si te animas a probarlo o tienes alguna consulta, no dudes en dejarme un comentario.

Imagen: unsplash | jefferson santos

Nicolás Forteza

Data Scientist en Keepler. “Para crear productos basados en los datos, hay que realizar hipótesis y verificarlas en el mundo real. Al final, con entusiasmo y ayuda de las máquinas, se puede cambiar y mejorar el mundo en el que vivimos.”

Port Relacionados

¿Qué opinas?

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.