Saltar al contenido

lección 3

Ajustar los parámetros sin engañarte

La búsqueda en malla de los mandos del modelo, hecha dentro de la validación cruzada para no contaminar nunca el montón de prueba.

⏱ 50 min

Un bosque de 50 árboles o de 500. Una profundidad de 3 o de 20. Un ritmo de aprendizaje de 0,01 o de 0,3. Todos esos números los has estado poniendo a ojo o dejando los de fábrica, y cada combinación da un modelo distinto, a veces muy distinto. Esos números que eliges tú, no los que el modelo aprende de los datos, se llaman hiperparámetros, y encontrar la combinación buena es su propia disciplina. La palabra asusta un poco, así que quédate con esta imagen: son los mandos de una máquina. El modelo aprende solo lo que hay dentro de la caja; tú ajustas los mandos de fuera.

La imagen de los mandos de una máquina es más que una metáfora bonita: captura por qué este trabajo es delicado. Una máquina compleja tiene mandos que interactúan entre sí, de modo que girar uno cambia el efecto de girar otro, y encontrar la combinación buena no es ajustar cada mando por su lado sino dar con el conjunto que funciona junto. Con los modelos pasa igual: la mejor profundidad depende de cuántos árboles tengas, el mejor ritmo de aprendizaje depende de cuántas rondas permitas. Por eso no basta con probar cada mando aislado y quedarte con lo mejor de cada uno; hay que probar combinaciones, que es justo lo que hace la búsqueda en malla. Y por eso, también, el número de combinaciones crece tan rápido en cuanto hay varios mandos en juego.

La diferencia es importante y conviene fijarla. Los coeficientes de una regresión, las preguntas de un árbol, los pesos de un modelo: eso lo calcula el algoritmo a partir de los datos cuando llamas a fit. No lo tocas tú. Los hiperparámetros son los de antes de fit: cuántos árboles quieres, hasta qué profundidad, con qué ritmo. El modelo no los deduce de los datos; se los das tú de entrada, y de ellos depende si el resultado generaliza o sobreajusta. Esta lección va de cómo elegirlos bien, y sobre todo de cómo elegirlos sin mentirte a ti mismo, que es la parte difícil.

La frontera que hay que tener clara: los hiperparámetros entran por fuera y los eliges tú; lo que sale (lo que el modelo aprende) lo calcula el algoritmo con los datos y no se toca a mano.

## La búsqueda en malla: probar combinaciones por sistema

La forma más directa de encontrar buenos hiperparámetros es probarlos. Decides qué valores quieres considerar para cada mando (por ejemplo, profundidad 3, 5 o 10; y número de árboles 50 o 150), y pruebas todas las combinaciones posibles. Tres profundidades por dos tamaños son seis combinaciones. Entrenas un modelo con cada una, mides cuál va mejor, y te quedas con la ganadora. Eso es la búsqueda en malla (en inglés grid search): la malla es la rejilla de todas las combinaciones, y la recorres entera.

Es sistemática y no deja nada sin probar dentro de lo que le pediste, pero crece deprisa: si añades un tercer mando con cuatro valores, las seis combinaciones se convierten en veinticuatro, y cada una exige entrenar un modelo. Por eso la malla se mantiene pequeña y bien pensada, con los pocos valores que de verdad crees que pueden marcar diferencia, en vez de barrer un rango enorme a ciegas.

Ese crecimiento tiene nombre informal, la explosión combinatoria, y conviene sentirlo con números para que no te pille. Dos mandos con tres valores cada uno son nueve combinaciones. Tres mandos con cuatro valores cada uno son sesenta y cuatro. Cuatro mandos con cinco valores son seiscientas veinticinco. Cada valor nuevo que añades no suma, multiplica, y como además cada combinación se entrena varias veces por la validación cruzada, el número de modelos a entrenar se dispara mucho antes de lo que la intuición sugiere. Es muy fácil montar, con buena intención, una malla que tardaría horas o días en completarse. La disciplina del oficio no es probarlo todo, es elegir con criterio los pocos valores que de verdad pueden mover el resultado y dejar fuera el resto.

Existe una alternativa a la malla que conviene que conozcas aunque aquí usemos la malla por ser la más clara: la búsqueda aleatoria. En lugar de probar todas las combinaciones de una rejilla, sortea un número fijo de combinaciones al azar dentro de los rangos que le das. Suena peor, pero a menudo encuentra una combinación casi tan buena en una fracción del tiempo, porque en la práctica solo unos pocos mandos importan de verdad y la aleatoria los explora sin malgastar esfuerzo en los que dan igual. Cuando la malla se te vaya de las manos por tamaño, acuérdate de que existe esta salida. La idea de fondo, buscar bien sin contaminar la prueba, es idéntica en las dos.

La malla es el producto de todos los valores que das: aquí 3 profundidades por 2 tamaños hacen 6 celdas, y la búsqueda entrena un modelo en cada una.

## El error que lo arruina todo: elegir mirando la prueba

Aquí llega el corazón de la lección, y conecta directamente con la honestidad que ya has aprendido a defender. Para elegir la mejor combinación necesitas medir cada una con algún dato. ¿Con cuál? La tentación es usar el montón de prueba, ese que apartaste para el final: pruebas las seis combinaciones, miras cuál acierta más en la prueba, y te quedas con ella. Parece razonable. Es un desastre.

El montón de prueba tiene un único trabajo: darte una estimación honesta de cómo se comportará el modelo con datos que nunca ha visto. En el momento en que lo usas para elegir entre varias opciones, deja de ser un dato nuevo. Lo has mirado, y lo que miras para decidir ya no puede juzgarte con imparcialidad. Es la misma fuga de datos que ya conoces, con otro disfraz: estás dejando que la prueba influya en el modelo que presentas. Al final tendrás una cifra bonita que no significa nada, porque la elegiste precisamente por ser bonita en ese conjunto concreto.

Esto cuesta de ver porque el error no da la cara en el momento. Cuando eliges la combinación que mejor acierta en la prueba, el número que obtienes es real: esa combinación acierta eso en ese conjunto. El problema es que ese conjunto concreto tiene sus propias casualidades, y al probar muchas combinaciones y quedarte con la que mejor las aprovecha, te estás llevando no solo la que mejor generaliza, sino la que mejor encaja con los accidentes de esa prueba particular. Es como lanzar diez monedas y quedarte con la que salió cara: no has encontrado una moneda mejor, has encontrado la que tuvo suerte esta vez. Con datos nuevos, esa suerte no se repite, y el modelo rinde por debajo de lo que su cifra prometía. Cuantas más combinaciones pruebas contra la prueba, más grande es el engaño.

La analogía del examen lo deja claro de una vez. El montón de prueba es el examen final, guardado en un sobre cerrado hasta el día de la evaluación. Si abres el sobre antes para decidir qué estudiar, el examen deja de medir lo que sabes y pasa a medir lo bien que has adaptado tu estudio a ese examen concreto. Puedes sacar un diez y no haber aprendido la materia. Para evitarlo, lo que haces es apartar el examen final y practicar con exámenes de otros años: eso es la validación cruzada, y es lo que viene ahora.

Si pruebas diez combinaciones en el montón de prueba y te quedas con la que más acierta ahí, la cifra que obtienes está inflada por pura suerte: entre diez tiradas, alguna sale alta aunque todas sean iguales de buenas. Luego, con datos de verdad nuevos, el modelo rinde menos de lo que prometiste. Es el error más caro de esta parte del oficio, y el más fácil de cometer sin darse cuenta.

## La solución: buscar dentro de la validación cruzada

La salida es la validación cruzada que ya sabes usar. En lugar de medir cada combinación contra la prueba, la mides dentro del propio montón de entrenamiento, partiéndolo en varios pliegues y rotando cuál hace de examen en cada vuelta. Así cada combinación recibe una nota estimada de forma honesta sin que la prueba haya intervenido en absoluto. Eliges la ganadora con esas notas, y solo entonces, una única vez y al final, mides esa ganadora contra la prueba intacta para saber qué cabe esperar de ella.

La idea encaja en una regla que no deberías romper nunca: la prueba se toca una sola vez, al final, para medir, jamás para decidir. Todo lo que implique elegir (qué modelo, qué hiperparámetros, qué variables) se hace con el entrenamiento y su validación cruzada. La prueba es el examen final a puerta cerrada; la validación cruzada son los exámenes de prueba que te haces en casa para decidir cómo estudiar.

Conviene recordar por qué la validación cruzada es mejor que apartar un simple trocito del entrenamiento para evaluar las combinaciones. Si solo apartas un pedazo, la nota de cada combinación depende de qué filas cayeron en ese pedazo, y con mala suerte un pedazo poco representativo te hace elegir mal. La validación cruzada reparte el entrenamiento en varios pliegues y rota cuál hace de examen, de modo que cada combinación se evalúa varias veces sobre trozos distintos y la nota final es el promedio. Ese promedio es mucho más estable y de fiar que una sola medición, y por eso es la forma estándar de puntuar combinaciones cuando buscas hiperparámetros. Es la misma validación cruzada que ya conoces, puesta ahora al servicio de elegir mandos.

Hay un matiz honesto que casi nadie cuenta y que te hará parecer más sensato de lo normal: incluso haciéndolo todo bien, la nota de la validación cruzada tiende a quedar un pelín por encima de lo que luego da la prueba. La razón es sutil: has elegido la combinación que mejor puntuó en esa validación concreta, así que de nuevo te llevas un poco de la suerte de esa validación. Es un sesgo pequeño y no es un error (has respetado la prueba), pero explica por qué la cifra final suele ser algo más modesta que la de la búsqueda. Saberlo te evita sorpresas y te permite comunicar la cifra buena, la de la prueba, sin inflar expectativas.

Toda la decisión ocurre dentro del entrenamiento. La prueba no participa en elegir: espera, y solo al final mide la ganadora para dar la cifra honesta.

## GridSearchCV: las dos cosas a la vez

La biblioteca scikit-learn empaqueta exactamente este procedimiento en una herramienta llamada GridSearchCV. El nombre lo dice todo: Grid por la búsqueda en malla, Search por buscar, y CV por cross-validation, validación cruzada. Le das el modelo, la malla de valores a probar y en cuántos pliegues partir, y hace las dos cosas por ti: recorre todas las combinaciones y evalúa cada una con validación cruzada dentro del entrenamiento. Al terminar, te dice cuál ganó y te deja un modelo ya reentrenado con esa combinación sobre todo el entrenamiento, listo para que lo midas contra la prueba.

Lo valioso de usar la herramienta en vez de montarlo a mano es que te protege del error de la sección anterior casi sin esfuerzo: si solo le das el montón de entrenamiento, es imposible que la prueba se cuele en la elección, porque la herramienta nunca la ve. Y cuando después llamas a predict con la prueba, estás midiendo por primera y única vez. La disciplina queda cosida en el código, no confiada a tu memoria.

Merece la pena mirar un detalle de GridSearchCV que la hace todavía más cómoda: cuando termina de buscar, no te deja solo con el nombre de la combinación ganadora, sino que reentrena un modelo con esa combinación usando todo el montón de entrenamiento de golpe, y te lo deja listo para usar. Esto importa porque durante la búsqueda cada combinación se entrenó solo con una parte de los datos en cada pliegue, nunca con todos a la vez; para el modelo final que vas a usar de verdad quieres aprovechar todos los datos de entrenamiento disponibles. La herramienta hace ese último reentrenamiento por ti, así que lo que te devuelve ya es el modelo bueno, no un prototipo a medias. Por eso puedes llamar a predict directamente sobre lo que te da la búsqueda.

Una pregunta razonable es qué mandos conviene meter en la malla, porque no todos los modelos se ajustan por lo mismo. En un bosque, lo que más suele mover el resultado es la profundidad de los árboles y cuántas variables mira cada corte; el número de árboles importa poco una vez pasas de un mínimo razonable, como ya viste. En un boosting, la pareja que manda es el ritmo de aprendizaje junto con el número de árboles, y después la profundidad de cada árbol, que suele ser pequeña. No hace falta que te lo aprendas de memoria: la idea es que antes de montar una malla gigante conviene saber qué dos o tres mandos de ese modelo concreto son los que de verdad deciden, y centrarse en ellos. Buscar bien no es buscar mucho, es buscar donde hay algo que encontrar.

Y una advertencia de método que cierra el círculo con todo lo anterior: si tu malla es enorme, estás probando tantísimas combinaciones que, aunque uses validación cruzada correctamente, acabas eligiendo la que mejor encaja con las casualidades de esa validación concreta, y vuelves a tener el problema del principio en una forma más sutil. Probar diez combinaciones honestas es sano; probar diez mil es volver a pescar suerte. La búsqueda de hiperparámetros, como casi todo en este oficio, se hace con mesura: unos pocos valores con sentido valen más que un barrido infinito, no solo por tiempo, sino porque buscar demasiado también engaña.

Fija random_state tanto en el modelo que le pasas a la búsqueda como en la partición de los datos. La búsqueda implica muestreos y pliegues, y sin semillas fijas obtendrás una combinación ganadora distinta cada vez. Un ajuste de hiperparámetros que no puedes reproducir no sirve para comparar nada.

Un último consejo sobre expectativas, porque es donde más se desilusiona quien empieza. Es tentador creer que ajustar hiperparámetros va a transformar un modelo mediocre en uno brillante, y casi nunca es así. Un buen ajuste suele arañar unos pocos puntos sobre lo que ya daba el modelo con sus valores de fábrica: valioso, a veces decisivo, pero rara vez espectacular. Si tu modelo con los ajustes por defecto va mal, el problema casi nunca está en los mandos, está en otro sitio (en las variables, en los datos, en cómo planteaste el problema), y ninguna malla por grande que sea lo va a arreglar. Afinar es el pulido final de algo que ya funciona, no la forma de hacer que funcione lo que no funcionaba. Tener clara esa proporción te ahorra perder días girando mandos cuando el trabajo que falta es otro.

## El cierre: ya sabes afinar; ahora, de dónde sale la mejora de verdad

Con esto cierras el bloque de los modelos de conjunto: sabes construir un bosque, un boosting, y afinar los mandos de cualquiera de ellos sin contaminar la prueba. Pero hay un hecho incómodo que todo el que lleva tiempo en esto acaba descubriendo: afinar hiperparámetros rara vez es lo que más mueve la aguja. Casi siempre, la mayor mejora no viene de cambiar de modelo ni de encontrar la profundidad perfecta, sino de darle al modelo mejores variables para mirar. Ese trabajo (construir, elegir y transformar las variables) es lo que viene ahora, y es donde se gana o se pierde de verdad.

Regístrate para guardar tu progreso.