
Proyecto Javierre — Sesión 5: validación cruzada, ¿tuvimos suerte con la partición?
Desde la Sesión 2 hemos usado siempre la misma partición: train_test_split(..., test_size=0.2, random_state=42, stratify=y), los mismos 57 pacientes para entrenar y los mismos 15 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.
Aquí hay una pregunta que pesa más que en CUTLER: con solo 15 pacientes de examen, un único paciente distinto en esa partición puede cambiar la exactitud casi un 7%. ¿Y si esos 15 en concreto le vinieron bien al modelo, por pura casualidad?
Cerramos esta parte del proyecto con la misma herramienta que ya usamos para cerrar CUTLER: 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 lo que sabe de verdad — 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 lo mismo: una sola partición train/test es un único examen. Con solo 72 pacientes en total, este riesgo es más real que con los 569 de CUTLER — aquí cada paciente de más o de menos en el examen pesa mucho más.
Validación cruzada en 5 particiones (k-fold)
Se divide el conjunto de entrenamiento en 5 partes. Se entrena el modelo con 4 de esas partes y se examina con la que queda fuera; se repite 5 veces, cambiando cada vez cuál es la parte de examen, hasta que las 5 han hecho de examen una vez. Al final tenemos 5 exactitudes distintas, y las promediamos.
Igual que en CUTLER, esto se hace únicamente con los 57 pacientes de entrenamiento. Los 15 del conjunto de prueba siguen sin tocarse — siguen siendo el examen final de verdad, reservado desde la Sesión 2.
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 reparte, entrena, examina y repite las 5 veces, y os devuelve las 5 exactitudes en una lista. Con solo 57 pacientes de entrenamiento, cada partición de la validación cruzada examina con muy pocos pacientes (poco más de 11 cada vez) — así que no os extrañe ver más diferencia entre las 5 exactitudes que la que visteis en CUTLER.
[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. Primero, la media: es una exactitud más fiable que la de un solo examen, porque es el promedio de cinco exámenes distintos con pacientes distintos cada vez. Segundo, comparad las 5 exactitudes entre sí: si son parecidas, el modelo se comporta de forma estable sin importar qué pacientes le toquen para entrenar; si alguna se aleja mucho de las demás, es señal de que, con tan pocos pacientes, 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 de 15 pacientes. Si los números se parecen, esa partición no os favoreció de forma especial.
Qué viene después
Con esto sabemos si podemos fiarnos de los números que hemos visto hasta ahora, o si dependían de qué pacientes concretos cayeron en el examen. En la última sesión del proyecto vamos a poner al modelo a prueba de otra forma: dándole pacientes nuevos, uno a uno, y comprobando si acierta su diagnóstico — vosotros incluidos, adivinando antes que el ordenador.



