LoginSignup
2
3

More than 3 years have passed since last update.

【機械学習】XGboostを勉強してみる

Last updated at Posted at 2020-03-03

XGBoostの概要

XGBoostは "eXtreme Gradient Boosting" の略であり、勾配ブースティングを使ったツリーのアンサンブル学習です。その優れた性能と速さから、KaggleやKDDCupなどで上位の成績を修めたモデルにもよく使われています。実際2015年のKaggleコンペでは29の優勝モデルのうち、17モデルがXGBoostを使ったモデルでした。

XGBoostのアルゴリズム

目的変数の推定方法

Screenshot 2020-03-03 at 17.15.13.png

\widehat {y}_i=\phi \left( x_{i}\right) =\sum ^{K}_{k=i}f_{x}\left( x_{i}\right) ,f_{k}\in F
F =\{f\left( x\right) = 
 W_q \left(x)\right \}\left(q:R^{m}\rightarrow T, w\in R^{T}\right)

$F$は決定木(CART)の空間を表しています。各ツリーで求めらられたスコアをクラスごとに集計し、$\widehat {y}_i$を求めます。$K$はスコアを足す際に使われる関数です。

モデルの評価と学習方法

モデルの評価方法は次のようになります。

\mathcal{L}(\phi)=\sum_{i} l\left(\hat{y}_{i}, y_{i}\right)+\sum_{k} \Omega\left(f_{k}\right)
\Omega(f)=\gamma T+\frac{1}{2} \lambda\|w\|^{2}

yの損失は、L1正則化に、学習した重みもを滑らかにするためのペナルティー項をたしたものです。
上の関数の最適化にあたり、通常のユークリッド空間上の最適化手法を使うことができないため、greedyに$y_t$を足すことで、徐々に最適なLを求めていきます。
そのようにして求めた、構造 qを持つ決定木の上での重みwと、それに対応する評価式は次のように求められます。

w_{j}^{*}=-\frac{\sum_{i \in I_{j}} g_{i}}{\sum_{i \in I_{j}} h_{i}+\lambda}
\tilde{\mathcal{L}}^{(t)}(q)=-\frac{1}{2} \sum_{j=1}^{T} \frac{\left(\sum_{i \in I_{j}} g_{i}\right)^{2}}{\sum_{i \in I_{j}} h_{i}+\lambda}+\gamma T

また、各ノードの評価式は

\mathcal{L}_{s p l i t}=\frac{1}{2}\left[\frac{\left(\sum_{i \in I_{L}} g_{i}\right)^{2}}{\sum_{i \in I_{L}} h_{i}+\lambda}+\frac{\left(\sum_{i \in I_{R}} g_{i}\right)^{2}}{\sum_{i \in I_{R}} h_{i}+\lambda}-\frac{\left(\sum_{i \in I} g_{i}\right)^{2}}{\sum_{i \in I} h_{i}+\lambda}\right]-\gamma

で求められます。
またXGBoostでは過学習を防ぐために、Shrinkageというテクニックとfeature subsampling というテクニックを使います。Shrinkageは古い情報からの学習を減らしていく方法です。
以上のようなテクニックを使うことで、XGBoostでは効率的にかつ的確に学習をすることが可能となっています。

詳細はこちらをご参照ください。

XGBoostのパラメター

よく指定するパラメターを紹介します。

パラメター 概要 デフォルト
booster 弱学楽器の種類 gbtree, dart (ツリーモデル) gblinear(線形モデル) gbtree
verbosity ログの出力 0(無), 1(警告), 2(info), 3(debug) 1
validate_parameters 入力されたパラメターが使われたかどうかをチェック false/true false
nthread 並列処理のスレッド数 int CPUのmax
eta Shrinkageのサイズ。学習率lrと同等。大きいほど保守的なモデルになる。 [0,1] 0.3
gamma 新しいノードを作成するために必要な損失減少の最小値。大きいほど保守的なモデルになる。 [0, inf] 0
max_depth 木の深さ。大きいほど過学習する。 int 6
min_child_weight 各child nodeでのwの合計の最小値。大きいほど保守的なモデルになる。 [0,inf] 0
subsample ツリーの作成に使うサンプルの大きさ。 (0, 1] 1
sampling_method サブサンプルの選択方法 uniform, gradient_based uniform
lambda L2正則化項 [0, inf] 1
alpha L1正則化項 [0, inf] 0
objective 学習の目的 reg:squarederror, reg:squaredlogerror, reg:logistic, binary:logistic,multi:softmax... reg:squarederror
eval_metric モデルの評価方法 rmse, rmsle, mae, logloss, error objectiveに対応
seed 乱数のseed seed 0

詳しくはこちらをご参照ください。

XGBoostをPythonで実行

from xgboost.sklearn import XGBClassifier

model = XGBClassifier(
 learning_rate =0.01,
 n_estimators=5000,
 max_depth=4,
 min_child_weight=6,
 gamma=0,
 subsample=0.8,
 colsample_bytree=0.8,
 reg_alpha=0.005,
 objective= 'binary:logistic',
 nthread=4,
 scale_pos_weight=1,
 seed=27
)

model.fit(X_train, y_train)
y_pred = model.predict(X_test)

詳しくはこちらをご参照ください。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3