Titanic — LR, дерево и Keras на одном датасете

Классическое учебное соревнование Titanic на Kaggle: по пассажирским данным предсказать выживание (Survived: 0 или 1). Здесь — минимальный pipeline: pandas → sklearn → Keras → сравнение моделей.

Теория: Scikit-learn, деревья, Keras.

Зависимости: pip install pandas scikit-learn tensorflow


1. Загрузка и подготовка

import pandas as pd
import numpy as np

url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
df = pd.read_csv(url)

df = df[["Survived", "Pclass", "Sex", "Age", "SibSp", "Parch", "Fare"]].copy()
df["Sex"] = df["Sex"].map({"male": 0, "female": 1})
df["Age"] = df["Age"].fillna(df["Age"].median())
df = df.dropna()

X = df.drop(columns="Survived")
y = df["Survived"].astype(int)
print(X.head())

Sex → число; пропуски в Age → медиана. На Kaggle добавляют Embarked, Title и т.д. — здесь минимум для старта.


2. Разбиение train / test

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)

stratify=y сохраняет долю выживших в обеих частях — см. разбиение данных.


3. Логистическая регрессия

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

lr_pipe = Pipeline([
    ("scaler", StandardScaler()),
    ("clf", LogisticRegression(max_iter=500)),
])
lr_pipe.fit(X_train, y_train)
y_pred_lr = lr_pipe.predict(X_test)

print("LogisticRegression accuracy:", accuracy_score(y_test, y_pred_lr))
print("Confusion matrix:\n", confusion_matrix(y_test, y_pred_lr))

4. Дерево решений

from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier(max_depth=4, random_state=42)
tree.fit(X_train, y_train)
y_pred_tree = tree.predict(X_test)

print("DecisionTree accuracy:", accuracy_score(y_test, y_pred_tree))
print("Confusion matrix:\n", confusion_matrix(y_test, y_pred_tree))

Визуализация дерева — plot_tree в статье про деревья.


5. Нейросеть (Keras)

Табличные данные — несколько Dense-слоёв; масштабирование обязательно:

import os
os.environ.setdefault("TF_CPP_MIN_LOG_LEVEL", "2")
import tensorflow as tf

scaler = StandardScaler()
X_tr = scaler.fit_transform(X_train).astype("float32")
X_te = scaler.transform(X_test).astype("float32")

nn = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(X_tr.shape[1],)),
    tf.keras.layers.Dense(32, activation="relu"),
    tf.keras.layers.Dense(16, activation="relu"),
    tf.keras.layers.Dense(1, activation="sigmoid"),
])
nn.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
nn.fit(X_tr, y_train, epochs=30, batch_size=32, verbose=0)

y_pred_nn = (nn.predict(X_te, verbose=0).ravel() >= 0.5).astype(int)
print("Keras NN accuracy:", accuracy_score(y_test, y_pred_nn))
print("Confusion matrix:\n", confusion_matrix(y_test, y_pred_nn))

6. Сводная таблица

results = {
    "LogisticRegression": accuracy_score(y_test, y_pred_lr),
    "DecisionTree": accuracy_score(y_test, y_pred_tree),
    "Keras_Dense": accuracy_score(y_test, y_pred_nn),
}
for name, acc in sorted(results.items(), key=lambda x: -x[1]):
    print(f"{name:20s} {acc:.3f}")

Самопроверка: добавьте RandomForestClassifier; сравните coef_ логистической регрессии (после scaler) — какой признак сильнее связан с выживанием? Для Kaggle — сохраните y_pred для test.csv без меток и загрузите submission.


Дальше