忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【Kaggle挑戦記】Titanic 攻略 #2:最短ルートで初提出(Submit)まで駆け抜ける

前回、データを読み込むところまで成功しました。今回は精度を一旦度外視し、「最短で予測結果を Kaggle に提出(Submit)すること」を目標にします。分析の世界では、まず一度最後まで通してみることが、全体の流れを把握する近道です。

1. 準備:環境構築とデータの再確認

まずは必要なライブラリの導入と、前回ロードしたデータの状態を再読込して準備を整えます。

[ ターミナルでのインストール ]
conda install scikit-learn

[ ライブラリのインポートとバージョン確認 ]
import pandas as pd
import sklearn
print(sklearn.__version__) # 1.7.2 であることを確認

[ データの読み込み(前回の復習) ]
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')

2. 現状把握:AIの「計算」を阻害する Null を特定する

データを読み込んだら、次にすべきはデータの「健康診断」です。プログラムの演算を停止させたり、予測不能に陥らせたりする「Null(欠損値)」「文字列(Object型)」を特定します。

【 1. Null の確認:isnull() と sum() の組み合わせ 】

データセット内に値が存在しない状態を Null と呼びます。pandas の isnull() 関数を実行すると、全データに対して「Null なら True(1)」「値があれば False(0)」というブール値(論理値)のデータセットが内部で生成されます。

これに sum() を繋げることで、True(1) の数を合計し、各項目にいくつ Null が含まれているかを一気に集計できる仕組みです。

# 各項目に含まれる Null の数を集計
print(train_df.isnull().sum())

[ 実行結果 ]
Age 177 # ← 177件の Null(年齢不明)
Cabin 687 # ← 687件の Null(客室不明)
Embarked 2 # ← 2件の Null(港不明)

→ 数値が入るべき場所に値がない(Null)状態では、AIモデルが数学的な行列演算を行えずエラーとなります。何らかの値で埋めるか、除外する判断が必要です。

【 2. データ型(dtypes)の確認:数値化が必要な項目 】

# データの型を確認
print(train_df.dtypes)

[ 実行結果 ]
Name object
Sex object # ← 文字列型。数値への変換が必須
Embarked object # ← 文字列型。数値への変換が必須

object 型と表示される項目は、そのままではモデルの学習には使えません。

3. 最短の「前処理」:AIが読める形に整える

特定した課題に対し、今回は「最短完走」を優先して以下の処理を施します。object 型のうち、今回の予測に採用する Sex のみ数値に置換します。

# 1. 欠損値を埋める(Fare:運賃 などの空欄を中央値で補完)
# ※学習項目に使わない Age や Cabin の Null は一旦放置します
test_df['Fare'] = test_df['Fare'].fillna(test_df['Fare'].median())

# 2. 文字列を数値に変換(Sex を male=0, female=1 に変換)
# ※Embarked も object型ですが、今回は特徴量に含めないため変換をスキップします
train_df['Sex'] = train_df['Sex'].replace({'male': 0, 'female': 1})
test_df['Sex'] = test_df['Sex'].replace({'male': 0, 'female': 1})

4. 学習と予測:標準モデル「ランダムフォレスト」

予測モデルには、強力で使い勝手の良い RandomForestClassifier を使用します。

from sklearn.ensemble import RandomForestClassifier

# Pclass(チケットクラス)、Sex(性別)、SibSp(兄弟・配偶者数)、Parch(両親・子供数)を使用
# これらは Null がなく、かつ数値化が済んでいる項目です
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = train_df[features]
y = train_df["Survived"]
X_test = test_df[features]

# モデル作成・学習
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)

# 予測実行
predictions = model.predict(X_test)

5. 出力結果の確認:submission.csv の中身

予測が完了すると、Kaggle 提出用の CSV ファイルが生成されます。中身を確認すると、テストデータの乗客(PassengerId 892番〜)に対して、AIが導き出した「生存(1) / 死亡(0)」のフラグが並んでいることがわかります。

PassengerId,Survived
892,0
893,1
894,0
895,0
896,0
897,0
898,1

6. 実践:Kaggle へのアップロードとスコア確認

作成した submission.csv を Kaggle に提出する最終ステップです。

  1. Titanic コンペのページ右上にある青い [Submit Predictions] ボタンをクリックします。
  2. 専用の提出ページに移動するので、画面中央の「Upload files」エリアに submission.csv をドラッグ&ドロップします。
  3. 右下の [Submit] をクリックします。

数秒後、同じ画面上に以下の結果が表示されます。

submission.csv
Complete · Just now
Score: 0.76794

【 自分の順位を確認する 】

提出履歴から Leaderboard(順位表)へ移動し、自分の立ち位置を確認してみましょう。

9065 XXXX(私の登録名)
Score: 0.76794

順位表を見ると、トップ層には Score 1.00000(正解率100%) がズラリと並んでいます。今の自分とはまだ距離がありますが、最短ルートで完走したことで、戦いの舞台には上がりました。ここからロジックを磨き、上位へと食い込んでいきましょう。頑張ろう、エンジニア諸君!

7. 最短完走:全ソースコード

ここまでの手順を一つにまとめた、提出用ファイルを生成するための全コードです。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

# 1. データの読み込み
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')

# 2. 最小限の前処理
test_df['Fare'] = test_df['Fare'].fillna(test_df['Fare'].median())
train_df['Sex'] = train_df['Sex'].replace({'male': 0, 'female': 1})
test_df['Sex'] = test_df['Sex'].replace({'male': 0, 'female': 1})

# 3. 予測モデルの作成
# 項目:チケットクラス、性別、兄弟配偶者数、親子数(これらはNullなし・数値済み)
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = train_df[features]
y = train_df["Survived"]
X_test = test_df[features]

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)

# 4. 予測と保存
predictions = model.predict(X_test)
output = pd.DataFrame({'PassengerId': test_df.PassengerId, 'Survived': predictions})
output.to_csv('submission.csv', index=False)

print("Your submission was successfully saved!")

8. まとめ

今回の最短攻略ソースはこれでした!「なぜエラーが出るのか」「何を直すべきか」を特定し、最短で Kaggle にコミットするサイクルを完走しました。これだけで、あなたも立派な Kaggler の仲間入りです。

次回は、今回あえてスルーした「年齢(Age)」の Null をどう埋めるべきか、あるいは「港(Embarked)」をどうモデルに組み込むか。精度向上のための「EDA(探索的データ分析)」に挑戦しましょう!

PR