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

【Kaggle挑戦記】Titanic 攻略 #5:特徴量への Fare(運賃)追加と精度向上

これまでの攻略を経て、私たちは重要な2つの結論を導き出しました。

  • #3 の結論(データ分析): 相関分析の結果、生存率に最も影響を与えるのは「性別(Sex)」だが、それに次いで「運賃(Fare)」も強い相関があることが判明。
  • #4 の結論(モデル理解): ランダムフォレストの内部を可視化した結果、100本の木による「合議制(多数決)」が論理的に機能していることを確認。

今回の戦略は極めてシンプルです。
「信頼できるアルゴリズム(#4)に、より生存率と関連の深いデータ項目(#3)を投入すれば、予測精度は向上するはずだ」
という仮説を検証します。

1. 「特徴量(とくちょうりょう)」への納得感

AIの予測ヒントにするデータ項目を「特徴量」と呼びますが、今回選んだ項目には人間が見ても直感的な納得感があります。

  • Pclass(客室クラス): 1等客なら避難が優先されたのではないか?
  • Sex(性別): 女性が優先的に救命ボートに乗ったのではないか?
  • Fare(運賃): 高い運賃を払ったVIP客ほど、手厚いサポートがあったのではないか?

このように、背景にあるストーリーとデータが結びつくことで、AIの予測モデルはより説得力のあるものになります。

2. 【実装】特徴量を 5 項目に増強したソースコード

これまでの 4 項目に、相関係数の高かった "Fare"(運賃) を追加します。テストデータ(test.csv)に1件だけ存在する「欠損値(空欄)」を中央値で埋める対策も1行追加しています。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

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

# 2. 特徴量の選択(Fare を追加して 5 項目に!)
features = ["Pclass", "Sex", "SibSp", "Parch", "Fare"]

# カテゴリ変数(Sex)を数値に変換
X = pd.get_dummies(train_data[features])
y = train_data["Survived"]

# 重要:テストデータの Fare に1件だけある欠損値を中央値で補完する
X_test = pd.get_dummies(test_data[features])
X_test['Fare'] = X_test['Fare'].fillna(X_test['Fare'].median())

# 3. モデルの構築と学習(#4 で信頼性を確認したランダムフォレスト)
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)

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

# 5. 提出用ファイルの作成
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('submission_fare.csv', index=False)
print("Submission with Fare saved!")

3. 結果の考察:データ項目増加の効果

実際にこのコードで予測を行い Kaggle に提出したところ、スコアに以下の変化が現れました。

  • 4 項目(前回): Score 0.76749
  • 5 項目(今回): Score 0.77511(微増!)

考察:
わずかな向上ですが、エンジニアリングにおける重要な原則「良質なデータを入れれば、良質な結果が出る」ことが実証されました。アルゴリズム自体は変えなくても、納得感のある「特徴量」を正しく追加することで、着実に正解率が上がることが確認できました。


仮説は正しかったと言えます。しかし、まだ生存率に大きく関わりそうなデータ項目が残っています。それは「年齢(Age)」です。ただし、年齢データには「欠損値」が非常に多いという大きな壁があります。次回、この欠損値処理(インピュテーション)に挑戦します。


PR