【xgboost】XGBRegressorの使い方が分かる【Kaggle Course – Intermediate Machine Learning 6】XGBoost

Kaggle

アメリカのデータ分析コンペKaggleでは、世界中の優秀なデータサイエンティストによって作成された様々なeラーニング教材が無料で公開されています。

その中でも、この記事では以下の講座について解説します。

Intermediate Machine Learning
6.XGBoost

ただ、全編英語ですし、ところどころ説明を省略しているところもあるので、私なりにかみ砕いて解説していきます。

この記事で取り扱うクラスは以下の通りです。

xgboost.XGBRegressor

XGBoost

この講座では、勾配ブースティングの1つであるXGBoostのモデル構築方法を学びます。

勾配ブースティングはKaggleコンペで何度も優勝実績がある手法です。

Introduction(イントロダクション)

これまでの講座では、機械学習モデルはランダムフォレストを使用してきました。

ランダムフォレストは決定木を組み合わせたアンサンブル学習の1つです。

アンサンブル学習には並列処理させるバギングと、直列処理させるブースティングがあり、ランダムフォレストは決定木を並列処理(バギング)する手法でした。

一方、決定木を直列処理(ブースティング)する手法を勾配ブースティングと呼びます。

Gradient Boosting(勾配ブースティング)

勾配ブースティングについて説明します。完全には理解できなくても、なんとなく流れが理解できればオッケーです。

  1. 最初に1つ目のモデル(決定木)を作成します。
  2. 次に、そのモデルを使ってデータセットに対する予測を生成します。予測を行うために、アンサンブル内のすべてのモデルからの予測を追加します。
  3. 予測値を使って損失関数を計算します。その損失関数を使って、アンサンブルに追加される新しいモデルを学習させます。
  4. 最後に、また新しいモデルをアンサンブルに追加します。
  5. 2~4を繰り返します。

View post on imgur.com

Example(具体例)

それでは、XGBoost(Extreme Gradient Boosting)ライブラリを使用した具体例を説明していきます。

まず、scikit-learn API (xgboost.XGBRegressor) をインポートします。

その後、モデルを作成し、訓練データを学習します。

from xgboost import XGBRegressor

my_model = XGBRegressor()
my_model.fit(X_train, y_train)

作成したモデルで予測を行い、MAE(平均絶対誤差)スコアを出しました。

from sklearn.metrics import mean_absolute_error

predictions = my_model.predict(X_valid)
print("Mean Absolute Error: " + str(mean_absolute_error(predictions, y_valid)))
Mean Absolute Error: 238794.73582819404

Parameter Tuning(パラメータ調整)

XGBoostには、精度や学習速度に大きな影響を与える主なパラメータが4つあります。

1.n_estimators(アンサンブルするモデルの数)

n_estimatorsは、モデルのサイクルを何回行うか(アンサンブルするモデルの数)を指定します。

n_estimatorsの値が低すぎるとアンダーフィットとなり、トレーニングデータとテストデータの両方で精度が低くなってしまいます。

逆に、n_estimatorsの値が高すぎるとオーバーフィットとなり、トレーニングデータでは正確な制度になりますが、テストデータの精度は悪くなってしまい、意味がありません。

n_estimatorsの推奨値は100〜1000ですが、この値は後述するlearning_rateの値に大きく依存します。

以下はn_estimatorsを設定するコードです。

my_model = XGBRegressor(n_estimators=500)
my_model.fit(X_train, y_train)

2.early_stopping_rounds(早期停止のラウンド数)

early_stopping_roundsは、性能が頭打ちになったところで学習を早期停止する役目を果たします。

例えば、early_stopping_roundsに5を指定したとすると、5ラウンド進めても性能に改善が見られなかったときは、そこで学習を止めます。

また、early_stopping_roundsを使用するときは、性能スコアを計算するためにeval_setでデータを確保する必要があります。

以下はearly_stopping_roundsを設定するコードです。

verboseはデバッグに関するパラメータですので、気にしなくても大丈夫です。

my_model = XGBRegressor(n_estimators=500)
my_model.fit(X_train, y_train, 
             early_stopping_rounds=5, 
             eval_set=[(X_valid, y_valid)],
             verbose=False)

なお、全データを使って再度モデルを学習させるときは、n_estimatorsに早期停止したときの値を設定します。

3.learning_rate(学習率)

各モデルからの予測値を単純に加算して予測値を得るのではなく、各モデルからの予測値にlearning_rateを掛けてから加算することもできます。

learning_rateを設定すると、アンサンブルに木を追加したときの影響が少なくなります。そのため、n_estimatorsの値を高く設定しても、オーバーフィッティングにはなりません。

一般的には、learning_rateが小さく、n_estimatorsが大きいと、より正確なXGBoostモデルが得られますが、サイクルの反復回数が多くなるため、モデルの学習に時間がかかります。デフォルトでは、learning_rate=0.1となっています。

下記のコードはlearning_rateを0.05に修正したものです。

my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05)
my_model.fit(X_train, y_train, 
             early_stopping_rounds=5, 
             eval_set=[(X_valid, y_valid)], 
             verbose=False)

4.n_jobs(並列処理の数)

処理時間のかかる大規模なデータセットでは、並列処理を利用するとよいでしょう。

n_jobsはマシンのコアと同じ数にするのが一般的ですが、小さなデータセットではあまり気にする必要はありません。

my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05, n_jobs=4)
my_model.fit(X_train, y_train, 
             early_stopping_rounds=5, 
             eval_set=[(X_valid, y_valid)], 
             verbose=False)

Conclusion(結論)

XGBoostは、標準的な表形式のデータを扱うための代表的なライブラリです。

きちんんとパラメータを調整することで、精度の高いモデルを作成することができます。

Your Turn(練習問題)

ここまで学習してきた内容を練習問題で実践してみましょう。

今回はKaggle CourseでXGBoostについて学びました。ランダムフォレストに比べて一般的に精度が上がると聞いて、早速試してみたくなりました。次回はリーケージについて学んでいきます。

以上、最後までお読みいただきありがとうございました。

コメント

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