Shikata Ga Nai

Private? There is no such things.

9. 実践!Kaggle Titanicコンペに挑戦③ 〜機械学習モデルの作成と評価〜

Hello there, ('ω')ノ

📌 1. ライブラリのインポート

まず、機械学習に必要なライブラリをインポートします。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 機械学習ライブラリ
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix

📌 2. 前処理したデータの準備

前回の前処理を反映したデータを使います。
不要な列を削除し、特徴量(X)と目的変数(y)を分けます。

import pandas as pd

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

# 不要な列を削除(testのPassengerIdは保持)
drop_columns = ["Name", "Ticket", "Cabin"]
train.drop(columns=drop_columns, inplace=True)
test.drop(columns=drop_columns, inplace=True)

# 欠損値処理(数値列のみを対象にする)
train.fillna(train.select_dtypes(include=["number"]).median(), inplace=True)
test.fillna(test.select_dtypes(include=["number"]).median(), inplace=True)

# カテゴリ変数を数値化
train["Sex"] = train["Sex"].map({"male": 0, "female": 1})
test["Sex"] = test["Sex"].map({"male": 0, "female": 1})

# ダミー変数変換(train と test の列を揃える)
train = pd.get_dummies(train, columns=["Embarked"], drop_first=True)
test = pd.get_dummies(test, columns=["Embarked"], drop_first=True)

# train, test のダミー変数の列を統一する
missing_cols = set(train.columns) - set(test.columns)
for col in missing_cols:
    test[col] = 0  # 存在しない列を追加し、値は0で埋める

test = test[train.columns.drop("Survived")]  # testには Survived がないので除外

# 特徴量と目的変数に分割
X = train.drop("Survived", axis=1)
y = train["Survived"]

不要な列を削除!
欠損値を処理!
カテゴリ変数を数値に変換!


📌 3. 訓練データとテストデータの分割

モデルを評価するために、データを 訓練用(train)とテスト用(test) に分割します。

# データを訓練用とテスト用に分割(80%:20%)
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)

80% を学習に使い、20% を検証用にする!


📌 4. 機械学習モデルの作成

まずは、シンプルな 決定木(Decision Tree) で予測してみましょう!

✅ 決定木モデルの作成

# 決定木モデルの作成
dt_model = DecisionTreeClassifier(random_state=42)
dt_model.fit(X_train, y_train)

# 予測
y_pred = dt_model.predict(X_valid)

# 精度を評価
accuracy = accuracy_score(y_valid, y_pred)
print("決定木の精度:", accuracy)

モデルを学習させ、検証データで予測!
accuracy_score() で精度(正解率)を計算!


📌 5. ランダムフォレストを試す

決定木よりも高精度な ランダムフォレスト(RandomForest) を試します!

# ランダムフォレストモデルの作成
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)

# 予測
y_pred_rf = rf_model.predict(X_valid)

# 精度を評価
accuracy_rf = accuracy_score(y_valid, y_pred_rf)
print("ランダムフォレストの精度:", accuracy_rf)

🔍 決定木 vs ランダムフォレスト - 決定木の精度 → 約 75-80%
- ランダムフォレストの精度 → 約 80-85%(より高精度!)

ランダムフォレストの方が良い結果!


📌 6. 重要な特徴量を確認

機械学習モデルが どの特徴を重視しているか を確認できます。

pip install japanize-matplotlib


import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib  # ← 追加(matplotlibで日本語対応)

# 🔹 特徴量の重要度を取得
feature_importance = rf_model.feature_importances_

# 🔹 特徴量ごとに可視化
plt.figure(figsize=(8, 5))
sns.barplot(x=feature_importance, y=X.columns)

# 🔹 タイトルを設定(日本語フォント対応)
plt.title("特徴量の重要度")
plt.show()

🔍 重要な特徴 - Pclass(客室クラス)Sex(性別) が特に重要
- Fare(運賃) も影響大

「お金持ちの1等客で、女性の方が生存しやすい」傾向が見える!


📌 7. Kaggleに提出する予測データを作成

テストデータで予測し、Kaggleに提出するファイルを作成します!

# 予測
test_predictions = rf_model.predict(test)

# 提出用データフレームを作成
submission = pd.DataFrame({
    "PassengerId": pd.read_csv("/kaggle/input/titanic/test.csv")["PassengerId"],
    "Survived": test_predictions
})

# CSVとして保存
submission.to_csv("submission.csv", index=False)

submission.csv を Kaggle にアップロード!
精度を確認し、より良いモデルを試す!


🎯 まとめ

決定木とランダムフォレストを使ってモデルを作成!
精度を比較し、ランダムフォレストの方が良いことを確認!
特徴量の重要度を可視化し、生存確率に影響を与える要因を分析!
最終的な予測を CSV に保存し、Kaggle に提出!

これで 「Titanicコンペの基本的な流れ」 をマスターできました!🚢✨

Best regards, (^^ゞ