以前、以下の記事でXGBoostのパラメータガイドを公開いたしました。
今回はこれのLGBM/CatBoost版です。
- LightGBM版パラメータチューニング
- 1. device=”gpu”
- 2. num_leaves & max_depth
- 3. feature_fraction & bagging_fraction
- 4. n_estimators & learning_rate
- 5. min_child_samples
- 6. categorical_feature
- 7. early_stopping_rounds
- 調整の進め方(LightGBM)
- CatBoost版パラメータチューニング
- 1. task_type
- 2. depth
- 3. iterations & learning_rate
- 4. l2_leaf_reg
- 5. random_strength & bagging_temperature
- 6. one_hot_max_size
- 7. early_stopping_rounds
- 8. cat_features
- 調整の進め方(CatBoost)
- まとめ
LightGBM版パラメータチューニング
from lightgbm import LGBMRegressor
model = LGBMRegressor( # boosting_type='gbdt',
device='gpu',
num_leaves=31, # 木の葉の数(基本値: 31)大きすぎると過学習リスク
max_depth=6, # 木の深さ(基本値: 6)葉の数と合わせて調整
feature_fraction=0.5, # 1本の木ごとの特徴量の割合(基本値: 0.5)
bagging_fraction=0.8, # 学習時に使用するデータの割合(基本値: 0.8)
n_estimators=10000, # ブースティングラウンド数
learning_rate=0.02, # 各ラウンドの学習率(低めで安定性を確保)
min_child_samples=10, # 葉に含まれるデータの最小サンプル数
)
このコードをベースに、各パラメータの意味と調整の優先順位について見ていきましょう。
1. device=”gpu”
概要:
GPU環境が利用可能な場合、計算速度が大幅に向上します。
ポイント:
- まずはGPUが利用できるか確認しましょう。
- Kaggleやクラウド環境ではGPUが一般的に提供されるため、最初から有効にしておいても良いでしょう。
2. num_leaves & max_depth
概要:
LightGBMでは、num_leavesが各木の複雑さを決定する主要なパラメータです。
max_depthも併用することで、木の深さを制限し過学習を防ぎます。
(ベースライン値: num_leaves=31, max_depth=6)
- num_leavesが大きすぎると、複雑すぎて過学習のリスクが上がります。
- まずは31から始め、過学習気味であれば減らし、精度が伸び悩む場合は調整してみましょう。
3. feature_fraction & bagging_fraction
概要:
特徴量とデータのサブサンプリングで、各ツリーの多様性を確保し、過学習を防ぎます。
- feature_fraction: 1本の木を作る際に使用する特徴量の割合。
(ベースライン値: 0.5) - bagging_fraction: 学習時に利用するデータの割合。
(ベースライン値: 0.8) - どちらも0~1の範囲で設定し、0.5~0.8あたりが一般的です。
4. n_estimators & learning_rate
概要:
ブースティングラウンド数と各ラウンドでの学習率の設定です。
- n_estimatorsは多めに設定し、early_stopping_roundsで調整します。
- learning_rateは低め(例:0.02)で設定し、安定した学習を目指します。
5. min_child_samples
概要:
各葉に含まれるデータの最小サンプル数を指定し、過学習を防ぎます。
- 高い値に設定すると、よりロバストな(過学習しにくい)モデルになります。
- 初学者はベースラインの10から始め、必要に応じて調整してください。
6. categorical_feature
概要:
LightGBMは、カテゴリ変数を扱う機能があり、学習前にカテゴリ型として指定することで自動的に処理します。
# カテゴリ変数の設定例
CATS = train.select_dtypes(include=["object"]).columns.tolist()
train_data = lgb.Dataset(train[features], label=train[target], categorical_feature=CATS)
7. early_stopping_rounds
概要:
一定ラウンド内で改善が見られなければ学習を自動停止します。
- 過学習防止のため、early_stopping_roundsを活用することが有効です。
- ここでは100ラウンドと設定しています。
調整の進め方(LightGBM)
- ベースライン設定で動作確認
まずは上記のパラメータで学習させ、基本性能を把握。 - 主要パラメータの微調整
- num_leavesとmax_depth:モデルの複雑さを調整し、過学習と汎化性能のバランスを確認。
- feature_fractionとbagging_fraction:サブサンプリングの割合を変化させ、性能の変動をチェック。
- 学習率の調整
cv結果を見ながら、微調整。 - その他のパラメータ
min_child_samplesなど、過学習防止のためのパラメータも必要に応じて調整。
CatBoost版パラメータチューニング
from catboost import CatBoostRegressor
model = CatBoostRegressor(task_type='GPU',
depth=6, # 木の深さ(基本値: 6)
iterations=10000, # ブースティングラウンド数
learning_rate=0.02, # 各ラウンドの学習率(低めで安定性確保)
l2_leaf_reg=3, # 正則化項。(基本値: 3)
random_strength=1, # ランダム性の強さ(ノイズ除去に寄与)
bagging_temperature=1, # サンプリングの温度パラメータ
one_hot_max_size=10, # カテゴリ変数のone-hotの閾値
early_stopping_rounds=100, # 改善が見られなければ学習停止
cat_features: CATS #カテゴリ変数名のリスト
)
CatBoostは、カテゴリ変数の自動処理機能が優れています。
上記のコード例を元に、主要パラメータの意味と調整方法を確認していきましょう。
1. task_type
概要:
GPU環境での高速学習を実現します。
ポイント:
- まずはGPUが利用できるか確認し、適宜’task_type’を設定してください。
- クラウド環境などでは、GPUが標準的に利用可能な場合が多いです。
2. depth
概要:
各決定木の深さを指定します。
(ベースライン値: 6)
- 深さが大きすぎると過学習リスクが高まるため、基本は6から開始し、調整を行いましょう。
3. iterations & learning_rate
概要:
CatBoostでは、iterationsがブースティングラウンド数、learning_rateが各ラウンドでの学習率です。
- iterationsは多めに設定し、early_stopping_roundsで調整可能。
- learning_rateは0.02など低めに設定し、学習の安定性を確保します。
4. l2_leaf_reg
概要:
葉ごとのL2正則化項です。
過学習防止に効果的です。
- 正則化項の値を調整することで、モデルの汎化性能を改善できます。
- 初学者はベースライン値の3から始め、必要に応じて調整してください。
5. random_strength & bagging_temperature
概要:
これらのパラメータは、モデルにランダム性を与えることでノイズに強くし、過学習を抑制します。
- random_strength: 乱数の強さを調整します。(ベースライン値: 1)
- bagging_temperature: サンプリングの温度パラメータ。値が大きいほど多様なサンプルが利用されます。(ベースライン値: 1)
6. one_hot_max_size
概要:
カテゴリ変数が一定のサイズ以下の場合、one-hotエンコーディングを自動で適用します。
CatBoostは、カテゴリ変数を自動的に処理するため、特に事前のエンコーディングは不要です。
7. early_stopping_rounds
概要:
指定ラウンド内に改善が見られなければ学習を停止します。
- 過学習防止のため、early_stopping_roundsを設定し、適宜調整します。
- ここでは100ラウンドと設定しています。
8. cat_features
概要:
カテゴリ変数を明示的に指定するパラメータです。
カテゴリ変数名ののリストを入れますが、以下のようなコードでobject型にしておく必要があることに注意してください。なお、以下のコードでは欠損値も”NaN”として新しいカテゴリとなります。
CATS = [cat_1, cat_2,...] # カテゴリ変数名のリスト
train[CATS] = train[CATS].astype(str)
test[CATS] = test[CATS].astype(str)
ポイント:
- カテゴリ変数をリスト形式で指定し、CatBoostが最適なエンコーディングを自動で実施できるようにします。
- 指定する際は、カラム名またはインデックスで設定してください。
- データセット内のカテゴリ変数を事前に把握しておくと、より効果的にモデルのパフォーマンス向上が期待できます。
調整の進め方(CatBoost)
- ベースライン設定で動作確認
上記パラメータでモデルを学習させ、初期性能を確認します。 - 主要パラメータの微調整
- depth:モデルの複雑さを調整し、過学習と汎化性能のバランスを確認。
- iterationsとlearning_rate:cv結果を見ながら最適な組み合わせを模索します。
- 正則化やランダム性の調整
l2_leaf_reg、random_strength、bagging_temperatureの値を調整し、ノイズへの対応力を強化。 - カテゴリ変数の扱い
CatBoostの自動処理を活用し、必要に応じてone_hot_max_sizeを調整。
まとめ
LightGBMおよびCatBoostのパラメータチューニングでは、まずベースライン設定で各種パラメータの影響を確認し、その後主要パラメータ(ツリーの深さ、サブサンプリング、学習率など)を微調整することが重要です。
実際のコンペティションや実務では、学習曲線や評価指標を綿密に観察し、各パラメータの最適な組み合わせを見つけるプロセスが不可欠です。
まずはベースライン設定で動作確認し、そこから各パラメータの挙動を理解して調整していくといいでしょう。
コメント