Conjuntos de Datos y Divisiones
Las divisiones de entrenamiento, validación y prueba definen lo que tu modelo ha visto durante el entrenamiento frente a lo que debe generalizar. Una división correcta es la base de una evaluación honesta.
Busca en todas las páginas de la documentación
Las divisiones de entrenamiento, validación y prueba definen lo que tu modelo ha visto durante el entrenamiento frente a lo que debe generalizar. Una división correcta es la base de una evaluación honesta.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
from sklearn.model_selection import train_test_split, StratifiedKFold, cross_val_score
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X_train, y_train, cv=cv, scoring="f1_macro")Cuándo usar esto:
"""datasets_splits.py - flujo de trabajo de división sin fugas para clasificación tabular."""
from __future__ import annotations
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import StratifiedKFold, cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# Cargar e inspeccionar
data = load_breast_cancer(as_frame=True)
X: pd.DataFrame = data.data
y: pd.Series = data.target
# 1) Reservar el conjunto de prueba final (nunca se usa durante la selección del modelo)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# 2) Construir el pipeline - ajustar solo en los pliegues de entrenamiento dentro de CV
pipe = Pipeline([
("scaler", StandardScaler()),
("clf", RandomForestClassifier(n_estimators=100, random_state=42)),
])
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
cv_scores = cross_val_score(pipe, X_train, y_train, cv=cv, scoring="f1")
print(f"CV F1: {cv_scores.mean():.3f} +/- {cv_scores.std():.3f}")
# 3) Ajuste final en todos los datos de entrenamiento, evaluar una vez en la prueba
pipe.fit(X_train, y_train)
print(classification_report(y_test, pipe.predict(X_test)))Lo que esto demuestra:
| Estrategia | Usar Cuándo | API de sklearn |
|---|---|---|
| División aleatoria | Filas IID, clases balanceadas | train_test_split |
| División estratificada | Clasificación con clases raras | stratify=y |
| División basada en tiempo | Predicción, deriva temporal | TimeSeriesSplit |
| División por grupos | Múltiples filas por entidad | GroupKFold, GroupShuffleSplit |
| CV anidada | Ajuste de hiperparámetros imparcial | GridSearchCV dentro de CV externa |
from sklearn.model_selection import TimeSeriesSplit, GroupKFold
# Series temporales: siempre entrenar con el pasado, probar con el futuro
tscv = TimeSeriesSplit(n_splits=5)
# Grupos: el mismo group_id nunca está en entrenamiento ni en prueba
gkf = GroupKFold(n_splits=5)
for train_idx, val_idx in gkf.split(X, y, groups=group_ids):
...Pipeline.stratify=y o estrategias de remuestreo.TimeSeriesSplit o divisiones basadas en corte.group_id, no por fila.| Alternativa | Usar Cuándo | No Usar Cuándo |
|---|---|---|
| División única de entrenamiento/prueba | Conjuntos de datos grandes, iteración rápida | Datos pequeños donde la varianza de la división es alta |
| Validación cruzada K-fold | Comparación de modelos, datos limitados | Datos muy grandes donde una división es suficiente |
| Retención + conjunto de validación | Aprendizaje profundo con ejecuciones de entrenamiento largas | Necesitas muchas pruebas de hiperparámetros (usa CV) |
| Bootstrap / CV repetida | Métricas inestables en datos pequeños | El costo de entrenamiento por pliegue es prohibitivo |
train_test_split(X, y, stratify=y) # preserva las proporciones de clase en ambas particionesTimeSeriesSplit.groups con un ID por fila (user_id, patient_id).GroupKFold asegura que todas las filas de un grupo caigan en el mismo pliegue.random_state=42 (cualquier entero fijo) hace que las divisiones sean reproducibles.train, test = train_test_split(df, test_size=0.2, stratify=df["label"])
X_train, y_train = train["features"], train["label"]cross_val_predict en su lugar, todavía solo en datos de entrenamiento.MultiOutputClassifier o modelos separados por objetivo.Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 19 jul 2026