La validación cruzada (cross-validation) mide el desempeño de un modelo entrenándolo y evaluándolo varias veces sobre distintas particiones de los datos, para no depender de una única división afortunada (o desafortunada).
El problema de una sola partición
Lo habitual es separar los datos en entrenamiento y prueba. Pero si esa partición fue "suertuda" —los ejemplos fáciles quedaron en prueba—, sobrestimaremos el modelo; si fue "salada", lo subestimaremos. Con pocos datos, el azar de una única división pesa demasiado.
k-fold: rotar el conjunto de prueba
La validación cruzada de k particiones (k-fold) resuelve esto rotando el rol de prueba:
- Se divide el conjunto en partes (folds) de tamaño similar.
- Se entrena con partes y se evalúa con la restante.
- Se repite veces, usando cada parte como prueba exactamente una vez.
El desempeño final es el promedio de las evaluaciones:
Un valor típico es o . La desviación estándar entre folds, además, nos dice qué tan estable es el modelo.
Variantes útiles
- Estratificada: mantiene en cada fold la misma proporción de clases que el conjunto completo. Imprescindible con clases desbalanceadas (recuerda la lección anterior).
- Leave-One-Out (LOO): el caso extremo con ; cada ejemplo es, por turnos, el único de prueba. Muy costoso, útil con muy pocos datos.
- Series de tiempo: cuando el orden importa, se entrena solo con el pasado y se valida con el futuro, sin mezclar.
Para qué la usamos de verdad
La validación cruzada es la herramienta estándar para elegir hiperparámetros sin hacer trampa. Por ejemplo, el de una SVM o la tasa de aprendizaje de XGBoost se eligen probando valores y quedándose con el que mejor promedio de CV obtiene, todo antes de tocar el conjunto de prueba final.
Una advertencia: la fuga de datos
El error más común es preparar los datos (escalar, seleccionar variables) usando todo el conjunto antes de partir los folds. Eso filtra información de la prueba al entrenamiento —fuga de datos (data leakage)— e infla el resultado. La regla de oro: cada fold debe ver su preparación calculada solo con su porción de entrenamiento.
En código
cross_val_score entrena y evalúa el modelo en cada fold automáticamente:
from sklearn.model_selection import cross_val_score, StratifiedKFold
# StratifiedKFold mantiene la proporción de clases en cada fold.
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
scores = cross_val_score(modelo, X, y, cv=cv, scoring="f1")
print(scores) # una métrica por fold
print(scores.mean(), scores.std()) # desempeño promedio y su estabilidad
Para evitar la fuga de datos, se pasa un Pipeline (con el escalado dentro) como modelo: así cada fold recalcula su preparación por separado.
Para llevar
La validación cruzada da una estimación honesta y estable del desempeño, promediando sobre varias particiones y evitando el espejismo de una única división. Es el cierre natural de esta serie: entrenamos modelos (SVM, Random Forest, XGBoost), aprendimos a medirlos (matriz de confusión) y ahora a validarlos sin engañarnos.
