【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)に含まれる敬称から「社会的地位」や「未婚・既婚」を抽出する、より高度な特徴量エンジニアリングが必要かもしれません。