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

【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