GBDT(Gradient Boosting Decision Tree)を使ってみたかったのでメモ。
KaggleのTitanicデータを予測してみる。
scikit-learnに準拠した model.fit(データ)
で記載。
あまりパラメタいじらず&Cross Validateせずでも Catboost は Score:0.78
が出た。
n_estimater
( num_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