Skip to content

Instantly share code, notes, and snippets.

@ackkerman
Created March 7, 2025 11:32
Show Gist options
  • Select an option

  • Save ackkerman/42549575ee2bb5b23ee5f5ff5a7b37b2 to your computer and use it in GitHub Desktop.

Select an option

Save ackkerman/42549575ee2bb5b23ee5f5ff5a7b37b2 to your computer and use it in GitHub Desktop.

Spaceship Titanic コンペティションについて

このノートブックファイル 1_spaceship-titanic/spaceship-titanic-competition-end-to-end-project.ipynb は、Spaceship Titanic データセットを使用したバイナリ分類のための Kaggle コンペティションの包括的なガイドを含んでいます。以下に、内容の詳細な説明を示します。

ノートブックの目的

このプロジェクトの目的は、データセットで提供されるさまざまな特徴を使用して、乗客が別の次元に輸送されるかどうかを予測することです。

ノートブックの内容

  1. データの基本的な理解: データセットの構造と特徴の概要。
  2. 探索的データ分析 (EDA): データの分布と関係を理解するための視覚化と統計分析。
  3. 特徴エンジニアリング: モデルのパフォーマンスを向上させるために、既存の特徴から新しい特徴を作成する。
  4. データ前処理: 欠損値の処理、カテゴリ変数のエンコーディング、数値特徴のスケーリング。
  5. モデル構築: 様々な機械学習モデルの実装。
  6. モデルのパフォーマンスチェック: 精度、適合率、再現率、F1 スコアなどのメトリクスを使用してモデルのパフォーマンスを評価する。
  7. モデルのハイパーパラメータ調整: モデルのパフォーマンスを向上させるためにハイパーパラメータを最適化する。
  8. 最適なモデルを使用してテストデータを予測する: 最もパフォーマンスの良いモデルを使用してテストデータセットを予測する。

主要なセクションとコードスニペット

ライブラリのインポート

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
sns.set(style="darkgrid",font_scale=1.5)
pd.set_option("display.max.rows",None)
pd.set_option("display.max.columns",None)

from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, AdaBoostClassifier, StackingClassifier
from xgboost import XGBClassifier
from catboost import CatBoostClassifier
from lightgbm import LGBMClassifier

from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split, GridSearchCV, RandomizedSearchCV
from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score, confusion_matrix
from sklearn.preprocessing import LabelEncoder, OneHotEncoder, StandardScaler, MinMaxScaler

from imblearn.over_sampling import SMOTE

データセットの読み込み

train_df = pd.read_csv("/kaggle/input/spaceship-titanic/train.csv")
test_df = pd.read_csv("/kaggle/input/spaceship-titanic/test.csv")

データの説明

  • PassengerId: 各乗客の一意の識別子。
  • HomePlanet: 出発した惑星。
  • CryoSleep: 乗客がサスペンデッドアニメーションに入っているかどうかを示す。
  • Cabin: キャビン番号。
  • Destination: 目的地の惑星。
  • Age: 乗客の年齢。
  • VIP: 乗客がVIPサービスを支払ったかどうか。
  • RoomService, FoodCourt, ShoppingMall, Spa, VRDeck: 各アメニティで請求された金額。
  • Name: 乗客の名前。
  • Transported: 乗客が輸送されたかどうかを示すターゲット変数。

データの基本的な理解

  • 次元の確認: トレーニングデータセットとテストデータセットの形状。
  • データの表示: データセットの最初の数行を表示する。
  • 重複の確認: 重複エントリがないことを確認する。
  • データ型の確認: 特徴のデータ型を特定する。
  • 欠損値の確認: 欠損値を特定し、適切に処理する。

探索的データ分析 (EDA)

  • ターゲット特徴の視覚化: Transported 特徴の分布。
  • 年齢特徴の視覚化: Age 特徴の分布。
  • 支出特徴の視覚化: 支出特徴の分布。
  • カテゴリ特徴の視覚化: カテゴリ特徴の分布。

特徴エンジニアリング

  • 新しい特徴の作成: PassengerId, Cabin, Age, 支出特徴から新しい特徴を作成する。
  • 新しい特徴の視覚化: 新しく作成された特徴を視覚化する。

データ前処理

  • 欠損値の処理: 適切な戦略を使用して欠損値を埋める。
  • 重複の確認: 重複エントリがないことを確認する。
  • カーディナリティの確認: 高カーディナリティ特徴を特定する。
  • 特徴のスケーリング: 数値特徴をスケーリングする。
  • 特徴のエンコーディング: カテゴリ特徴をエンコードする。

モデル構築

  • モデルのトレーニング: 様々なモデルをトレーニングし、そのパフォーマンスを評価する。
  • ハイパーパラメータの調整: GridSearchCV を使用して最適なモデルのパフォーマンスを向上させる。
  • スタッキングアンサンブル: 複数のモデルを組み合わせてパフォーマンスを向上させる。

テストデータの予測

  • 予測: 最もパフォーマンスの良いモデルを使用してテストデータセットを予測する。
  • 提出形式: 必要な形式で提出ファイルを準備する。

結論

  • 要約: プロジェクトの主要なポイントと見出しを要約する。
  • フィードバック: 改善のためのフィードバックと提案を求める。

視覚化

ノートブックには、データをよりよく理解するためのさまざまな視覚化が含まれています。例えば:

  • 円グラフ: Transported 特徴の分布。
  • ヒストグラム: Age 特徴の分布。
  • ヒートマップ: モデル評価のための混同行列。
  • 棒グラフ: モデルパフォーマンスの比較。

モデルのパフォーマンス

ノートブックは、複数のモデルを評価し、最もパフォーマンスの良いモデルを選択します。評価されたモデルには以下が含まれます:

  • ロジスティック回帰
  • KNeighborsClassifier
  • サポートベクターマシン
  • ナイーブベイズ
  • 決定木分類器
  • ランダムフォレスト分類器
  • AdaBoost分類器
  • 勾配ブースティング分類器
  • LGBM分類器
  • XGBoost分類器
  • CatBoost分類器

ハイパーパラメータの調整

ハイパーパラメータの調整は、GridSearchCV を使用して最適なモデルのパフォーマンスを向上させるために行われます。

スタッキングアンサンブル

スタッキングアンサンブルは、最もパフォーマンスの良いモデルの予測を組み合わせて、全体のパフォーマンスをさらに向上させるために使用されます。

結論

ノートブックは、主要な見出しと改善のためのフィードバックを求めることで、プロジェクトの要約を締めくくります。

予測ログ

# ローカル パブリック(リーダーボード) モデル パラメータ 特徴量(特記事項) 説明
1 0.76595 0.78232 LogisticRegression random_state=42 All 全ての特徴量を使用し、median/most_frequentの欠損値補完を行ったベースラインモデル。
2 0.76136 N/A LogisticRegression random_state=42 All, TotalSpending, CryoSleep_HomePlanet, CryoSleep_Destination TotalSpending, CryoSleep_HomePlanet, CryoSleep_Destinationの特徴量を追加。精度がわずかに低下。
3 0.76768 N/A LogisticRegression random_state=42 All, TotalSpending, CryoSleep_HomePlanet, CryoSleep_Destination, -PassengerId, -Name PassengerIdとNameを削除。精度がわずかに上昇。
4 0.77631 N/A RandomForestClassifier n_estimators=200 All, TotalSpending, CryoSleep_HomePlanet, CryoSleep_Destination, -PassengerId, -Name, -Cabin, -Cabin_Group, -Cabin_Number, -Cabin_Side, -VIP CabinおよびVIP関連の特徴量を削除。精度がわずかに上昇。
5 0.77918 N/A RandomForestClassifier n_estimators=200 Top 10 features (by RandomForest) RandomForestのfeature importanceで上位10特徴量を選択。精度がわずかに上昇。
6 0.70903 N/A RandomForestClassifier n_estimators=200 Top 1 feature (TotalSpending) TotalSpendingのみを使用した特徴量選択。精度が大幅に低下。
7 0.77343 N/A LogisticRegression random_state=42, max_iter=1000 Top 10 features (by RandomForest) 上位10特徴量を使用してLogisticRegressionに切り替え。RandomForest使用時より精度がわずかに低下。
8 0.78493 N/A RandomForestClassifier n_estimators=400, max_depth=10 Top 10 features (by RandomForest) RandomForestClassifierを(n_estimators=400, max_depth=10)にチューニング。精度がわずかに上昇。
9 0.78723 N/A RandomForestClassifier n_estimators=500, max_depth=10 Top 10 features (by RandomForest) RandomForestClassifierを(n_estimators=500, max_depth=10)にさらにチューニング。精度がわずかに上昇。
10 0.78091 N/A RandomForestClassifier n_estimators=600, max_depth=10 Top 10 features (by RandomForest) RandomForestClassifierを(n_estimators=600, max_depth=10)にさらにチューニング。精度がわずかに低下。

Study Log

2025-03-07

1. 概要

  • 特徴量エンジニアリングとモデルの訓練・評価を繰り返しながら、精度向上を目指す。
  • Local の精度が 8.0 を超えるまで改善を続ける。
  • 考察や分かった事実、検証した仮説は docs/Study.md に随時記入する。
  • サイクルを回すたびに Study.md を確認し、仮説を Update し、より深い仮説を検討する。

2. 過去の検証結果

  • 1回目の試行:

    • 特徴量エンジニアリングなし (ベースラインモデル)
    • Local 精度: 0.76595
  • 2回目の試行:

    • 特徴量: TotalSpending, CryoSleep_HomePlanet, CryoSleep_Destination を追加
    • Local 精度: 0.76136 (わずかに低下)
    • 考察: 新しい特徴量がノイズになっている可能性がある。
  • 3回目の試行:

    • 特徴量: PassengerId, Name を削除
    • Local 精度: 0.76768
    • 考察: PassengerId, Name は不要な情報である可能性がある。

3. 今回の検証

  • 仮説: 家族構成 (人数) が輸送に影響を与える。
  • 仮説: VIP かどうかが輸送に影響を与える。
  • 特徴量エンジニアリング:
    • Cabin から家族の人数を推定する (同じキャビンを共有する人数)。
    • VIP が True か False かをそのまま使用する。
  • 結果:
    • Local 精度: 0.74698 (大幅に低下)
    • 考察:
      • Cabin から家族構成を推定する方法が不正確である可能性がある。
      • VIP が True のサンプルが少なく、モデルが学習できていない可能性がある。
      • 新しい特徴量がノイズになっている可能性がある。

4. 今後の課題

  • Cabin から家族構成を推定する方法を改善する。
  • VIP の情報をより有効活用する方法を検討する。
  • 他の特徴量との組み合わせを検討する。

Trial 4 - Removing Cabin and VIP features

  • Hypothesis: Removing CabinVIP に関連する特徴量を削除すると精度が向上する。
  • Feature Engineering: Cabin, Cabin_Group, Cabin_Number, Cabin_Side, FamilySize, IsVIP を削除。
  • Model: RandomForestClassifier (n_estimators=200)
  • Result: Accuracy = 0.77631 (Slight improvement)
  • Considerations: これらの特徴量を削除したことで、精度がわずかに上昇した。

Trial 5 - Top 10 Features (RandomForest Importance)

  • Hypothesis: RandomForest の feature importance で選ばれた上位 10 の特徴量のみを使用すると精度が向上する。
  • Feature Engineering: RandomForest の feature importance から上位 10 の特徴量を選択。
  • Model: RandomForestClassifier (n_estimators=200)
  • Result: Accuracy = 0.77918 (Slight improvement)
  • Considerations: feature importance に基づく特徴量選択で、精度がわずかに上昇。

Trial 6 - Only TotalSpending Feature

  • Hypothesis: TotalSpending だけを使うことで、この単一特徴量の予測力を評価する。
  • Feature Engineering: TotalSpending のみ使用。
  • Model: RandomForestClassifier (n_estimators=200)
  • Result: Accuracy = 0.70903 (Significant decrease)
  • Considerations: TotalSpending 単独では強力な予測指標にはならない。

Trial 7 - Logistic Regression with Top 10 Features

  • Hypothesis: 上位 10 の特徴量を用いて Logistic Regression に切り替えると精度が向上する、または同等の性能をよりシンプルに得られる可能性がある。
  • Feature Engineering: 過去の試行で選択した上位 10 の特徴量を使用。
  • Model Selection: Logistic Regression (max_iter=1000 で収束を確保)。
  • Results: Accuracy = 0.77343 (同じ特徴量を使った RandomForest よりわずかに低下)
  • Considerations: この特徴量セットでは、RandomForest のほうが精度が高い。

Trial 8 - Tuned RandomForest with Top 10 Features

  • Hypothesis: 上位 10 の特徴量を用いて、n_estimators を増やし max_depth を設定した RandomForestClassifier を使うと精度が向上する。
  • Feature Engineering: RandomForest の feature importance から選択した上位 10 の特徴量を使用。
  • Model Selection: RandomForestClassifier
  • Hyperparameters: n_estimators=400, max_depth=10
  • Results: Accuracy = 0.78493 (Slight improvement)
  • Considerations: ハイパーパラメータのチューニングでわずかに精度が向上した。

Trial 9 - Further Tuned RandomForest with Top 10 Features

  • Hypothesis: n_estimators を 500 に増やし、max_depth=10 を維持することで精度が向上する。
  • Feature Engineering: RandomForest の feature importance から選択した上位 10 の特徴量を使用。
  • Model Selection: RandomForestClassifier
  • Hyperparameters: n_estimators=500, max_depth=10
  • Results: Accuracy = 0.78723 (Slight improvement)
  • Considerations: n_estimators を 500 に増やすことで、精度がわずかに向上した。

Trial 10 - Further Tuned RandomForest with Top 10 Features (n_estimators=600)

  • Hypothesis: n_estimators を 600 に増やし、max_depth=10 を維持することでさらに精度が向上する。
  • Feature Engineering: RandomForest の feature importance から選択した上位 10 の特徴量を使用。
  • Model Selection: RandomForestClassifier
  • Hyperparameters: n_estimators=600, max_depth=10
  • Results: Accuracy = 0.78091 (slightly decreased)
  • Considerations: n_estimators を 600 に増やしても精度は向上せず、わずかに低下した。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment