はじめに
LightGBMのパラメータについて生成AIに聞きながら少し勉強したので記録。
パラメータ例(AIに重要なものを出してもらった)
params = {
"objective": "binary", # 目的関数(二値分類)
"metric": "binary_error", # 評価指標(誤分類率)
# --- 学習制御 ---
"learning_rate": 0.05, # 学習率(小さいと安定、大きいと速いが過学習しやすい)
"n_estimators": 1000, # 木の本数(大きめに設定し early_stopping で止める)
# --- 木の構造 ---
"num_leaves": 31, # 葉の数(木の複雑さを決める)
"max_depth": 6, # 木の深さ(深すぎると過学習)
"min_data_in_leaf": 20, # 葉に必要な最小データ数(大きいほど過学習防止)
# --- サンプリング ---
"feature_fraction": 0.8, # 特徴量のサブサンプリング率
"bagging_fraction": 0.8, # データのサブサンプリング率
"bagging_freq": 5, # サブサンプリングの頻度
# --- 正則化 ---
"lambda_l1": 0.1, # L1 正則化(不要な特徴量を抑制)
"lambda_l2": 0.1, # L2 正則化(過学習を防ぐ)
}
model = lgb.LGBMClassifier(**params)
基本設定
目的関数(objective)
"binary" → 2値分類(例:良い/悪い、0/1)
"multiclass" → 多クラス分類(例:犬/猫/鳥)
"regression" → 回帰(数値予測、例:家の価格)
metric 評価指標(metric)
"binary_error" → 分類の誤り率(accuracyの逆)
"auc" → ROC-AUCスコア(分類性能によく使われる)
"rmse" → 回帰用の平均二乗誤差
"mae" → 回帰用の平均絶対誤差
出力の表示レベル(verbosity)
-1 → 余計なログを表示しない
0 → 警告だけ表示
1 → 重要な情報を表示
2 → 詳細なログを表示
ブースティング手法(boosting_type)
"gbdt" → 一般的な勾配ブースティング(デフォルト)
"dart" → Dropouts meet Multiple Additive Regression Trees(過学習に強い)
"goss" → Gradient-based One-Side Sampling(高速学習用)
1. 学習率と木の数
・learning_rate
1ステップごとの学習の大きさ。小さいほど学習は遅いが安定する。
一般に 0.01 ~ 0.1 を試すことが多い。
小さくしたら n_estimators を増やしてカバーする必要あり。
・n_estimators / num_iterations
木の本数。大きく設定して、early_stopping_rounds で止めるのが定石。
2. 木の複雑さ
num_leaves
木の葉っぱの数。大きいほど複雑なモデルになる。
多すぎると過学習、小さすぎると表現力不足。
max_depth
木の深さの上限。デフォルトは -1(制限なし)。
過学習しやすいので通常は 3〜12 程度に設定。
min_data_in_leaf
1つの葉に必要な最小サンプル数。
値を大きくすると「小さい葉」ができずに過学習防止になる。
3. サンプリング
feature_fraction
各木を学習するときに使う特徴量の割合。
例: 0.8 → 特徴量の80%をランダムに使用。
ランダム性を入れることで汎化性能アップ。
bagging_fraction
各木を学習するときに使うデータの割合(行サンプル)。
例: 0.8 → データの80%をランダムに使用。
bagging_freq とセットで使う。
4. 正則化(過学習防止)
lambda_l1
L1 正則化。特徴量選択の効果を持つ。
lambda_l2
L2 正則化。モデルの重みを小さく抑え、安定性を上げる。
min_split_gain
新しい分割を行うために必要な「最小の利得」。
値を大きくすると分割が厳しくなり、木がシンプルになる。
最後に
ちょっとした記録でした。