Artículos / Aprendizaje automático

[ Aprendizaje automático ]Pythonscikit-learnmachine learningclasificación

Titanic con scikit-learn: tutorial de Pipeline en Python

Entrena un clasificador Titanic en Python con fetch_openml, preprocesamiento, GridSearchCV y test separado. Incluye categorías desconocidas.

21 de mayo de 2026·3 min de lectura
Titanic con scikit-learn: tutorial de Pipeline en Python

Este tutorial de clasificación con Titanic mantiene un holdout de test intacto mientras el preprocesamiento y el ajuste ocurren dentro de un Pipeline de scikit-learn. Requiere scikit-learn 1.1 o posterior; fetch_openml necesita red en su primera ejecución.

Carga un problema de clasificación explicable

Titanic pregunta si un pasajero sobrevivió. Excluimos boat y body: se registran después del resultado y filtrarían la respuesta a un modelo que pretende predecir antes del evento.

python
from sklearn.datasets import fetch_openml
frame = fetch_openml("titanic", version=1, as_frame=True).frame
numeric = ["age", "fare", "sibsp", "parch"]
categorical = ["sex", "embarked", "pclass"]
X = frame[numeric + categorical]
y = frame["survived"].astype(int)

Los faltantes y las categorías nuevas son normales en producción. El transformador aprende medianas, modas y categorías solo al llamar fit. unknown_value=-1 es distinto de los códigos no negativos aprendidos por OrdinalEncoder, así que un puerto o una clase no vista no rompe la predicción. Los códigos ordinales sugieren un orden numérico arbitrario para variables nominales; para un modelo lineal conviene OneHotEncoder(handle_unknown="ignore").

Divide una vez y deja el preprocesamiento dentro del modelo

python
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OrdinalEncoder, StandardScaler
from sklearn.tree import DecisionTreeClassifier

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20,
    random_state=42, stratify=y)
prep = ColumnTransformer([
    ("num", Pipeline([("impute", SimpleImputer(strategy="median")),
                      ("scale", StandardScaler())]), numeric),
    ("cat", Pipeline([("impute", SimpleImputer(strategy="most_frequent")),
                      ("encode", OrdinalEncoder(handle_unknown="use_encoded_value",
                                                 unknown_value=-1))]), categorical),
])
model = Pipeline([("prep", prep), ("tree", DecisionTreeClassifier(random_state=42))])

No ejecutes prep.fit(X) antes de dividir. Eso dejaría que filas de test influyan en entrenamiento. Un pipeline se ajusta de nuevo en cada fold de validación cruzada y evita esa fuga también.

Ajusta solo con datos de entrenamiento

El conjunto test no sirve para elegir hiperparámetros. Usa validación cruzada sobre X_train, selecciona por F1 medio y reserva X_test para una estimación final. F1 equilibra precisión y recall; su pertinencia depende del costo de cada error.

python
from sklearn.model_selection import GridSearchCV, StratifiedKFold
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
search = GridSearchCV(model, param_grid={
    "tree__max_depth": [3, 5, 8, None],
    "tree__min_samples_leaf": [1, 5, 10],
    "tree__criterion": ["gini", "entropy"],
}, scoring="f1", cv=cv, n_jobs=2)
search.fit(X_train, y_train)
print(search.best_params_)
print(search.best_score_)

criterion="entropy" y "gini" son criterios soportados; ninguno gana siempre. La búsqueda evalúa 4 × 3 × 2 × 5 = 120 ajustes de CV y luego reajusta una vez el pipeline elegido con todo X_train. El ganador y la métrica dependen de la versión y los datos descargados, por eso el tutorial no inventa una salida fija.

Evalúa el pipeline elegido una sola vez

python
from sklearn.metrics import classification_report, ConfusionMatrixDisplay
best_model = search.best_estimator_
predictions = best_model.predict(X_test)
print(classification_report(y_test, predictions, target_names=["no sobrevivió", "sobrevivió"]))
ConfusionMatrixDisplay.from_predictions(y_test, predictions)

Lee la matriz según la decisión: recall indica cuántos sobrevivientes reales se encontraron y precisión cuán a menudo acertó una predicción de supervivencia. Titanic es un dataset histórico para aprender, no evidencia de idoneidad en un caso de alto impacto. En un sistema real, define el costo de error, conserva un conjunto final intacto —o usa CV anidada si hay pocos datos— y monitorea los datos tras liberar el modelo.

Fuentes

¿Vas a construir una plataforma de IA o de datos?

Si necesitas adaptar este enfoque a tu sistema, cuéntame qué datos tienes y qué decisión técnica necesitas resolver.

Ver todos los proyectos