【Kaggle挑戦記】Titanic 攻略 #4:ランダムフォレストの正体
第2回では「最短ルート」での初提出を優先し、モデルの選定理由は「なんとなく」進めてきました。ここでは、そこで使用したモデルの正体を明らかにするとともに、その実行過程(個別の判断ルール)を可視化するための改良コードを整理します。
1. 【振り返り】前回のソースコード
まずは、第2回で実際に提出ファイルを生成したベースラインのソースコードを正確に振り返ります。この時点では「Pclass, Sex, SibSp, Parch」の4項目を特徴量としていました。
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. 特徴量の選択と前処理
features = ["Pclass", "Sex", "SibSp", "Parch"]
# get_dummiesでカテゴリ変数(Sex)を数値(Sex_male, Sex_female)に変換
X = pd.get_dummies(train_data[features])
y = train_data["Survived"]
X_test = pd.get_dummies(test_data[features])
# 3. モデルの構築と学習(100本の決定木を作成)
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
# 4. 予測の実行
predictions = model.predict(X_test)
# 5. 提出用ファイルの作成
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('submission.csv', index=False)
print("Your submission was successfully saved!")
2. 手法の解説:二値分類とランダムフォレスト
今回のタイタニック課題は、乗客が「生存したか、死亡したか」という二値分類問題を解くものです。代表的な手法には「ロジスティック回帰」「SVM」「ランダムフォレスト」「勾配ブースティング」などがありますが、今回は安定性が高くベースライン作りに適したランダムフォレストを採択しました。
3. 【改良】実行過程を可視化するソースコード
「100本の木による多数決」という実行プロセスを正確に把握するため、可視化用のライブラリをインポートし、model.fit(X, y) のすぐ下に処理を追加します。
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import export_text # 可視化用のインポートを追加
# --- 前処理・モデル構築(前回と同じ) ---
train_data = pd.read_csv('train.csv')
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
y = train_data["Survived"]
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
# 3. モデルの学習
model.fit(X, y)
# --- model.fit(X, y) の直下に可視化処理を追加 ---
# 100本の木から最初の1本(index=0)を取り出す
estimator = model.estimators_[0]
# 判断ルールをテキスト形式で出力(feature_namesを指定)
tree_rules = export_text(estimator, feature_names=list(X.columns))
print("--- 最初の1本の決定木による判断プロセス ---")
print(tree_rules)
# --- ここまで追加 ---
# 以降、予測の実行(前回と同じ)
# predictions = model.predict(X_test)
実行時の出力サンプル:
--- 最初の1本の決定木による判断プロセス ---
|--- Sex_female <= 0.50
| |--- SibSp <= 2.50
| | |--- Pclass <= 1.50
| | | |--- Parch <= 3.00
| | | | |--- Parch <= 1.50
| | | | | |--- class: 0.0
| | | | |--- Parch > 1.50
| | | | | |--- class: 1.0
| | | |--- Parch > 3.00
| | | | |--- class: 0.0
| | |--- Pclass > 1.50
| | | |--- Parch <= 0.50
| | | | |--- Pclass <= 2.50
| | | | | |--- class: 0.0
| | | | |--- Pclass > 2.50
| | | | | |--- class: 0.0
| |--- SibSp > 2.50
| | |--- class: 0.0
4. 【考察】最も精度の高い木が選ばれるのか?
ここで重要な疑問が浮かびます。「これら100本の木の中から、テストデータに対して最も精度の高い1本が選ばれて予測に使われるのか?」という点です。
答えは「NO」です。ランダムフォレストの本質は「選別」ではなく「合議制(多数決)」にあります。
- アンサンブル学習: 1本の完璧な木を探すのではなく、少しずつ異なる視点を持つ100本の木全員に予測をさせます。
- 多数決の原理: 例えば、60本の木が「死亡」、40本の木が「生存」と予測したら、最終回答は「死亡」となります。
- なぜそうするのか: 1本の優秀すぎる木は、学習データに依存しすぎる(過学習)リスクがあります。多様な視点を持つ木々の平均をとることで、未知のデータに対しても安定した予測が可能になるのです。
手法の実行プロセスと「多数決」の論理を理解したことで、モデルの挙動に対する納得感が得られました。次は第3回で算出した相関係数に基づき、さらなる精度向上を目指します。
PR