【Kaggle挑戦記】Spaceship Titanic 攻略 #4:引き算の勝利!項目を削って 0.79120 へスコアアップ
1. 今回の作戦:ノイズを削り、モデルを研ぎ澄ませる
前回の初提出で、0.78723というBaselineを記録しました。しかし、重要度を分析すると「HomePlanet」や「Destination」といった項目が足を引っ張っている(ノイズになっている)可能性が浮上しました。
そこで今回、あえて「新しく何も足さず、効いていない項目を削るだけ」というリストラ作戦を敢行。不純物を排除し、モデルが真に重要なデータだけに集中できる環境を作りました。
2. 【実装】一切の無駄を省いた「リストラ実行コード」全文
重要度の低かった HomePlanet, Destination, VIP を削除し、予測精度に寄与する「主力メンバー」だけに絞り込んだコードです。
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
# 1. データの読み込み
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
# 2. 最小限の前処理(欠損値補完)
# 数値型は中央値で、文字列(object)型は"Unknown"で一律補完
for df in [train, test]:
# 数値列の抽出と補完
num_cols = df.select_dtypes(include=['float64']).columns
df[num_cols] = df[num_cols].fillna(df[num_cols].median())
# 文字列列の抽出と補完
obj_cols = df.select_dtypes(include=['object']).columns
df[obj_cols] = df[obj_cols].fillna('Unknown')
# 3. 特徴量の選択(重要度の低かった3つをリストラ)
# 予測のノイズになっていた HomePlanet, Destination, VIP を排除
features = ["CryoSleep", "Age", "RoomService", "FoodCourt", "ShoppingMall", "Spa", "VRDeck"]
# 学習用データの準備(ダミー変数化で数値へ変換)
X = pd.get_dummies(train[features])
y = train["Transported"]
X_test = pd.get_dummies(test[features])
# 学習データとテストデータの列(次元)を揃える
X, X_test = X.align(X_test, join='left', axis=1, fill_value=0)
# 4. ランダムフォレストで学習(100本の木で構築)
model = RandomForestClassifier(n_estimators=100, random_state=1)
model.fit(X, y)
# 5. 特徴量の重要度(Feature Importances)を表示
importances = pd.DataFrame({
'feature': X.columns,
'importance': model.feature_importances_
}).sort_values('importance', ascending=False)
print("\n New Feature Importances:")
print(importances)
# 6. 提出用ファイルの作成(CSV出力)
predictions = model.predict(X_test)
output = pd.DataFrame({
'PassengerId': test['PassengerId'],
'Transported': predictions
})
output.to_csv('sub_reduced_features.csv', index=False)
print("\n✅ Submission file 'sub_reduced_features.csv' saved.")
3. 【実行結果】研ぎ澄まされた重要度とスコア
結果は予想を上回るポジティブなものでした。MacのターミナルからKaggleへ提出した結果です。
Public Score: 0.79120(前回比 +0.00397)
そして、ターミナルに出力された「主力メンバー」たちの重要度がこちら。
New Feature Importances:
feature importance
4 Spa 0.148013
0 Age 0.139252
2 FoodCourt 0.133334
1 RoomService 0.127555
5 VRDeck 0.124744
7 CryoSleep_True 0.112372
6 CryoSleep_False 0.105997
3 ShoppingMall 0.105874
8 CryoSleep_Unknown 0.002859
4. 考察:引き算がモデルを「覚醒」させた
今回の実験で、「情報の質」が「量」を凌駕することが証明されました。項目を減らしたにも関わらずスコアが上がったのは、モデルがノイズに惑わされなくなり、真に影響力のある「支出額」や「年齢」の境界線をより正確に引けるようになったためです。
特にSpaやVRDeckなどの支出項目の重要度が軒並み上がり、モデルの武器が鋭利になったことがわかります。何も足さずに 0.791 を突破。いよいよ 0.8 の大台が射程圏内に入りました。
「まず削る」。このシンプルなエンジニアリングが、宇宙船のデータに潜む真実を一つ暴きました。次回、筋肉質になったこのモデルに、「新たな筋肉(特徴量)」を足すフェーズへ。攻略は続きます。
PR