勾配ブースティング木とは?
データ分析コンペでよく使われるアルゴリズムの一つ。
GBDTと略される。
G・・・ Gradient(勾配) = 勾配降下法
B・・・ Boosting(ブースティング) = アンサンブル手法の1つ
D・・・ Decision(決定)
T・・・ Tree(木)
つまり、「勾配降下法(Gradient)」と「Boosting(アンサンブル)」、「決定木(Decision Tree)」を組み合わせた手法。
勾配降下法
重みを少しずつ更新して誤差の勾配が最小となる点を探索するアルゴリズム。
「誤差が小さくなる=予測が正確になる」と考える。
ブースティング
複数のモデルを組み合わせてモデルを作成するアンサンブル手法の一つ。
同じ種類のモデルを直列的に組み合わせ、予測値を補正しながらモデルを学習させる。
弱学習器(予測の精度があまり高くないもの)を複数組み合わせることで強学習機(精度の高いもの)を作ることができる。
決定木
樹形図によってデータを分析する手法。
例えば「アイスクリームを買うかどうか」を予測する場合、
「気温が30℃以上」 => 購入するだろう
「気温が30℃未満」 => 購入しないだろう
という条件を用意し予測を行う。
勾配ブースティング木の特徴
- 特徴量は数値
決定木の分岐を特徴量より大きいか小さいかで判断するため、特徴量は数値である必要がある。 - 欠損値を扱うことができる
決定木の分岐により判断するため、欠損値の補完をしなくても使用できる。 - 変数間の相互作用が反映される
分岐を繰り返すため、変数間の相互作用が反映される。 - 特徴量をスケーリングする必要がない
特徴量の大小関係のみで判断するため、標準化などのスケーリングが不要。
勾配ブースティングの流れ
- 目的変数の平均を計算する
- 誤差を計算する
- 決定木を構築する
- アンサンブルを用いて新たな予測値を求める
- 再び誤差を計算する
- 3~5を繰り返す
- 最終予測を行う
予測値と目的変数の差が次の決定木で修正されていくことで精度を上げている。
実装手順
今回は二値分類を行うものとする。
※JupyterNotebook上でのコード例です。
ライブラリの読み込み
import xgboost as xgb
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from matplotlib import pyplot as plt
%matplotlib inline
データの読み込み
df = pd.read_csv('hoge.csv')
df.head() # 読み込みの確認
特徴量を選択する
# 今回は特徴量Xから"foo"、目的変数Yから"bar"を取り除く
X = df.drop(['foo', 'bar'], axis=1)
y = df['bar']
X.head() # 取り除けたことを確認
学習用データと評価用データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, shuffle=True)
test_size: 指定した割合を評価用データとして分割(0.3なら30%)
random_state: 乱数生成時のシードを指定
shuffle: データ分割時にランダムに並び替えを行うかどうか
DMatrix形式に直す
xgboostではデータセットをDMatrix形式にする必要があります。
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
学習用パラメータを設定
xgb_params = {
# 二値分類
'objective': 'binary:logistic',
# 評価指標loglossを仕様
'eval_metric': 'logloss',
}
モデルを学習
bst = xgb.train(xgb_params,
dtrain,
# 学習ラウンド数
num_boost_round=100,
# 一定ラウンドを回しても改善が見込めない場合は学習を打ち切る
early_stopping_rounds=10,
)
予測の実行
y_pred = bst.predict(dtest)
精度の検証
acc = accuracy_score(y_test, y_pred)
print('Accuracy:', acc)
これで精度が出力されるので、必要に応じてパラメータを調整する。
以上の流れで勾配ブースティング木での分析は可能なはずです。 本番データの分析等はここでは省略します。 その他xgboostには特徴量の重みを可視化できたりと便利な機能があるので調べてみてください。
参考
Python: XGBoost を使ってみる
https://blog.amedama.jp/entry/2019/01/29/235642
GBDTの仕組みと手順を図と具体例で直感的に理解する
https://www.acceluniverse.com/blog/developers/2019/12/gbdt.html
Kaggle Masterが勾配ブースティングを解説する
https://qiita.com/woody_egg/items/232e982094cd3c80b3ee
書籍:
門脇大輔、阪田隆司、保坂佳祐、平松雄司(2019)『Kaggleで勝つデータ分析の技術』技術評論社