【Kaggle挑戦記】Spaceship Titanic 攻略 #3:丸腰で初提出 0.78723。重要度から見えた「金」と「運命」の相関
Titanicでの反省を活かし、今回のSpaceship Titanicでは「最初から作り込まない」Baseline構築作戦を敢行しました。Macのターミナルで最小限の前処理コードを走らせ、いきなり提出まで完走。その結果、驚くべき事実が見えてきました。
1. 【実装】一切の細工を排した初手コード
まずは「機械学習モデルがエラーを吐かずに動くこと」だけを目的とした最短コードです。数値の欠損は中央値で、文字列は"Unknown"で埋め、一気にダミー変数化(数値化)しました。
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. 最小限の前処理(欠損値補完)
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. 特徴量の選択と数値化
features = ["HomePlanet", "CryoSleep", "Destination", "Age", "VIP", "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. 学習・重要度の算出・予測
model = RandomForestClassifier(n_estimators=100, random_state=1)
model.fit(X, y)
# 重要度の出力
importances = pd.DataFrame({'feature': X.columns, 'importance': model.feature_importances_}).sort_values('importance', ascending=False)
print(importances.head(10))
# 5. 提出用ファイル出力
predictions = model.predict(X_test)
pd.DataFrame({'PassengerId': test['PassengerId'], 'Transported': predictions}).to_csv('baseline_submission.csv', index=False)
2. 【実況】初提出スコアとターミナル出力
Macのターミナルを叩き、生成されたファイルをKaggleへ。返ってきたスコアは驚きの数値でした。
Public Score: 0.78723
そして、ターミナルが表示した「予測に貢献した項目(Feature Importances)」がこちらです。
Feature Importances (Top 10):
feature importance
0 Age 0.170933
4 Spa 0.128971
5 VRDeck 0.117302
1 RoomService 0.112501
2 FoodCourt 0.110814
3 ShoppingMall 0.101754
10 CryoSleep_False 0.077724
11 CryoSleep_True 0.074114
6 HomePlanet_Earth 0.032070
7 HomePlanet_Europa 0.019907
3. 分析:この宇宙船は「金」と「眠り」が支配している
このランキング結果は、Titanicとは全く異なる宇宙船のルールを教えてくれました。
- 支出額が運命を分ける: 2位から6位まで、船内の娯楽施設(Spa, VRDeck等)への支払額が独占しています。豪華なサービスを受けていたかどうかが、転送(Transported)に直結しているという生々しい現実が見えます。
- 年齢(Age)はやはり最強: 最も影響力があるのは年齢でした。これは世代間の何らかの傾向を示唆しています。
- 冷凍睡眠(CryoSleep)の重要性: 文字通り、寝ていたかどうかも生存に大きく関わっています。
- 出身星(HomePlanet)の影の薄さ: EarthやEuropaといった出身地の項目は、支出額に比べれば重要度が1/5〜1/10程度しかありません。
4. 次の作戦:貢献度の低い特徴量を「リストラ」する
Baselineが 0.787 という高い位置にセットされた今、次の一手は「引き算の美学」です。 今回の結果で重要度が低かった HomePlanet や Destination(目的地)などをあえて外し、モデルから「ノイズ」を排除します。
さらに、バラバラになっている「支出額」を合計した「TotalSpend」という新項目を作ることで、モデルに本質的な判断材料を与える。過学習を避けつつ、スコアを 0.8 の先へ押し上げる戦いが始まります。さあ、頑張ろう!
一切の細工をしないからこそ、データの真実が浮かび上がる。これがKaggleの醍醐味です。次回、特徴量のリストラ編へ。
PR