7 · Validación cruzada
Una división train/test te da una puntuación; k-fold te da un intervalo de confianza — y usa tus datos k veces más eficientemente.
La división train/test te da un número; la validación cruzada k-fold te da un intervalo de confianza — y usa tus datos k veces más eficientemente.
Sin esto:
Sin validación cruzada, confiarías demasiado en una división 80/20 afortunada y desplegarías modelos cuya 'buena' puntuación de test era ruido.
Una única división train/test es el protocolo de evaluación más simple — pero tiene un problema oculto: la puntuación que obtienes depende en gran medida de qué filas terminaron en el conjunto de test. Si tienes mala suerte, tu conjunto de test es inusualmente fácil o difícil. La varianza de una sola división es alta.
La distinción train / val / test
Protocolo de división en tres partes:
- Conjunto de entrenamiento — el modelo ve estos datos durante el ajuste.
- Conjunto de validación — se usa para ajustar hiperparámetros y comparar modelos. El modelo nunca entrena con esto.
- Conjunto de test — se toca una sola vez, al final, para reportar la puntuación honesta final. Mirarlo durante el desarrollo invalida la evaluación.
Validación cruzada k-fold
En lugar de una división, el k-fold divide los datos en k partes iguales (folds). Para cada fold i:
- Entrena en todos los folds excepto el i.
- Valida en el fold i.
- Registra la métrica.
Rota hasta que cada fold haya sido el fold de validación exactamente una vez. Terminas con k puntuaciones — reporta la media y la desviación estándar. Opciones comunes: k = 5 o k = 10.
Ventajas frente a una única división:
- Cada fila se usa tanto para entrenamiento como para validación (en rondas diferentes).
- Las k puntuaciones permiten reportar media ± std — un intervalo de confianza aproximado.
- Estimación mucho más estable del rendimiento de generalización.
k-fold estratificado — para clasificación: preserva las proporciones de clase en cada fold. Crítico para datasets desbalanceados donde una división naive podría poner todos los ejemplos de la clase minoritaria en un fold.
Leave-one-out CV (LOOCV) — caso especial donde k = n. Usa al máximo los datos; da una estimación sin sesgo; computacionalmente costoso (n ajustes del modelo).
TimeSeriesSplit — para datos secuenciales/temporales: los folds deben respetar el orden cronológico. El fold i entrena en las filas 0..m×i y valida en las filas m×i..m×(i+1). Mezclar los datos filtraría información futura al entrenamiento — una forma de fuga de datos.
Python (in browser)
`cross_val_score` maneja automáticamente el ciclo de división, ajuste y puntuación. El std entre folds te dice qué tan sensible es el rendimiento del modelo a qué filas terminan en validación.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
El ciclo manual y `cross_val_score` producen resultados idénticos cuando se les da el mismo splitter `KFold`. El ciclo manual es útil cuando necesitas acceso al modelo ajustado dentro de cada fold (p. ej., para inspeccionar importancias de variables).
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Sin estratificación, algunos folds pueden recibir 0 o 1 ejemplos de la clase minoritaria — haciendo que la métrica del fold sea sin sentido. StratifiedKFold asegura que cada fold refleje el balance de clases general.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
TimeSeriesSplit nunca mezcla. Las fronteras de los folds avanzan en el tiempo — el entrenamiento siempre termina antes de que comience la validación. Esta es la única estrategia de CV válida cuando las filas están ordenadas por tiempo.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
La CV anidada es el enfoque estadísticamente honesto para la selección y evaluación combinada de modelos. En la práctica, incluso un nivel de CV es una gran mejora sobre una única división train/test.
En un problema de predicción de series temporales, ¿puedes usar KFold con shuffle=True?
- El k-fold CV da k puntuaciones; reporta media ± std como un intervalo de confianza aproximado del 95% sobre el rendimiento en test.
- Siempre establece shuffle=True (con random_state fijo) para KFold en datos que no sean series temporales.
- Usa StratifiedKFold para clasificación — especialmente con clases desbalanceadas.
- Usa TimeSeriesSplit (nunca KFold) para datos temporales — las filas futuras nunca deben aparecer en el fold de entrenamiento.
Toda solución de Kaggle reporta puntuaciones de CV. Los GridSearchCV y RandomizedSearchCV de sklearn usan CV internamente. Los frameworks de ajuste de hiperparámetros (Optuna, Ray Tune) dependen de un objetivo basado en CV.
Si lo quitas: Reportarías métricas de rendimiento que son 'afortunadas' en lugar de fiables — una receta para sorpresas en producción.