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

【Kaggle挑戦記】Titanic 攻略 #6:モデルの「合議制」を強化し、精度向上の実験へ

前回(攻略 #5)では、生存率と相関の強かった「Fare(運賃)」を特徴量に加え、スコアを 0.76749 → 0.77511 へと上昇させることに成功しました。今回は、さらに精度を上げるための「次の一手」を、エンジニアらしく最小の工数で検証します。

1. これまでの復習

まずは、現在の私たちの武器(モデル構成)を整理しておきます。

  • 利用した特徴量(5項目): Pclass, Sex, SibSp, Parch, Fare
    (生存に直結する納得感のあるヒントを投入済みです)
  • 利用したアルゴリズム: ランダムフォレスト(Random Forest)
    (攻略 #4 で中身を覗いた、100本の決定木による「合議制」モデルです)

2. 今回の戦略:精度向上の実験

さらなる精度向上を狙うにあたり、今回は「木の数(n_estimators)」を変更する実験を行います。検討の理由は以下の通りです。

  1. 木の深さ(max_depth)の限界:
    現在は特徴量が5項目と少なく、これ以上深く掘り下げても学習データへの過剰適合(過学習)を招くリスクが高いと判断しました。
  2. 多数決(合議制)の強化:
    判断材料が限られている現状では、個々の木の判断をより多くの「仲間」で補完し、予測のブレを最小限に抑える(多数決の精度を上げる)ほうが、スコア向上への確実な一手になると仮説を立てました。

3. 【実験】木の数を 100 → 500 へ増強

具体的には、`RandomForestClassifier` を定義している一行にある n_estimators という引数を書き換えます。これは「アンサンブル(合議制)に参加させる木の数」を指定するパラメータです。

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. 特徴量の選択(前回と同じ5項目)
features = ["Pclass", "Sex", "SibSp", "Parch", "Fare"]
X = pd.get_dummies(train_data[features])
y = train_data["Survived"]

X_test = pd.get_dummies(test_data[features])
X_test['Fare'] = X_test['Fare'].fillna(X_test['Fare'].median())

# 3. モデルの構築(★ここを修正!)
# 【変更前】 model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model = RandomForestClassifier(n_estimators=500, max_depth=5, random_state=1)

# 4. モデルの学習(書き換えた設定で再計算)
model.fit(X, y)

# 5. 予測の実行
predictions = model.predict(X_test)

# 6. 提出用ファイルの作成
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('submission_n500.csv', index=False)
print("Submission with 500 trees saved!")

修正のポイント:
`n_estimators=100` を `n_estimators=500` に変更しました。これにより、100本の多数決から500本の多数決へと「合議制」がパワーアップします。修正はこの1箇所のみ。極めて手間の少ない「次の一手」です。

4. 考察と実験結果

ここでエンジニアとして一つの疑問が湧きます。「教師データが約800件しかないのに、木の数を500本にするのは多すぎる(リソースの無駄)ではないか?」という点です。

結論から言うと、アンサンブル学習において「合議の数(木の数)」を増やすことは、計算コスト以外のデメリット(精度低下のリスク)はありません。それぞれの木が重複を許して抽出された異なるデータセットを学習するため、数を増やすほど予測は安定する方向に向かいます。

さて、注目の実験結果は以下の通りでした。

  • 前回(100本): Score 0.77511
  • 今回(500本): Score 0.77511(変化なし)

エンジニア的な結論:
残念ながら、今回のパラメータ変更だけではスコアはピクリとも動きませんでした。これは、現在の5つの特徴量から引き出せるパターンは、すでに100本の多数決で「出し尽くされている」ということを意味します。計算式をいじっても限界があることが証明されました。


仮説と検証の結果、次なる道が明確になりました。これ以上「既存のヒントの計算」を強化しても意味がありません。次は、いよいよ「Age(年齢)」という新しいヒント(特徴量)の投入、そしてそのための「欠損値処理」という、より高度な前処理へと進みます。


PR