【機械学習】XGboostを勉強してみる
XGBoostの概要
XGBoostは "eXtreme Gradient Boosting" の略であり、勾配ブースティングを使ったツリーのアンサンブル学習です。その優れた性能と速さから、KaggleやKDDCupなどで上位の成績を修めたモデルにもよく使われています。実際2015年のKaggleコンペでは29の優勝モデルのうち、17モデルがXGBoostを使ったモデルでした。
XGBoostのアルゴリズム
目的変数の推定方法
\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)
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)
詳しくはこちらをご参照ください。
Author And Source
この問題について(【機械学習】XGboostを勉強してみる), 我々は、より多くの情報をここで見つけました https://qiita.com/shuva/items/fcf4c5e7f50d763c6f12著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .