Saltar al contenido

lección 4

Validación cruzada: cuando no te sobran datos

Partir en tres montones gasta datos, y una sola partición hace que tu medida dependa de la suerte del sorteo. La validación cruzada arregla las dos cosas rotando el examen.

⏱ 55 min

Partir los datos en montones separados tiene dos pegas que, mientras te sobren datos, apenas notas, pero que se vuelven serias en cuanto los datos escasean. La primera es que gastas datos: cada ejemplo que apartas para validar o probar es un ejemplo del que el modelo no aprende, y con pocos datos de partida eso duele. La segunda es más sutil y afecta a todo el mundo, tenga muchos datos o pocos: cuando mides tu modelo sobre una sola partición de validación, el número que sacas depende de qué ejemplos cayeron por casualidad en ese montón. Cambias la semilla del reparto, y el número cambia. Tu medida de lo bueno que es el modelo tiene una parte de suerte del sorteo, y eso es justo lo que no quieres en algo de lo que te vas a fiar.

Las dos pegas tienen una misma solución, y es una de esas ideas elegantes que, una vez la ves, te preguntas cómo no se te ocurrió antes. En vez de apartar un trozo fijo para validar y resignarte a usar solo ese, haces turnos: cada trozo de los datos hace de examen una vez, mientras los demás entrenan, y al final promedias todas las notas. Se llama validación cruzada, y es la herramienta estándar para medir con honestidad cuando no te sobran datos o cuando quieres una medida que no dependa de la suerte de un único reparto.

## El problema de la suerte del sorteo

Imagina que tienes 300 ejemplos y apartas 60 para validar. Mides tu modelo sobre esos 60 y sale un 88%. Pero esos 60 son un grupo concreto, elegido al azar: podrían haber sido 60 ejemplos fáciles, en cuyo caso tu 88% está inflado, o 60 difíciles, en cuyo caso está hundido. Si rehaces el reparto con otra semilla, caen otros 60 ejemplos distintos y el acierto puede saltar al 92% o bajar al 84% sin que hayas cambiado nada del modelo. ¿Cuál de esos números es el bueno? Ninguno por separado: cada uno es una foto de un reparto concreto, y la realidad está en algún punto entre todos ellos.

Esto es incómodo porque te deja sin saber en qué número confiar. Si tu decisión de usar un modelo o descartarlo depende de si marcó un 88% o un 84%, y ese número cambia según cómo barajaste, estás tomando decisiones a cara o cruz sin saberlo. Lo que necesitas no es una foto, es una medida estable: un número que no se mueva cuando repites el experimento, porque entonces sabes que mide el modelo y no la suerte del reparto.

El problema se agrava justo cuando menos datos tienes, y la razón es puramente aritmética. Con 10.000 ejemplos, un montón de validación del 20% tiene 2.000 ejemplos: suficientes para que la nota sea estable, porque la buena y la mala suerte de ejemplos concretos se compensan dentro de ese grupo grande. Con 300 ejemplos, el mismo 20% son 60: un grupo tan pequeño que un puñado de casos raros que caigan ahí mueve la nota varios puntos. Cuantos menos ejemplos tiene el examen, más pesa la suerte de cuáles tocaron, y más baila el número. Así que con pocos datos sufres las dos pegas a la vez y con fuerza: desperdicias una parte valiosa que no te sobra, y encima la medida que sacas con lo que apartas es inestable.

Piénsalo como quien juzga un restaurante por una sola comida. Si vas una vez y pides un plato, tu opinión depende muchísimo de ese plato concreto y de ese día: puede que pidieras lo mejor de la carta, o lo peor, o que el cocinero tuviera un mal día. Una sola visita es una foto, y las fotos engañan. Si en cambio vas cinco veces y pruebas platos distintos, tu opinión se vuelve mucho más justa: los aciertos y los fallos sueltos se promedian, y lo que queda se parece más a cómo es el restaurante de verdad. La validación cruzada hace exactamente eso con tu modelo: en vez de juzgarlo por una sola comida, lo juzga por varias y promedia.

El mismo modelo da 88%, 92% u 84% según qué ejemplos cayeron en la validación. Con una sola partición no sabes cuál creerte.

## La idea: rotar el examen

La validación cruzada sustituye esa única foto por una media de varias, repartiendo el trabajo de forma que todos los ejemplos tengan su turno de examen. Funciona así. Partes tus datos en un número fijo de trozos del mismo tamaño, por ejemplo cinco. A ese número se le llama k, y a cada trozo, un pliegue. Luego juegas cinco rondas. En la primera, el trozo 1 hace de examen y los otros cuatro entrenan al modelo; mides el acierto sobre el trozo 1 y lo apuntas. En la segunda, el trozo 2 hace de examen y entrenan los otros cuatro, incluido el 1; apuntas la nota. Y así hasta que cada uno de los cinco trozos ha hecho de examen exactamente una vez. Al final tienes cinco notas, y la media de las cinco es tu medida.

Fíjate en lo que consigue este baile. Cada ejemplo ha servido de examen una vez (en la ronda en que su trozo era el examinado) y ha servido para entrenar las otras cuatro veces. Nunca un ejemplo entrena y examina en la misma ronda, así que la honestidad se mantiene intacta: en cada ronda, el modelo se mide sobre datos que no vio en esa ronda. Pero, a diferencia de la partición única, todos los datos acaban participando tanto en entrenar como en examinar. No desperdicias ninguno, que era la primera pega. Y como promedias cinco notas en vez de quedarte con una, la suerte del sorteo se diluye: un trozo que tocó fácil se compensa con otro que tocó difícil, que era la segunda pega.

En cada ronda un pliegue distinto hace de examen y el resto entrena. Tras las cinco rondas, cada ejemplo ha examinado una vez y entrenado cuatro. La media de las cinco notas es la medida estable.

## Qué te da, exactamente

La validación cruzada te da dos cosas que la partición única no puede. La primera es una medida más estable y de más confianza: al promediar varias notas, el resultado no baila al cambiar la semilla, porque ya no depende de un único reparto afortunado o desafortunado. La segunda es un uso más eficiente de los datos: cada ejemplo contribuye a entrenar en casi todas las rondas, así que el modelo que mides se ha entrenado, de media, con casi todos los datos, no con el 60% que te quedaba tras apartar validación y prueba. Por eso brilla justo cuando tienes pocos datos, que es cuando desperdiciar un 40% es un lujo que no te puedes permitir.

Y hay un tercer regalo, más silencioso pero muy útil: las cinco notas no solo se promedian, también se miran. Si las cinco salen parecidas (por ejemplo 90, 91, 89, 92, 90), tu modelo es estable: va parecido haga lo que haga el reparto. Si salen muy dispares (por ejemplo 95, 78, 93, 82, 91), ahí hay una señal de alarma: el modelo es muy sensible a qué ejemplos le toquen, lo que suele indicar que tienes pocos datos para el problema, o que hay subgrupos muy distintos entre tus ejemplos. La dispersión de las notas te cuenta cosas que la media sola esconde.

Esa dispersión es, de hecho, una forma honesta de poner un margen de error alrededor de tu número. Decir «el modelo acierta el 90%» suena a dato exacto, pero no lo es: es una estimación, y como toda estimación tiene una incertidumbre. Las cinco notas de la validación cruzada te dan una idea de esa incertidumbre sin esfuerzo extra: si van del 89 al 91, puedes decir con tranquilidad «ronda el 90%»; si van del 78 al 95, lo honesto es decir «anda por el 87%, pero con mucha variabilidad, así que tómalo con pinzas». Comunicar esa variabilidad, en vez de soltar un número seco, es parte de hacer las cosas bien: le dice a quien decide cuánta confianza puede depositar en tu medida, que es información tan valiosa como la medida misma.

La media sola no distingue estas dos situaciones: las dos dan 90%. La dispersión de las notas sí: a la izquierda el modelo es estable y de fiar; a la derecha, inestable y poco creíble.

No mires solo la media de las notas de la validación cruzada: mira también cuánto se separan entre sí. Una media del 90% con notas de 89 a 91 es una medida sólida. La misma media del 90% con notas de 78 a 95 es una advertencia: el modelo es inestable y ese 90% es menos de fiar de lo que parece. La media te dice cuánto acierta; la dispersión, cuánto puedes fiarte de ese número.

## Cómo se hace en código

scikit-learn trae todo el baile ya montado en una función llamada cross_val_score. Le pasas el modelo que quieres medir, tus datos completos (no partidos: de partirlos en pliegues se encarga ella) y el número de pliegues con el parámetro cv. Te devuelve un array con las notas de cada ronda, y a partir de ahí tú calculas la media. No tienes que montar los turnos a mano: la función reparte en pliegues, entrena y mide cada ronda, y te devuelve las notas.

1from sklearn.model_selection import cross_val_score
2from sklearn.tree import DecisionTreeClassifier
3
4modelo = DecisionTreeClassifier(max_depth=4, random_state=42)
5
6# cv=5 pliegues: 5 rondas, 5 notas
7notas = cross_val_score(modelo, X, y, cv=5)
8
9print("Nota de cada ronda:", notas)
10print("Media:", notas.mean())

La función monta los turnos, entrena y mide cada ronda, y te devuelve las cinco notas.

## Cuántos pliegues y cuándo usarla

El número de pliegues habitual es 5 o 10. Más pliegues significa que cada examen tiene menos ejemplos pero el modelo entrena con más, y que haces más rondas, así que tarda más. Con 5 pliegues entrenas y mides cinco veces; con 10, diez veces. Para la mayoría de los casos, 5 es un buen equilibrio entre estabilidad de la medida y tiempo de cálculo. El caso extremo, un pliegue por cada ejemplo, existe y tiene su nombre, pero rara vez compensa el coste.

Ese coste merece una palabra, porque es la pega de la validación cruzada y hay que tenerla presente. Donde una partición única entrena el modelo una vez, la validación cruzada de cinco pliegues lo entrena cinco veces, y la de diez, diez. Si entrenar tu modelo tarda un segundo, no notarás nada; si tarda media hora, cinco pliegues son dos horas y media. Para modelos pesados o conjuntos de datos enormes, eso importa, y es una de las razones por las que la partición única sigue usándose cuando datos sobran: con millones de ejemplos, un solo montón de validación ya es lo bastante grande para dar una medida estable, y no hace falta pagar el coste de rotar. La validación cruzada brilla en el extremo contrario, con pocos datos, que es donde la estabilidad escasea y el tiempo de cálculo suele ser poco.

Hay un segundo motivo por el que la validación cruzada mide mejor, más allá de promediar, y es que el modelo que examina se ha entrenado con casi todos los datos. En una partición única, el modelo que mides aprendió solo del trozo de entrenamiento; se quedó sin ver lo que apartaste. En la validación cruzada, en cada ronda el modelo entrena con todos los pliegues menos uno, es decir, con la gran mayoría de los datos. Un modelo entrenado con más datos suele ser mejor, así que lo que mides se parece más al modelo final que de verdad entrenarás con todo. Es una forma de exprimir cada ejemplo al máximo: que sirva para entrenar casi siempre y para examinar una vez, sin desperdiciar nada en un montón apartado que el modelo nunca aprovecha.

Sobre cuándo usarla: la validación cruzada es la forma por defecto de medir y de elegir entre modelos, especialmente cuando no te sobran datos. Ocupa el papel que antes hacía el montón de validación, pero sin tener que apartarlo fijo y gastándolo mejor. Lo que no sustituye es el conjunto de prueba: ese sobre lacrado del final sigue estando aparte, intacto, para el examen definitivo. La validación cruzada es para elegir con honestidad; la prueba, para examinar al final una sola vez. La disciplina de no tocar la prueba hasta el final no cambia por usar validación cruzada; lo que cambia es cómo eliges antes de llegar ahí.

Para que quede clara la coreografía completa de un proyecto honesto, júntalo todo. Al principio del todo apartas el conjunto de prueba y lo lacras. Con lo que queda, usas validación cruzada para comparar tus variantes y quedarte con la mejor: ella rota el examen por dentro de ese resto, promedia y te da una medida estable para decidir. Una vez elegido tu modelo definitivo, lo entrenas con todo el resto junto (ya no necesitas rotar, porque ya has decidido) y, por fin, abres el conjunto de prueba y mides una vez. Ese número es el que reportas. La validación cruzada vive en el paso del medio, el de elegir; la prueba, en el último, el de examinar. Cada herramienta en su sitio, y la prueba intacta hasta el final.

Hay una pregunta razonable que surge aquí: si la validación cruzada da una medida tan buena, ¿por qué no quedarse con su número y ahorrarse el conjunto de prueba? Porque, en cuanto usas las notas de la validación cruzada para elegir tu mejor modelo, esas notas quedan tocadas por esa elección, exactamente igual que se tocaba el montón de validación. Has probado varias variantes y te has quedado con la que mejor media sacó: esa media ganadora está, en parte, inflada por la suerte de haber encajado con los pliegues, el mismo efecto de las monedas que ya conoces. El conjunto de prueba, que no participó en ninguna de esas elecciones, es el único que puede darte un número limpio al final. Validación cruzada para elegir, prueba para el veredicto: son papeles distintos y ninguno hace el del otro.

Un matiz que a veces confunde: la validación cruzada no te da un único modelo entrenado, te da una medida. En cada ronda se entrena un modelo distinto, con un trozo distinto de los datos, y al terminar esos modelos se descartan; lo que te quedas es el promedio de sus notas, que es una estimación de lo bueno que es ese tipo de modelo con esos ajustes. Por eso, después de usar la validación cruzada para decidir qué modelo y qué ajustes quieres, todavía tienes que entrenar el modelo definitivo, una vez, con los datos que corresponda. La validación cruzada responde a la pregunta «¿cómo de bueno es este planteamiento?», no te entrega el objeto final; ese lo entrenas tú después, ya con la decisión tomada.

La validación cruzada no es una excusa para prescindir del conjunto de prueba. Si usas las notas de la validación cruzada para elegir tu mejor modelo, esas notas quedan contaminadas por esa elección, igual que se contaminaba la validación. Necesitas un conjunto de prueba apartado desde el principio y nunca tocado, para medir al final el modelo que elegiste. Elegir con validación cruzada y examinar con la prueba son dos pasos distintos, y saltarse el segundo te deja otra vez sin un número honesto.

Hasta aquí, todas las formas de partir y rotar que has visto reparten los ejemplos al azar: barajan y cortan. Eso funciona cuando los ejemplos son intercambiables, cuando el orden en que llegaron no significa nada. Pero hay un tipo de datos muy común donde barajar al azar es, directamente, hacer trampa, y arruina en silencio todo lo que has aprendido. Son los datos que tienen fecha. Es lo siguiente, y es una de las trampas más caras del oficio.

Regístrate para guardar tu progreso.