LightGBMでベイズ最適化したい

2024年6月17日

ベイズ最適化を行うために、hyperopt ライブラリを使用してハイパーパラメータの探索を行います。以下に、hyperopt を用いた LightGBM モデルのベイズ最適化の例を示します。

python
from hyperopt import hp, fmin, tpe, Trials
import lightgbm as lgb
from sklearn.metrics import accuracy_score

# ハイパーパラメータ探索空間の定義
space = {
    'num_leaves': hp.choice('num_leaves', range(20, 150)),
    'max_depth': hp.choice('max_depth', range(5, 15)),
    'learning_rate': hp.uniform('learning_rate', 0.01, 0.5),
    'subsample': hp.uniform('subsample', 0.5, 1),
    'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1),
    'min_child_samples': hp.choice('min_child_samples', range(5, 100)),
}

# 最適化する目的関数の定義
def objective(params):
    # LightGBMのパラメータを設定
    lgb_params = {
        'boosting_type': 'gbdt',
        'objective': 'multiclass',
        'num_class': num_classes,
        'metric': 'multi_logloss',
        **params
    }
    
    # LightGBMのトレーニング
    lgb_model = lgb.train(lgb_params, lgb_train, num_boost_round=100)
    
    # テストデータでの予測
    y_pred_lgb = lgb_model.predict(X_rf_test, num_iteration=lgb_model.best_iteration)
    y_pred_lgb = np.argmax(y_pred_lgb, axis=1)
    
    # 正解率を計算して返す
    accuracy = accuracy_score(y_test, y_pred_lgb)
    return -accuracy  # 最大化するためにマイナスをかける

# ベイズ最適化の実行
trials = Trials()
best = fmin(objective, space, algo=tpe.suggest, max_evals=50, trials=trials)
print("Best hyperparameters:", best)

このコードでは、num_leavesmax_depthlearning_ratesubsamplecolsample_bytreemin_child_samples の各ハイパーパラメータについて、探索範囲として適切な分布を指定し、fmin 関数で最適なハイパーパラメータを探索します。

未分類

Posted by ぼっち