ステップ13:完成コード全文(コピペ用)

この章でやったことを、1つのセルにまとめたものです。

  • 途中で迷子になったとき
  • 最初からやり直したいとき
  • 次回、ゼロから再現したいとき

新しいセルにこれを丸ごと貼って Shift + Enter するだけで、提出ファイルまで完成します。


完成版(特徴量エンジニアリング込み)

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

# ---------- 1. データを読み込む ----------
train = pd.read_csv("/kaggle/input/titanic/train.csv")
test  = pd.read_csv("/kaggle/input/titanic/test.csv")

# ---------- 2. 空欄を埋める値を学習データから決める ----------
age_median  = train["Age"].median()     # 28.0
fare_median = train["Fare"].median()    # 14.4542

# ---------- 3. 前処理と特徴量づくり ----------
def prepare(df):
    df = df.copy()

    # 文字 → 数字
    df["Sex"] = df["Sex"].map({"male": 0, "female": 1})
    df["Embarked"] = df["Embarked"].fillna("S").map({"S": 0, "C": 1, "Q": 2})

    # 空欄を埋める
    df["Age"]  = df["Age"].fillna(age_median)
    df["Fare"] = df["Fare"].fillna(fare_median)

    # 家族の人数
    df["FamilySize"] = df["SibSp"] + df["Parch"] + 1
    df["IsAlone"]    = (df["FamilySize"] == 1).astype(int)

    # 名前から敬称を取り出す
    t = df["Name"].str.extract(r" ([A-Za-z]+)\.")[0]
    t = t.replace(["Mlle", "Ms"], "Miss").replace(["Mme"], "Mrs")
    t = t.where(t.isin(["Mr", "Miss", "Mrs", "Master"]), "Rare")
    df["Title"] = t.map({"Mr": 0, "Miss": 1, "Mrs": 2, "Master": 3, "Rare": 4})

    return df

features = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked",
            "FamilySize", "IsAlone", "Title"]

X      = prepare(train)[features]
y      = train["Survived"]
X_test = prepare(test)[features]

print("X:", X.shape, " X_test:", X_test.shape)
print("空欄:", X.isnull().sum().sum(), X_test.isnull().sum().sum())

# ---------- 4. 学習前にCVで実力を測る ----------
model = RandomForestClassifier(n_estimators=300, max_depth=6, random_state=0)
cv = cross_val_score(model, X, y, cv=5, scoring="accuracy")
print("CVスコア:", cv.mean().round(4), cv.round(4))

# ---------- 5. 学習して予測する ----------
model.fit(X, y)
pred = model.predict(X_test)

# ---------- 6. 提出ファイルを作る ----------
submission = pd.DataFrame({
    "PassengerId": test["PassengerId"],
    "Survived": pred
})
submission.to_csv("submission.csv", index=False)

print("提出ファイル:", submission.shape)
submission.head()

✅ こう出れば成功

X: (891, 10)  X_test: (418, 10)
空欄: 0 0
CVスコア: 0.835 前後
提出ファイル: (418, 2)

あとは Save Version → Save & Run All (Commit) → Output の submission.csv を Submit です。


最小版(とにかく提出だけしたい人向け)

機械学習すら使わない、5行で提出まで行く版です。

import pandas as pd

test = pd.read_csv("/kaggle/input/titanic/test.csv")
pred = (test["Sex"] == "female").astype(int)

pd.DataFrame({"PassengerId": test["PassengerId"], "Survived": pred}) \
  .to_csv("submission.csv", index=False)

スコアは 0.76555 になります。


確認用コード(提出前のチェック)

提出前にこれを実行すると、形式ミスをほぼ防げます。

sub = pd.read_csv("submission.csv")

print("行数      :", len(sub),                "→ 418 ならOK")
print("列名      :", sub.columns.tolist(),    "→ ['PassengerId', 'Survived'] ならOK")
print("空欄      :", sub.isnull().sum().sum(), "→ 0 ならOK")
print("Survivedの値:", sub['Survived'].unique(),   "→ 0 と 1 だけならOK")
print("先頭ID    :", sub['PassengerId'].iloc[0], "→ 892 ならOK")

次に差し替えてみると面白い部分

場所試すこと
RandomForestClassifier(...)max_depth を 4 / 5 / 8 に変えてCVを比べる
features列を1つ減らして、CVが下がるか確かめる
prepare()新しい列を1つ追加する(ステップ11 のヒント参照)
モデルそのものfrom sklearn.linear_model import LogisticRegression に差し替える(fit/predict はそのまま使えます)

💡 1回の実験で変えるのは1箇所だけ。 同時に2つ変えると、どちらが効いたのかわからなくなります。