Optimización de Hiperparámetros: Por qué dejarla al azar es un error y cómo la ataco yo

Optimización de Hiperparámetros: Por qué dejarla al azar es un error y cómo la ataco yo

Publicado el

Si alguna vez has entrenado un modelo de Machine Learning y has sentido que le faltaba ‘algo’ o que su rendimiento era inconsistente, es probable que la respuesta no estuviera en el algoritmo en sí, sino en los dichosos hiperparámetros. En mi experiencia, muchos desarrolladores tratan la optimización de hiperparámetros como un arte místico o, peor aún, la dejan completamente al azar. Y eso, amigos míos, es un crimen.

Recuerdo mis primeras incursiones en ML. Entrenaba un modelo, obtenía una métrica decente, y pensaba ‘listo’. Pero luego lo probaba con datos nuevos y se desmoronaba. Era frustrante. No entendía por qué, si mi algoritmo era el ‘correcto’. La clave estaba en que cada modelo tiene parámetros que aprende de los datos (pesos en una red neuronal, splits en un árbol), pero también tiene hiperparámetros que nosotros le damos antes de que empiece a aprender (tasa de aprendizaje, número de capas, profundidad máxima de un árbol, la fuerza de la regularización). Estos últimos definen la ‘personalidad’ del modelo, cómo de flexible o estricto será. Elegirlos mal puede llevarte directamente a problemas como el overfitting y underfitting.

Deja de lado el Grid Search ingenuo

La tentación es el Grid Search exhaustivo, probando cada combinación de valores predefinidos. Parece lógico, ¿verdad? Pero es lento, computacionalmente caro y, para espacios de búsqueda grandes, poco eficiente. Es como buscar una aguja en un pajar probando cada brizna de paja en orden. Yo lo usé, sufrí, y ahora lo evito a toda costa, salvo para rangos muy pequeños y muy bien definidos donde sé que no hay sorpresas.

Mi camino: Random Search y Optimización Bayesiana

Mi recomendación es empezar siempre con Random Search. Lo sé, suena contraintuitivo: ¿aleatorio es mejor que exhaustivo? Sí. Estudios han demostrado que Random Search es más eficiente que Grid Search en muchos casos, especialmente cuando solo unos pocos hiperparámetros importan de verdad. En lugar de quemar ciclos de CPU en combinaciones de hiperparámetros poco relevantes, Random Search tiene más posibilidades de ‘tropezar’ con una buena combinación. Scikit-learn tiene RandomizedSearchCV que es un buen punto de partida para experimentar con esto.

Pero donde la cosa se pone seria, es con la optimización Bayesiana. Aquí es donde herramientas como Optuna o Hyperopt entran en juego. Estos algoritmos no buscan ciegamente; usan los resultados de las pruebas anteriores para decidir dónde probar a continuación. Es como si el algoritmo aprendiera a encontrar los mejores hiperparámetros. Para mí, Optuna ha sido un cambio de juego. Me permite definir espacios de búsqueda complejos, soporta diferentes tipos de estudios (por ejemplo, TPESampler es fantástico para problemas complejos) y lo más importante, me ahorra horas y horas de cómputo inútil. Esto es especialmente útil cuando estamos tratando con modelos complejos o grandes datasets.

Cuando configuro un estudio de Optuna, siempre pienso en el balance entre exploración y explotación. Quiero que pruebe muchas cosas al principio (exploración), pero que luego se centre en las áreas prometedoras (explotación). También es crucial definir buenas métricas de evaluación para guiar la optimización. No se trata solo de la accuracy; a veces queremos f1-score o AUC dependiendo del problema.

Errores que he cometido (y que tú deberías evitar)

Algunos errores que veo a menudo (y que yo mismo cometí más de una vez):

  • No usar validación cruzada: Esto es fundamental. Si optimizas hiperparámetros solo con un split de entrenamiento/validación, corres el riesgo de ajustarlos a ese split particular. La validación cruzada te da una estimación mucho más robusta del rendimiento de tu modelo.
  • Rango de búsqueda limitado: A veces somos demasiado conservadores. Si empiezas con un rango, por ejemplo, para una tasa de aprendizaje, y tus mejores resultados están en los límites de ese rango, expándelo. Podrías estar perdiéndote de algo importante.
  • Optimizar demasiados hiperparámetros a la vez: Empieza con los que tienen más impacto. La tasa de aprendizaje, el tamaño de los lotes (batch size), la fuerza de la regularización. Una vez que tengas un buen punto de partida, puedes refinar los menos importantes.
  • No guardar los resultados: Guarda siempre los hiperparámetros de cada ‘trial’ y su rendimiento. Esto es oro para depurar y entender por qué funciona o no funciona algo. Además, te permite reanudar estudios o comparar diferentes configuraciones.

Mi veredicto

La optimización de hiperparámetros no es un lujo, es una necesidad si quieres que tus modelos de Machine Learning sean realmente buenos. No se trata de adivinar, ni de tener la mejor GPU del mundo (aunque ayuda). Se trata de ser estratégico, de usar las herramientas adecuadas y de entender que cada hora que inviertes en una buena estrategia de optimización, te ahorra diez en frustración y modelos subóptimos. Deja de lado el for loop manual para probar learning_rate = 0.001, 0.01, 0.1 y adéntrate en algo más robusto. Tus modelos (y tu cordura) te lo agradecerán.