【Kaggle】Titanicデータを XGBoost, LightGBM, CatBoost で分析してみる

GBDT(Gradient Boosting Decision Tree)を使ってみたかったのでメモ。
KaggleのTitanicデータを予測してみる。

scikit-learnに準拠した model.fit(データ) で記載。
あまりパラメタいじらず&Cross Validateせずでも Catboost は Score:0.78 が出た。
n_estimaternum_boost_round )はでっかい値にして、early_stopping_rounds で切った。

前処理


前回記事と同じ。Embarkedはダミー変数に変更。

import numpy as np 
import pandas as pd
from scipy import stats
from sklearn import model_selection
 
#-- import
train = pd.read_csv("../input/titanic/train.csv")
test = pd.read_csv("../input/titanic/test.csv")
###--- 欠損処理
train["Age"] = train["Age"].fillna(train["Age"].median()) #--中央値で補完
train["Embarked"] = train["Embarked"].fillna(train["Embarked"].mode().iloc(0)) #-- 最頻値で補完 
test["Age"] = test["Age"].fillna(test["Age"].median()) #--中央値で補完
test["Fare"] = test["Fare"].fillna(test["Fare"].median()) #--中央値で補完
 
###--- カテゴリの数値化
train["Sex"] = train["Sex"].map({'male':0, 'female':1})
train = pd.get_dummies(train, columns=['Embarked'])
test["Sex"] = test["Sex"].map({'male':0, 'female':1})
test = pd.get_dummies(test, columns=['Embarked'])
###--- データ分割
Xval = ["Pclass", "Sex", "Age", "Fare", "Embarked_C", "Embarked_Q", "Embarked_S"]
df_y = train["Survived"].values
df_X = train[Xval].values
train_X, valid_X, train_y, valid_y = model_selection.train_test_split(df_X, df_y, random_state=19)
test_X = test[Xval].values


XGBoost (eXtreme Gradient Boosting)


XGBoost Python Package — xgboost 1.5.0-dev documentation

import xgboost as xgb
from sklearn.metrics import accuracy_score
 
#-- モデル
xgb = xgb.XGBClassifier(max_depth = 10
                        ,learning_rate = 0.01
                        ,n_estimators = 100000
                        ,objective = "binary:logistic"
                        ,eval_metric = "logloss"
                        ,random_state = 19
                       )
 
#-- 学習
xgb.fit(train_X, train_y
        ,eval_set = [(valid_X, valid_y)]
        ,early_stopping_rounds = 100, verbose = 10
       )
 
#-- バリデーションデータで予測&正解率算出
pred = xgb.predict(valid_X)
print('score', accuracy_score(valid_y, pred))
 
#-- テストデータで予測
pred_y = xgb.predict(test_X)


Score
- Valid: 0.8565022421524664
- Test: 0.75837

LightGBM


lightgbm.LGBMClassifier — LightGBM 3.2.1.99 documentation

import lightgbm as lgb
from sklearn.metrics import accuracy_score
 
#-- モデル
lgb = lgb.LGBMClassifier(n_estimators = 100000, objective = 'binary')
 
#-- 学習
gbm.fit(train_X, train_y
        ,eval_set = [(valid_X, valid_y)]
        ,early_stopping_rounds = 100, verbose = 10
       )
 
#-- バリデーションデータで予測&正解率算出
pred = gbm.predict(valid_X, num_iteration = gbm.best_iteration_)
print('score', accuracy_score(valid_y, pred))
 
#-- テストデータで予測
pred_y = gbm.predict(test_X, num_iteration = gbm.best_iteration_)


Score
- Valid: 0.8565022421524664
- Test: 0.76315


CatBoost


Usage examples - CatBoost. Documentation

from catboost import CatBoostClassifier
from sklearn.metrics import accuracy_score
 
#-- モデル
cbc = CatBoostClassifier(num_boost_round = 10000
                         ,depth = 10
                         ,learning_rate = 0.01 
                         ,eval_metric = 'Accuracy'
                         ,loss_function = 'Logloss'
                        )
 
#-- 学習
cbc.fit(train_X, train_y
        ,eval_set = [(valid_X, valid_y)]
        ,early_stopping_rounds = 100, verbose = 10
       )
 
#-- バリデーションデータで予測&正解率算出
pred = cbc.predict(valid_X)
print('score', accuracy_score(valid_y, pred))
 
#-- テストデータで予測
pred_y = cbc.predict(test_X)


Score
- Valid: 0.8565022421524664
- Test: 0.78229


参考


【Python覚書】XGBoostで多値分類問題を解いてみる | ポテサラ
【Python覚書】アンサンブル学習:XGBoost、LightGBM、CatBoostを組み合わせる(その1) | ポテサラ
XGBoost論文を丁寧に解説する(1) - Qiita
XGBoost論文を丁寧に解説する(2): ShrinkageとSubsampling - Qiita
GBDT系の機械学習モデルであるXGBoost, LightGBM, CatBoostを動かしてみる。 - Qiita
GBDT系の機械学習モデルのパラメータチューニング奮闘記 ~ CatBoost vs LightGBM vs XGBoost vs Random Forests ~ その1 - Qiita
XGBoostのScikit-Learn APIでearly stoppingを利用する - おおかみ山
XGBoostパラメータのまとめとランダムサーチ実装 - Qiita
なぜn_estimatorsやepochsをパラメータサーチしてはいけないのか - 天色グラフィティ
Python: CatBoost を使ってみる - CUBE SUGAR CONTAINER
PythonでCatBoostの解説 – S-Analysis
Pythonでデータ分析:XGboost - データサイエンティスト(仮)
Pythonでデータ分析:Catboost - データサイエンティスト(仮)
Pythonでcatboostを使ってみる - Qiita

本ブログは個人メモです。 本ブログの内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。