勾配ブースティング(GBDT)の使い方【scikit-learn/アンサンブル学習】

勾配ブースティング(GBDT)の使い方【scikit-learn/アンサンブル学習】
えびかずき
えびかずき

こんにちは、えびかずきです。

今回は勾配ブースティング(GBDT)の使い方について説明していきます。

こんな人におすすめ:
・勾配ブースティングをscikit-learnで実装したい
・どのパラメータを調整すれば良いか教えて欲しい

結論として、scikit-learnのGradientBoostingClassifierクラスを使えば簡単実装できます。

また、調整すべきパラメータは、n_estimaters(決定木の数),learning_rate(学習率),max_depth(決定木のノード深さ)の3つです。

それでは、順を追って解説していきましょう。

開発環境

Python 3.7.3

scikit-learn 0.24.2
Pandas 1.2.4
seaborn 0.11.1

IDE:jupyter Notebook

勾配ブースティングの使用例

まず、データ分類をするサンプル用意します。

今回はkaggleのTitanicのデータを活用してみたいと思います。

使うデータと前処理については、過去記事をご参照ください。

ちなみに生データを可視化するとこんな感じ↓

さてそれでは、勾配ブースティングを実装していきましょう。

勾配ブースティングは、以下のようにscikit-learnのGradientBoostingClassifierクラスで実装できます。

# 勾配ブースティング
clf_gbdt = GradientBoostingClassifier(n_estimators=100, learning_rate=0.03, max_depth=5,random_state=0)
clf_gbdt.fit(X, y)

clf_gbdt.score(X, y)

# OUTPUT:
# 0.917

訓練データの精度が0.917ということで、きちんと分類ができていますね。

しかしこれだけでは汎化性能を評価できていませんので、交差確認の結果もみていきましょう。

交差確認をする場合、以下のようにして実装できます。

#GBDT/交差確認
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score

# max_depth,n_estimators
gbdt = GradientBoostingClassifier(n_estimators=100, learning_rate=0.03, max_depth=3,random_state=0)

scores = cross_val_score(gbdt, X, y, cv = 10)
print(np.mean(scores))

# OUTPUT:
# 0.831

n=10で交差確認を実施した結果、精度が0.831ということで、汎化性能も高そうですね。

パラメータ設定の方法

勾配ブースティングで調整すべきパラメータは、以下の3つです。

n_estimaters:
決定木の数を表します。
大きすぎると計算コストが高くなるので注意。
ランダムフォレストと違って大きければ大きいほど良いと言うわけではない。
勾配ブースティングは決定木の改良を直列的に実施するので、nが大きいとモデルが複雑になり過学習が進んでしまう。
デフォルト設定値は『100』。

learning_rate
決定木を作るときの学習率を表します。
デフォルトは0.01。
学習データに応じて経験的に調整が必要なパラメータです。

max_depth
決定木のノード深さの制限値を表します。
デフォルトは『3』。
深さを調整することで、分類器性能が向上する場合がある。

まとめ

今回は勾配ブースティングの使い方について説明しました。

勾配ブースティングはkaggleでもよく使われる性能の高いパターン認識モデルです。

しかしながらランダムフォレストと違って、ハイパーパラメータの調整に気を遣う必要があるので、少し手がかかります。

パラメータ調整を色々試してみて、経験的に使い方をマスターしていきましょう!

参考書籍

記事作成にあたって、以下の書籍を参考にさせていただきました。

機械学習カテゴリの最新記事