58 · Dividir, validar cruzado, buscar
Una sola división es ruidosa; la validación cruzada promedia sobre folds, y la búsqueda de hiperparámetros automatiza probar configuraciones — todo operando sobre el Pipeline como un solo objeto.
Una sola división train/test da un número ruidoso; la validación cruzada re-entrena sobre varios folds y promedia, dando una estimación mucho más confiable. La búsqueda de hiperparámetros (`GridSearchCV`, `RandomizedSearchCV`) automatiza probar muchas configuraciones — y como el Pipeline es un único estimador, todo esto opera sobre el objeto completo de preprocesamiento-más-modelo de una vez.
Sin esto:
Juzga un modelo con una sola división arbitraria y podrías reportar un puntaje afortunado o desafortunado por varios puntos; ajusta hiperparámetros a mano y explorarás un rincón diminuto del espacio de configuraciones, perdiéndote modelos mejores por completo.
Una sola división es un volado
Un único train_test_split parte tus datos en una porción de entrenamiento y una de test. El puntaje resultante depende fuertemente de qué filas cayeron en test. Vuelve a correrlo con un random_state distinto y el número puede oscilar varios puntos porcentuales — eso es ruido, no señal.
La validación cruzada elimina la mayor parte de ese ruido. La CV de k-folds divide los datos en k folds iguales, y luego entrena k modelos separados: cada uno reserva un fold distinto para test y entrena con los otros k − 1. Promediar los k puntajes da una estimación mucho más estable, y la dispersión (desviación estándar) te dice qué tan sensible es el modelo a la división concreta.
La estratificación importa cuando las clases están desbalanceadas. StratifiedKFold (y train_test_split(..., stratify=y)) preserva las proporciones de clase en cada fold, para que un dataset 90/10 no produzca por accidente un fold casi sin ejemplos de la minoría.
La búsqueda de hiperparámetros automatiza el tedio de probar configuraciones:
GridSearchCV— prueba exhaustivamente cada combinación de una rejilla, evaluando cada una con validación cruzada.RandomizedSearchCV— muestrea un número fijo de configuraciones aleatorias, lo que escala mucho mejor cuando la rejilla es grande.
El punto crucial: todas aceptan un Pipeline como su estimador. Les entregas el objeto completo de preprocesamiento-más-modelo, y re-ajustan todo dentro de cada fold — así la validación cruzada se mantiene libre de fugas automáticamente.
Python (in browser)
En un conjunto desbalanceado 90/10, `stratify=y` obliga a que tanto train como test reflejen la proporción global de la clase 1. Sin él, la división aleatoria puede desviarse, dejando al conjunto de test con un balance de clases poco representativo — y un puntaje poco confiable.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`cross_val_score` re-ajusta el Pipeline completo en cada uno de cinco folds estratificados y devuelve un puntaje por fold. La media es tu estimación principal; la desviación estándar cuantifica cuánto te podría haber engañado una sola división.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`GridSearchCV` evalúa cada valor de `param_grid` con validación cruzada. La clave `model__C` usa el espacio de nombres `paso__param` — `model` es el paso del pipeline, `C` su hiperparámetro. Tras ajustar, `best_params_` y `best_score_` reportan al ganador.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`RandomizedSearchCV` muestrea `n_iter` configuraciones en lugar de probarlas todas. Aquí pasamos una lista simple de valores candidatos de `C` (compatible con Pyodide — sin distribuciones de `scipy.stats`) y tomamos 5 al azar. Es la opción cuando una rejilla exhaustiva sería demasiado costosa.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
En un `GridSearchCV` sobre un Pipeline, ¿qué significa la clave `model__C`?
- Una sola división es ruidosa; la CV de k-folds re-entrena sobre varios folds y promedia, dando una estimación estable más una desviación estándar que señala la sensibilidad a la división.
- `stratify=y` / `StratifiedKFold` preserva las proporciones de clase en cada fold — esencial con datos desbalanceados para que ningún fold pierda la clase minoritaria.
- `GridSearchCV` prueba cada combinación; `RandomizedSearchCV` muestrea `n_iter` configuraciones por escalabilidad. Ambos apuntan a pasos del Pipeline con la sintaxis de doble guion bajo `paso__param`.
Todo flujo de selección de modelo en scikit-learn corre sobre este trío: dividir honestamente, validar de forma cruzada para estimar, y buscar para ajustar. `GridSearchCV`/`RandomizedSearchCV` sobre un Pipeline es el patrón estándar para producir un modelo ajustado y libre de fugas.
Si lo quitas: Sin validación cruzada confiarías en una sola división afortunada o no; sin búsqueda automatizada ajustarías a mano un puñado de configuraciones y casi seguro dejarías rendimiento sobre la mesa.