勾配ブースティング入門:強力なブースティング手法(XGBoost)を徹底解説【コード有り】

データ分析

こんにちは、nissyです。

本日はランダムフォレストをさらに発展させた「勾配ブースティング」について解説します。。
勾配ブースティングは、決定木やランダムフォレストといった既存の手法を更に強化し、予測精度を大幅に向上させることができるアルゴリズムです。

この記事では、勾配ブースティングの基本的な概念から、その背後にある原理、そして具体的なコードによる実装までを詳しく解説します。

既に決定木やランダムフォレストについての知識を持っている方にとっては、勾配ブースティングはその次のステップとなるでしょう。また、これから機械学習を学び始める方にとっても、勾配ブースティングはその強力さと汎用性から、ぜひ理解しておきたい手法の一つです。

ブースティングとは何か

ブースティングの基本的なアイデアは、複数の弱学習モデル(通常は決定木)を順番に学習し、各モデルが前のモデルの誤りを修正するように学習することです。

つまり、前のモデルが誤って回帰・分類したサンプルに対して、次のモデルは重点的に学習することで、全体としてより正確な予測を行うことを目指します。

具体的には、ブースティングではデータセット内の各サンプルに重みを割り当て、初期モデルを使って予測を行います。その後、誤差を計算し、次のモデルで誤分類されたサンプルに重みを追加します。

これにより、次のモデルはより多くの注意を払ってこれらのサンプルを正確に予測するように学習します。

このプロセスは繰り返され、最終的には複数のモデルの結果を組み合わせることで、より強力な予測モデルが構築されます。

下記イラストは回帰モデルを勾配ブースティングで構築している様子を示しています。赤点のサンプル(モデルが誤ったサンプル)に対して重みを割り当て、優先的に正解するように学習している様子がわかると思います。

 

勾配ブースティングの原理

勾配ブースティングはモデルの学習において勾配降下法を活用する手法です。

勾配降下法は、誤差を最小化するためにパラメータを更新する際に勾配(誤差関数の微分)の情報を利用します。

勾配ブースティングでは、弱学習器(通常は決定木)を順番に学習していきます。

最初のモデルは初期値として与えられ、残差(目標値とモデルの予測値との誤差)を求めます。次に、この残差に対して、新たなモデルを学習させます。

しかし、通常のブースティングとは異なり、新たなモデルの予測値が直接的な目標ではなく、残差を予測するように学習します。

勾配ブースティングでは、各モデルの学習時に勾配(誤差関数の微分)を計算し、残差を最小化するようにパラメータを調整します。

勾配ブースティングではi 回目における二乗平均誤差を損失とし、微分したモデルに学習率ηを掛けた値でモデルを更新します。

\[ L_i =\frac{1}{N}\sum(y^{(i)} – \hat{y}^{(i)})^2\]

\[\hat{y}^{(i+1)} = \hat{y}^{(i)} + \eta\frac{\partial L_i}{\partial y} = \hat{y}^{(i)} +2\eta\sum(y^{(i)} – \hat{y}^{(i)})\]

学習率ηは0〜1の値を取ることができ、値が小さいほど精度は良くなるが、その分計算に時間を要します。

XGBoostとは

XGBoost(eXtreme Gradient Boosting)は勾配ブースティングを活用した高性能な機械学習フレームワークで、競技プログラミングやKaggleなどのデータ分析コンペでも人気の高いアルゴリズムです。

XGBoostは、予測モデルの性能を改善するために、正則化手法を組み込んでいます。

XGBoostは以下の誤差関数を最小化するように学習を行います。

\[ L = \sum_{i} (y^{(i)} , \hat{y}^{(i)}) +  \sum_{k} \omega(f_k) \]

\[ \omega(f) = \gamma T + \frac{1}{2} \lambda \|w\|^2 \]

Tは最終ノード(決定木の葉)の数、wは全ての葉ノードの値(葉ノードのサンプルのyの平均値)が格納されたベクトル、決定木の最終てぉな予測値、λとγはハイパーパラメータです。

XGBoostは上記の正則化項を導入することでノード数を小さくしすることで木が複雑になる(オーバーフィッティング)ことを避けています。

それ以外にもXGBoostは、多くの優れた機能を提供しています。例えば、欠損値の処理への頑健性、ランダムフォレストのように特徴量重要度の推定など、モデルの解釈性を高めるためのツールも備えています。

XGBoostのハイパーパラメータ

XGBoostの性能を最大限に引き出すためのハイパーパラメータについて説明します。
Pythonではハイパーパラメータチューニングのためのライブラリがいくつか完備されています。以下に主なライブラリとそれらのメリット・デメリットについてまとめます。

Scikit-Optimize KerasTuner Optuna
メリット Scikit-learnとの高い互換性があり、Scikit-learnのAPIを知っていれば容易に使用することができる。 KerasやTensorFlowとの高い互換性があり、深層学習のハイパーパラメータチューニングに特化している。 並列化や分散処理が可能で、大規模な最適化タスクにも対応できる。
Scikit-learnやPyTorch、TensorFlow、Kerasなど、多くのライブラリとの互換性がある。
デメリット 他のライブラリに比べて機能が少なく、特に深層学習のハイパーパラメータチューニングには不向き。 KerasやTensorFlow以外のフレームワークとの互換性が低い。 特定のフレームワークに特化した機能は少ない。

XGBoostの主なハイパーパラメータをまとめます。

項目 説明 数値型 探索範囲 抽出分布
n_estimator イテレーションの回数 整数 10~5,000
learning_rate 勾配降下法のステップサイズ。通常は対数一様分布からサンプリングされる。 実数 0.01~1.0 対数一様分布
min_child_weight 分岐に必要な最小インスタンス数またはウェイトの総和。 整数 1~10 一様分布
max_depth 特徴量に基づく分岐の最大数。 整数 1~50
max_delta_step 各木の重みの推定値において、推測された重みの変化の最大値。 整数 0~20
subsample 訓練に使うサンプルのサブサンプリングの比率 実数 0.1~1.0
colsample_bytree 特徴量のサンプリングの比率を表す 実数 0.1~1.0
colsample_bylevel 決定着の深さレベルでの特徴量のサブサンプリングの比率 実数 0.1~1.0
reg_lambda L2正則化を制御する実数 実数 le-9~100.0 対数一様分布
reg_alpha L1正則化を制御する実数 実数 le-9~100.0 対数一様分布
gamma 決定着を分割するための損失関数の減少の下限 実数 le-9~0.5 対数一様分布
scale_pos_weight 陰性クラス(1)に対する要請クラスの重み比率。 実数 le-6~500.0 対数一様分布

これまで使用したアルゴリズムと比べて非常にハイパーパラメータが多い事がわかります。

PythonでXGBoost実装

今回も「ボストン住宅価格データセット」を用いて「ランダムフォレスト回帰」を行っていきます。

まずは使用するライブラリーをインポートします。

 

次にボストン住宅価格データセットを用意します。

 

以下のコードでデータを学習データとテストデータに分割します。

 

ベイズ最適化によるパラメータチューニング

ハイパーパラメータチューニングの結果を出力する関数を設定します。

 

XGBoostのモデルを定義します。

 

ベイズ最適化でデューニングするハイパーパラメータを指示します。

 

ハイパーパラメータチューニングの条件を指示します。今回はScikit-Optimizeを使用してハイパーパラメータチューニングを実施していきます。

 

以下のコードを走らせるとベイズ最適化によるハイパーパラメータチューニングが開始されます。

計算の結果、以下のようなハイパーパラメータの値を返してくれました。Google Colaboratryで計算させたのですが、約8分ほど時間がかかりました。

上記のハイパーパラメータを使ってXGBoostを学習させます。

結果を出力します。

高い精度で予測できている事が確認できます。

ランダムフォレストと同様に、学習に使ったデータの特徴量重要度を出力します。

また、ベイズ最適化によるハイパーパラメータチューニングの様子も可視化する事ができます。

 

 

デフォルトのハイパーパラメータ値での予測

XGBoostはハイパーパラメータが多く、チューニングも非常に重要にはなるのですが、デフォルト値のまま学習させても高い予測精度を示します。実際に確認してみましょう。

今回はデフォルト値で学習させた方が高い予測精度を示す結果となりました。

解くべき問題にもよりますが、まずはデフォルトのハイパーパラメータでXGBoostを実装してみるのもアリかもしれません。

まとめ

今回は勾配ブースティングを活用した機械学習アルゴリズムについて解説しました。ブースティングは、弱学習モデルを組み合わせて強力な予測モデルを構築する手法であり、XGBoostはその中でも特に優れた性能を持っています。

勾配ブースティングの原理を最大限に活用し、XGBoostは高速かつ高性能なモデルの構築を実現します。逐次的な学習と誤差の最小化を行いながら、複数のモデルを組み合わせることで、予測性能を向上させます。

XGBoostは、さまざまな機械学習タスクに適用可能であり、特に構造化データや高次元データにおいて優れた結果を示します。また、正則化の手法を組み込んでおり、過学習を抑制しモデルの汎化性能を向上させます。

Pythonを使ったXGBoostの実装も容易であり、ライブラリのインストールやデータの準備、モデルの学習・予測までの一連の手順をコード例と共に解説しました。

XBoostはハイパーパラメータが多く、チューニングも非常に重要ですが、デフォルト値でも十分に高い予測精度を示す事が多いです。解くべき問題にもよりますが、まずはデフォルトのハイパーパラメータでXGBoostを実装してみるのことをお勧めします。

データ分析
未経験の壁をぶっこわ〜す!化学系データサイエンティスト転職ブログ

コメント

タイトルとURLをコピーしました