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

【Kaggle挑戦記】Titanic 攻略 #9:名前(Name)による救出作戦と、裏目に出た結果

前回(攻略 #8)では、「12歳以下の子供フラグ(IsChild)」を導入した結果、スコアが 0.77990 → 0.77751 へと下落しました。この原因を「中央値補完によって大人扱いされた子供がノイズになった」と仮説を立て、今回は名前(Name)に含まれる確定情報を用いてその矛盾の解消を試みました。

1. 今回のロジック:名前と年齢のハイブリッド判定

Ageが欠損していた乗客に対し、一律の中央値で補完したことで生じた「誤判定」を上書きするのが今回の狙いです。以下の条件のいずれかを満たす場合に「真の子供(IsChild_Final)」と定義しました。

  • 条件A: 年齢(Age)が12歳以下である。
  • 条件B: 名前(Name)の中に、男の子を示す敬称 "Master." が含まれている。

名前に "Master" とあれば、たとえAgeが空欄で中央値(例:25歳)が割り当てられていても、確実に子供として救出できる計算です。論理的には、前回よりも情報の精度は高まっているはずでした。

2. 【実装】コード全文

前回(#8)からの変更点(OR条件によるフラグ作成)を反映した全文です。

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. Age の中央値補完(攻略 #7 継承)
group_cols = ['Pclass', 'Sex']
train_data['Age'] = train_data['Age'].fillna(train_data.groupby(group_cols)['Age'].transform('median'))
test_data['Age'] = test_data['Age'].fillna(test_data.groupby(group_cols)['Age'].transform('median'))
test_data['Fare'] = test_data['Fare'].fillna(test_data['Fare'].median())

# 3. 【攻略 #9 での変更点】真の子供フラグ(IsChild_Final)の作成
# ---------------------------------------------------------
# 年齢(Age)が12歳以下、または名前(Name)に "Master" を含む場合にフラグを立てる
# ---------------------------------------------------------
train_data['IsChild_Final'] = ((train_data['Age'] <= 12) | (train_data['Name'].str.contains('Master'))).astype(int)
test_data['IsChild_Final'] = ((test_data['Age'] <= 12) | (test_data['Name'].str.contains('Master'))).astype(int)

# 4. 特徴量の選択
features = ["Pclass", "Sex", "Age", "IsChild_Final", "SibSp", "Parch", "Fare"]

X = pd.get_dummies(train_data[features])
y = train_data["Survived"]
X_test = pd.get_dummies(test_data[features])

# 5. モデルの学習(500本維持)
model = RandomForestClassifier(n_estimators=500, max_depth=5, random_state=1)
model.fit(X, y)

predictions = model.predict(X_test)
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('submission_master_rescue.csv', index=False)

3. 実験結果:さらなるスコア下落(0.77511)

期待に反し、スコアは前回の 0.77751 からさらに下がり、0.77511 となりました。精度を高めるための「Master救出作戦」でしたが、結果としては裏目に出た形です。

4. 考察:なぜ「正しいはずの情報」でスコアが落ちるのか

論理的に正しいはずのフラグを追加してスコアが落ちる場合、以下の可能性が考えられます。

  • 過学習(Overfitting): 「Master = 生存」という強いルールを学習しすぎた結果、テストデータに含まれる「不幸にも助からなかった Master」を正しく予測できなくなった。
  • 情報の競合: すでに Age や Parch(親子数)から「子供」であることをモデルが把握していた場合、新しいフラグの追加が判断のノイズになり、木構造が不安定になった。

「フラグを立てれば立てるほど良くなる」というわけではないのが、機械学習の難しさです。これまでは「子供」という一点にのみ執着してきましたが、その偏った視点自体が現在の停滞を招いているのかもしれません。


次は、子供(Master)だけでなく、未婚女性(Miss)や既婚女性(Mrs)、成人男性(Mr)といった「すべての敬称」を網羅的に数値化し、よりフラットな視点で特徴量エンジニアリングを進めていきます。特定の属性に固執せず、全体像を捉え直すことが 0.78 突破への道かもしれません。


PR