はじめに
現在取り組んでいる機械学習系の卒業研究の中でXGBoostを使おうと思い、あれこれ調べたので、自分の思考の整理代わりにも、記事にしてまとめようと思います!
XGBoostとは?
逐次的に弱学習器を構築し、予測モデルを生成するものをブースティングといい、その中でも弱学習器を構築する際に損失関数の最小化に勾配降下法を用いるものを勾配ブースティングと言います。
その勾配ブースティングをC++で実装し高速化したものが、XGBoostです。
世界的なデータ解析コンテストサイト"Kaggle"では、2015年に出された問題29問のうち、なんと17問がXGBoostを用いたモデルが1位となっています。
XGBoostの利点は、
- 欠損値が多いなどのスパースなデータに対して、事前に木の分岐の方向を決めるアルゴリズムを採用している。
- 並列分散処理により、モデルの探索を高速化している。
- CPU外でも学習が回せるため、大規模なデータも処理できる。
などが挙げられます。
XGBoostのハイパーパラメータ
XGBoostの公式ドキュメントから、チューニングすべきであろう主なハイパーパラメータを以下にまとめます。
pythonでパラメータを指定する際には、'eta'は'learning_rate'、'lambda'は'reg_lambda'とする必要があるみたいです。
実装
XGBoostを用いて、日本版Kaggleの"DeepAnalytics"の銀行の顧客ターゲット問題に取り組んでいきます。
以前、筆者がインターンしている会社の技術ブログで他手法での取り組みを紹介しているので、問題の詳細はこちら をご覧ください。
以下、学習モデル作成に用いたコードです。
import pandas as pd
from sklearn.cross_validation import train_test_split
import math
import numpy as np
from sklearn.metrics import classification_report, roc_auc_score, precision_recall_curve, auc, roc_curve
import xgboost as xgb
#csvファイルを読み込む
df = pd.read_csv('remake_train.csv')
df_except_y = df.drop(["y"], axis=1)
X = df_except_y.as_matrix()
# 目的変数に "y " を利用
y = df['y'].as_matrix()
# 必要なライブラリのインポート
from sklearn.grid_search import GridSearchCV
# 動かすパラメータを明示的に表示
params = {"learning_rate":[0.1,0.3,0.5],
"max_depth": [2,3,5,10],
"subsample":[0.5,0.8,0.9,1],
"colsample_bytree": [0.5,1.0],
}
# モデルにインスタンス生成
mod = xgb.XGBRegressor()
# ハイパーパラメータ探索
cv = GridSearchCV(mod, params, cv = 10, scoring= 'roc_auc', n_jobs =-1)
# trainデータとtestデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
# 予測モデルを作成
cv.fit(X_train, y_train)
#予測
y_train_pred = cv.predict(X_train)
y_test_pred = cv.predict(X_test)
今回は、learning_rate,max_depth,subsample,colsample_bytreeの4パラメータをグリッドサーチを用いて、チューニングしました。
パラメータ | 探索する値 | 採用された値 |
---|---|---|
learning_rate | 0.1, 0.3, 0.5 | 0.1 |
max_depth | 2, 3, 5, 10 | 3 |
subsample | 0.5, 0.8, 0.9, 1.0 | 1.0 |
colsample_bytree | 0.5, 1.0 | 1.0 |
上記のように、ハイパーパラメータがチューニングされました。
この学習モデルを用いて推定を行うと、結果は、AUC値で0.93238となりました。
前回ランダムフォレストで取り組んだ結果はAUC値0.93560だったので、多少精度が落ちる結果になりました。。
最後に
今回色々と調べてみて、ハイパーパラメータの内容や実装方法など理解を深められましたが、
数式的な理解がまだ浅いため、直感的にパラメータをチューニングしてしまったのが反省点です。
元の論文を読み込んで、さらに理解を深めていきたいと思います!
参考文献
今回の記事作成にあたって、以下の記事を参考にさせていただきました。
xgboost公式ドキュメント
xgboost-github
勾配ブースティングについてざっくりと説明する - About connecting the dots.
XGBoostの主な特徴と理論の概要