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

【Kaggle挑戦記】Titanic 攻略 #7:データクレンジングの深化(Age の欠損値補完)

前回(攻略 #6)の実験では、アルゴリズムのパラメータ(木の数)を増やすという「計算側の工夫」を行いましたが、結果は無情にもスコアに変化なし。エンジニアとして、現在の材料(特徴量)だけでは限界に達したことを確認しました。

1. これまでの振り返り

現在の私たちの立ち位置を整理します。これまでは、極めてシンプルなデータ処理に留まっていました。

  • 利用した特徴量: Pclass, Sex, SibSp, Parch, Fare(計5項目)
  • 利用したアルゴリズム: ランダムフォレスト(Random Forest)
  • 前回の実験: 木の数を 100 → 500 へ増強したが、Score 0.77511(変化なし)

この結果から導き出されるロジカルな結論は、「計算式をいじくり回すよりも、モデルに与える『新しいヒント(特徴量)』を増やすべきだ」ということです。

2. 今回のターゲット:Age(年齢)の救出

生存率に大きく関与しているはずなのに、これまで無視してきたデータがあります。それが Age(年齢) です。無視していた理由は、データの約20%が空欄(欠損値)であり、そのままでは機械学習にかけられないからです。

今回は、この欠損値を「単なる全体平均」で埋めるのではなく、データの背景を洞察した「属性別の層別補完」という手法で救い出します。

3. 【戦略】性別 × 客室クラス別の中央値で補完

「1等客の男性」と「3等客の女性」では、明らかに年齢層が異なります。そこで、Pclass(客室クラス)と Sex(性別)を掛け合わせたグループごとに中央値を算出し、より実態に近い値を穴埋めします。

# 【実装】性別×客室クラスごとの中央値で Age の欠損値を埋める
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'))

4. 実験結果:0.77511 → 0.77990 へ上昇!

Ageを特徴量に加えて再学習させた結果、ついにスコアが動きました。

  • 前回(Ageなし): Score 0.77511
  • 今回(Ageあり): Score 0.77990

エンジニア的な考察:
「少ししか上がらないな」というのが正直な感想ですが、前回のパラメータ調整ではピクリとも動かなかったスコアが、データのクレンジングによって確実に前進しました。これは、モデルが「Women and Children First(婦女子優先)」という歴史的背景を、より正しく理解し始めた証拠と言えます。


「質の高いヒント」を投入することで、停滞していた壁をわずかながら突破しました。しかし、まだ 0.78 の大台には届いていません。次はさらに踏み込み、名前(Name)に含まれる敬称から「社会的地位」や「未婚・既婚」を抽出する、より高度な特徴量エンジニアリングが必要かもしれません。



PR