XGBoostは、言わずと知れたKaggleや実務で広く利用される強力な機械学習ライブラリです。
今回は、初心者の方向けに、実践的にパラメータをどのように調整していけば良いのかを、優先度の高いパラメータを中心に分かりやすく解説します。
ここでは、以下のパラメータをベースラインとして進めてまいります。
model = XGBRegressor(
# device="cuda", # GPUを利用して高速学習
max_depth=6, # 木の深さ。複雑すぎると過学習のリスクあり
colsample_bytree=0.5, # 1本の木を作る際に使用する特徴量の割合(過学習防止)
subsample=0.8, # 学習時に使用するデータの割合(ノイズ除去に有効)
n_estimators=10000, # ブースティングラウンド数。多めに設定し、early_stoppingで調整
learning_rate=0.02, # 各ラウンドの学習率。低めに設定して安定性を確保
enable_categorical=True, # カテゴリ変数を自動で扱う機能を有効に
min_child_weight=10, # 葉に含まれるデータの重みの最小値(過学習抑制)
early_stopping_rounds=100, # 100ラウンド改善がなければ学習を停止
)
このコードをベースに、各パラメータの意味と調整の優先順位について見ていきましょう。
1. device=”cuda”
概要:
GPU環境が利用可能な場合、計算速度が大幅に向上します。
ポイント:
- まずはGPUを使えるか確認。
- Kaggleやクラウド環境ではGPUが標準的に提供されるため、最初から有効にしておいてもいいかと。
2. max_depth
概要:
各決定木の最大の深さを設定します。
(ベースライン値: 6)
- 大きくしすぎると複雑すぎて過学習のリスクが上がります。
- 基本的には6から始めて、過学習気味であれば4に、逆に精度が伸び悩むようであれば8にしてみるといいでしょう。
3. colsample_bytree & subsample
概要:
- colsample_bytree:1本の木を作成する際に使う特徴量の割合。
例えば年齢、体重等…情報が10個あったとして、どの程度の割合使用するかを決めるパラメータです。特徴量が10個の場合、0.8とすればそのうち8個がその都度選ばれることになります。
(ベースライン値: 0.5) - subsample:学習時に使うデータの割合。
100人分のデータの場合、0.8とすれば、一回につき、80人分のデータが用いられることになります。(ベースライン値: 0.8) - どちらも0〜1の範囲で設定し、0.5~0.8あたりが一般的。
- これらのパラメータは、過学習防止に効果がある。
- 過学習気味でなければ、colsample_bytreeを0.8程度まで上げて様子を見る。
- データ数が極めて多く、メモリ不足になる場合等にはsubsampleを0.5程度まで下げてみる。
4. n_estimators & learning_rate
概要:
- n_estimatorsはブースティングラウンド数、learning_rateは各ラウンドでの学習率です。
- 学習率が低いと、より多くのラウンドが必要になります。
- ここでは学習率0.02と、ラウンド数を10000に設定して、early_stoppingで自動停止させる方法を取っています。
- これにより初期設定としては安定して学習を進めることができます。
5. min_child_weight
概要:
各葉に含まれるデータの重みの最小値。
- 高い値に設定すると、よりロバストな(過学習しにくい)木が構築されます。
- 初学者の場合、まずはベースラインの10を採用し、必要に応じて調整していくのがおすすめです。
6. enable_categorical
概要:
カテゴリ変数を自動で扱う機能です。
- カテゴリ変数がある場合には以下のようなコードで明示的にカテゴリ型とし、このパラメータをTrueにすることでカテゴリ変数を認識してくれます。
CATS = train.select_dtypes(include=["object"]).columns.tolist()
train[CATS] = train[CATS].astype("category")
reg = XGBRegressor(enable_categorical=True)
7. early_stopping_rounds
概要:
指定したラウンド数の間に改善が見られない場合、学習を自動停止します。
- 過剰な学習を防ぐため、アーリーストッピングが有効です。
- ここでは100ラウンドと設定しているため、100回精度向上が見られなければ自動で学習を停止します。
調整の進め方
- まずはベースライン設定で動かす
ここで示したパラメータを元にモデルを学習させ、基本的な性能を把握します。 - 主要パラメータの微調整
- max_depth:データの複雑さに応じて、深さを調整し、過学習と汎化性能のバランスを確認します。
- colsample_bytreeやsubsample:値を上下させ、各木がどれだけの特徴量・データを利用しているかを試し、精度の変動をチェックします。
- 学習率とブースティングラウンド
- 学習率を上げると高速に学習できる反面、安定性が損なわれる可能性があるため、調整は慎重に。
- n_estimatorが小さすぎても学習が収束する前に終わってしまいます。cv結果見つつ調整していきましょう。
- その他のパラメータ
- min_child_weightは過学習防止に効果的。データの分布に合わせて試行錯誤しましょう。
- カテゴリ変数が多い場合、enable_categoricalの活用も考えましょう。
まとめ
XGBoost のパラメータチューニングでは、まずベースライン設定で特徴量エンジニアリングによる精度変化を確認する方針が有効です。実際、パラメータチューニングよりも特徴量エンジニアリングが精度向上に大きく寄与するケースが多く見られます。
今回の例では、まず max_depth、colsample_bytree、subsample、learning_rate など、重要なパラメータに焦点を当てました。実際のコンペティションでは、これらのパラメータを調整しながら、学習曲線や評価指標を綿密に観察し、最適なバランスを見つけることが重要です。まずはベースライン設定を試し、そこから各パラメータの挙動や影響を徐々に把握していくと良いでしょう。
参考) LGBM / CatBoost版 パラメータ – ベースライン付きガイド
コメント