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.