機械学習の界隈でよく聞くXGBoost,GBDT,GBRTとは何か...? 数式を使わずに解説【データサイエンス】
目次
こんにちは。
データサイエンスについて勉強している一般人です。
最近、XGBoostやGBDTやGBRTとかいう単語を聞く機会があったので、調べてまとめてみました。機械学習って、ただでさえわかりにくい説明がされるのに、難しい横文字が多くて辛いですよね。
この記事では数式を使わずに、なるべく平易な日本語で解説するよう心がけます。
基本的な機械学習についての知識は、過去記事をご参考ください。Pythonのサンプルコードで解説しています。
- ペンギンデータセットで機械学習/データサイエンスをはじめよう〜ダウンロード編
- ペンギンデータセットでデータエンジニアリングの基礎を学ぼう
- ペンギンデータセットでデータサイエンス入門 〜 特徴行列の可視化編
- ペンギンデータセットでデータサイエンス入門 〜 機械学習の基本 教師あり学習・単回帰編
- ペンギンデータセットでデータサイエンス入門 〜 教師あり学習・分類編
- ペンギンデータセットでデータサイエンス入門 〜 教師なし学習・主成分分析編【Python/scikit-learn/機械学習】
- 機械学習モデルの汎化性能を向上させる方法の基本まとめ【Pythonサンプルコードあり/グリッドサーチ】
- 機械学習モデルの汎化性能を検証する方法の基本まとめ【Pythonサンプルコードあり/交差検証法/ホールドアウト法】
XGBoostとは
XGBoostとは、eXtreme Gradient Boostingの略で、「勾配ブースティング決定木(GBDT)」という機械学習アルゴリズムによる学習を、使いやすくパッケージ化したものです。
論文:XGBoost: A Scalable Tree Boosting System
タイトルを読む限り、スケーラブル(伸縮可能)な木のブースティングシステムらしい。
しかし論文の内容は当然、理解できるはずもなく。先にGBDT(勾配ブースティング決定木)について知ったほうがよさそうです。
GBDT 勾配ブースティング決定木 とは
Gradient Boostging Decision Treeの略で、勾配降下法とブースティングと決定木を融合した機械学習の手法。
決定木は回帰問題・分類問題どちらにも利用できるモデルです。決定木についてはこちらの記事で実例・実装を含めて解説しています。: 【データサイエンス入門】決定木分析をPythonで簡単に試す & 分類と条件分岐を可視化する方法まとめ【サンプルコードあり】
ここでは勾配降下法とブースティングについて触れながらGBDTとは何かをまとめていきます。
ブースティングとは
直列にアンサンブル学習することで、予測のバイアスを低くする手法。前段のモデルが予測を間違えた部分に重点を置いて、次のモデルが学習し、...といったことを繰り返して、予測精度を高めていきます。
ブースティングには、損失関数という評価関数(目的関数)を定義して、この値(=損失)が最小になるようにモデルを構築します。
(ちなみに、直列ではなく並列にアンサンブル学習して予測のバリアンスを低くする手法をバギングと言います。分類問題であれば多数決、回帰問題であれば平均値、といったように複数の結果をまとめます。)
アンサンブル学習とは
複数のモデルを独立で学習させ、それぞれの結果を合わせて最終的な予測結果を出力することで、単独のモデルより強力な予測精度をもつモデルを作る手法。
決定木のような単体だと予測精度の低いモデル(弱学習器といいます)でも、複数の学習結果を組み合わせることによって、高い予測精度にすることができます。
様々なデータセットに対する分類や回帰に効果があるとわかっている代表的なアンサンブル学習の手法が、ランダムフォレストと勾配ブースティングです。ランダムフォレストがバギングによる手法、勾配ブースティングがブースティングによる手法ですね。
バイアスとは。ブースティングによってバイアスが下がる理由。
機械学習の目的は未知のデータに対して予測精度を高めることです。予測精度の説明には「バイアス」と「バリアンス」という言葉がよく用いられます。バイアス(Bias)はモデルの単純さ・偏り、バリアンス(Variance)はモデルの複雑さ・分散(ばらつき)です。予測精度が高いということは、未知のデータに対してバイアスもバリアンスも少ない予測ができるということですが、限られた教師データで学習させようとすると、高バイアスで適合不足になったり、高バリアンスで過剰適合になったりします。バイアスとバリアンスはトレードオフの関係にあります。
ブースティングは1回の適合でうまく行かなかった部分を補正してより適合したモデルを作ろうとする処理なので、モデルのバイアスを低くして、バリアンス高くしようとしている、と言えます。
バイアス・バリアンスのトレードオフについてはこちらの書籍で詳しく触れられています。
Pythonデータサイエンスハンドブック ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習
勾配降下法とは
損失関数の最小値を効率的に求める方法のひとつ。勾配降下法の中にもいろいろな手法があるようですが、基本的には変数の勾配(偏微分)を利用して、勾配が大きい方向に、勾配の大きさに応じて坂を下るように移動し、その結果として最小値を求める。という方法です。
勾配を求める方法には、誤差逆伝播法という手法を用います。このあたりはまた詳細を調べて別の記事にまとめようと思います。
まとめると、つまりGBDT(勾配ブースティング決定木)とは
アンサンブル学習によって、一つ前の決定木の誤りを修正するように決定木を作っていき、バイアスが低く予測精度が高いモデルを作る学習手法です。分類・回帰どちらにも利用できます。
GBDTのメリット・デメリット
メリット
- 予測精度が高いモデルを作ることができる
- 特徴量のスケール変換が不要(決定木のメリット)
- 2値特徴量と連続値特徴量が混ざっていても機能する(決定木のメリット)
デメリット
- 訓練時間が長い
GBRTとは。GBDTとGBRTの違い
GBDTと似た名前でGBRTというものがあります。
- GBDT : Gradient Boosting Decision Tree (勾配ブースティング決定木)
- GBRT : Gradient Boosting Regression Tree (勾配ブースティング回帰木)
つまり「勾配ブースティング回帰木」のことで、決定木を回帰に用いる場合に使われる用語のようです。一般的には決定木は回帰にも分類にも使える手法なので、あまり明確な区別はされないようにも感じます。回帰問題である(回帰木である)ことを強調するときに、GBDTではなくGBRTと言うのかなと。
scikit-learn的に言うと、GradientBoostingClassifier
とGradientBoostingRegressor
のうち、後者を特にGBRTという感じでしょうか。
参考 : scikit learn | Gradient Tree Boosting
GBDTとGBRTの使い方
Pythonの機械学習ライブラリscikit-learnで簡単に利用できます。上述したとおり、GradientBoostingClassifier
は分類、GradientBoostingRegressor
は回帰に使えます。
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
X_train, X_test, y_train, y_test = train_test_split(<data>,<target>,random_state=0)
gbdt = GradientBoostingClassifier(
random_state=0, # ランダムシード
n_estimators=100, # 決定木の数
max_depth=3, # 決定木の最大深さ
learning_rate=0.01 # 学習率
)
gbdt.fit(X_train,y_train)
gbdt.score(X_train, y_train) # 訓練セットに対する精度
gbdt.score(X_test, y_test) # テストセットに対する精度
決定木のパラメータ以外に、学習率(learning rate)というパラメータが特徴的です。学習率を大きくすると、前の決定木が間違えた予測をより強く補正しようとします。
決定木の数を増やしたり、学習率を大きくすると、モデルが複雑化して過学習になります(汎化性能が下がります)。メモリリソースに応じて決定木の数を決めて、ハイパーパラメータの探索は学習率に対して行うことが多いようです。
パラメータのより詳細な使い方はこちらのドキュメントで : scikit learn | sklearn.ensemble.GradientBoostingClassifier
▼参考書籍はこちら
Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
改めて、XGBoostとは
ここまでを踏まえると、XGBoostとは、
「一つ前の決定木の誤りを修正するように決定木を作っていき、予測精度の高いモデルを作る学習手法であるGBDT(GBRT)を、使いやすくした応用理論であり、それをパッケージ化したもの。」
ということですね。具体的な理論については詳しそうな記事があったので、時間があるときにじっくり読んでみようと思います。(下の「参考記事」参照。)
XGBoostは予測精度が高い一方、学習に時間がかかるというデメリットがあります。後に、LightGBMというお手軽版なパッケージもあるので、これについても別の記事で解説予定です。
XGBoostの使い方【Python】
基本は過去記事で紹介したscikit-learnと同じような流れで使えますが、xgboost
のライブラリを用意して、DMatrix
でXGBoost用の行列データ型に変換する必要があります。
$ pip install xgboost
import xgboost as xgb
dtrain = xgb.DMatrix(<train_data>)
dtest = xgb.DMatrix(<test_data>)
param = {'max_depth':2, 'eta':1, 'objective':'binary:logistic' }
num_round = 2
bst = xgb.train(param, dtrain, num_round)
preds = bst.predict(dtest)
参考 : dmlc XGBoost | Get Started with XGBoost
詳細は別の記事にまとめる予定です。
参考記事
スタビジ | 勾配ブースティング木手法をPythonで実装して比較していく!
▼参考書籍はこちら