
Sesión 5 — Validación cruzada: ¿tuvimos suerte con la partición?
Desde la Sesión 1 hemos usado siempre la misma partición de datos: train_test_split(..., random_state=42), los mismos 455 pacientes para entrenar y los mismos 114 para el examen final. Con esa única partición hemos entrenado un árbol, calculado su exactitud, leído su matriz de confusión y comparado su exhaustividad con la de un Random Forest de 100 árboles.
Pero hay una pregunta incómoda que no nos habíamos hecho todavía: ¿y si esa partición concreta le vino bien al modelo, por pura casualidad? Si otros 114 pacientes hubieran caído en el examen, ¿habríamos obtenido una exactitud parecida, o el número habría cambiado bastante?
Cerramos el taller respondiendo a eso con la herramienta que la ciencia de datos real usa para no fiarse de un solo examen: la validación cruzada.
El problema de examinar una sola vez
Imaginad que evaluáis a un alumno con un único examen de diez preguntas. Si ese día le tocan justo las preguntas que mejor se sabe, su nota no refleja realmente lo que sabe — solo dice que tuvo un buen día. La forma honesta de evaluarlo es ponerle varios exámenes distintos y quedarse con la nota media.
Con un modelo pasa exactamente lo mismo: una sola partición train/test es un único examen. La validación cruzada le pone varios exámenes distintos, con datos distintos cada vez, y se queda con la exactitud media.
Validación cruzada en 5 particiones (k-fold)
La versión más habitual funciona así: se divide el conjunto de entrenamiento en 5 partes iguales. Se entrena el modelo con 4 de esas partes y se examina con la que queda fuera; luego se repite el proceso 5 veces, cambiando en cada vuelta cuál es la parte que se usa de examen, hasta que las 5 han hecho de examen una vez. Al final tenemos 5 exactitudes distintas, una por cada vuelta, y las promediamos.
Fijaos en un detalle importante: todo esto se hace únicamente con los 455 pacientes de entrenamiento. Los 114 del conjunto de prueba siguen sin tocarse — siguen siendo el examen final de verdad, reservado desde la Sesión 1.
El código
from sklearn.model_selection import cross_val_score
# Validación cruzada de 5 particiones, con el árbol de la Sesión 2
puntuaciones_arbol = cross_val_score(arbol, X_train, y_train, cv=5)
print("Exactitudes del árbol en cada partición:", puntuaciones_arbol)
print(f"Exactitud media del árbol: {puntuaciones_arbol.mean():.2%}")
# Lo mismo con el Random Forest de la Sesión 4
puntuaciones_bosque = cross_val_score(bosque, X_train, y_train, cv=5)
print("Exactitudes del bosque en cada partición:", puntuaciones_bosque)
print(f"Exactitud media del bosque: {puntuaciones_bosque.mean():.2%}")
cross_val_score hace todo el trabajo: reparte, entrena, examina y repite las 5 veces, y os devuelve las 5 exactitudes en una lista. No hace falta volver a llamar a .fit() a mano — cada vuelta entrena una copia nueva del modelo desde cero, con las 4 partes que le toquen esa vez.

[COMPLETAR CON VUESTROS DATOS REALES: exactitudes del árbol en las 5 particiones = ___ | media = ___. Exactitudes del bosque = ___ | media = ___]
Cómo leer estos cinco números
Miradlos de dos formas distintas. Primero, la media: es una exactitud más fiable que la de un solo examen, porque es el promedio de cinco exámenes distintos. Segundo, comparad las 5 exactitudes entre sí: si son parecidas unas a otras, el modelo se comporta de forma parecida sin importar qué pacientes le toquen para entrenar — es una señal de que es estable. Si alguna se aleja mucho de las demás, es señal de que el resultado depende bastante de la suerte de la partición.
Comparad también la media de la validación cruzada con la exactitud que obtuvisteis en la Sesión 2 (árbol) y en la Sesión 4 (bosque) con la partición única. Si los números se parecen, la partición de la Sesión 1 no os favoreció de forma especial — el modelo rinde así de bien (o de regular) independientemente de qué pacientes concretos le tocaran de examen.
Cierre del taller
Con esto terminamos el recorrido de CUTLER: cargamos datos médicos reales, entrenamos un árbol de decisión y aprendimos a medir su exactitud, aprendimos a leer sus errores con matriz de confusión, precisión y exhaustividad, subimos a un Random Forest de cien árboles votando y descubrimos qué mediciones pesan más en el diagnóstico, y hoy hemos comprobado que los resultados de todo el taller no dependían de la suerte de un solo examen. Habéis usado, de principio a fin, las mismas herramientas — scikit-learn y pandas — que usa cualquier científico de datos de verdad.




