LGBM tuning은 LightGBM(Light Gradient Boosting Machine) 모델의 성능을 최적화하기 위해 하이퍼파라미터를 조정하는 과정을 말한다.
🤔 LGBM 모델?
LGBM, 정확히는 LightGBM(Light Gradient Boosting Machine) 모델은 머신러닝에서 회귀나 분류 문제를 푸는 데 사용하는 트리 기반의 앙상블 학습 알고리즘이다. Microsoft에서 빠르고 정확한 gradient boosting ML 프레임워크로 개발되었다. 대용량 데이터에서도 빠르게 학습이 가능하고, 성능도 뛰어나서 데이콘, 캐글 등에서 자주 사용된다.
💡 Why LGBM?
기존 GBDT(Gradient Boosted Decision Tree)와 비교했을 때, 학습 속도가 훨씬 빠르며(특히 큰 데이터셋에서) 예측 성능이 뛰어나다. 컴퓨팅 리소스 측면에서도 메모리 자원을 효율적으로 아낄 수 있다.
하지만 모델의 성능은 설정한 하이퍼파라미터에 크게 영향을 받기 때문에, 제대로 튜닝해야 좋은 예측 성능을 얻을 수 있다.
⚙️ LGBM은 어떻게 동작할까?
- 기본적으로 Gradient Boosting 방식을 사용
Gradient Boosting Algorithm에 대해서 너무 잘 정리해주신 글이다. 아직 Gradient boosting 방식을 모른다면 반드시 이해하자.
Gradient Boosting Algorithm의 직관적인 이해
Gradient Boosting Algorithm의 직관적인 이해 실패를 통해 성공을 발전시켜라. 낙담과 실패는 성공으로 가는 가장 확실한 두 개의 디딤돌이다. -데일 카네기 Gradient Boosting Algorithm (GBM)은 회귀분석 또는
3months.tistory.com
- 여러 개의 결정 트리(Decision Trees)를 순차적으로 학습
- 이전 트리의 오차를 다음 트리가 보완하면서 모델 전체 성능을 향상
- LGBM은 일반 GBDT와 달리 트리를 depth-wise가 아닌 leaf-wise로 확장하여 더 정확
🔧 LGBM에서 튜닝 가능한 주요 하이퍼파라미터
하이퍼 파라미터 | 설명 | 효과 |
num_leaves | 하나의 트리에서 최대 리프 노드 수 | 클수록 모델 복잡도 증가(단, 너무 큰 num_leaves는 과적합의 위험이 있다) |
max_depth | 트리의 최대 깊이 제한 | 과적합 방지 |
learning_rate | 학습률 | 낮을수록 학습 느리지만 일반화에 좋음 |
n_estimators | 트리 개수 | 많을수록 성능 향상 가능, 과적합 주의 |
min_child_samples | 리프 노드가 되기 위한 최소 샘플 수 | 과적합 방지 |
subsample | 각 트리마다 사용할 데이터 비율 | 0~1 사이, 과적합 방지 |
colsample_bytree | 각 트리마다 사용할 feature 비율 | 과적합 방지 |
reg_alpha, reg_lambda | L1, L2 정규화 항 | 과적합 방지 |
🧪 예시 (Optuna로 튜닝)
def objective(trial, X, y):
params = {
'objective': 'regression', 'metric': 'rmse', 'verbose': -1, 'n_jobs': -1,
'seed': CFG['SEED'], 'boosting_type': 'gbdt', 'n_estimators': 2000,
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.1, log=True),
'num_leaves': trial.suggest_int('num_leaves', 20, 100),
'max_depth': trial.suggest_int('max_depth', 3, 10),
'feature_fraction': trial.suggest_float('feature_fraction', 0.6, 1.0),
'bagging_fraction': trial.suggest_float('bagging_fraction', 0.6, 1.0),
'bagging_freq': trial.suggest_int('bagging_freq', 1, 7),
'min_child_samples': trial.suggest_int('min_child_samples', 5, 50),
}
kf = KFold(n_splits=CFG['N_SPLITS'], shuffle=True, random_state=CFG['SEED'])
oof_preds = np.zeros(len(X))
for train_idx, val_idx in kf.split(X, y):
X_train, X_val = X[train_idx], X[val_idx]
y_train, y_val = y[train_idx], y[val_idx]
model = lgb.LGBMRegressor(**params)
model.fit(X_train, y_train, eval_set=[(X_val, y_val)],
eval_metric='rmse', callbacks=[lgb.early_stopping(100, verbose=False)])
oof_preds[val_idx] = model.predict(X_val)
y_ic50_true = pIC50_to_IC50(y)
oof_ic50_preds = pIC50_to_IC50(oof_preds)
score = get_score(y_ic50_true, oof_ic50_preds, y, oof_preds)
return score
study = optuna.create_study(direction='maximize', study_name='lgbm_tuning')
study.optimize(lambda trial: objective(trial, X, y), n_trials=CFG['N_TRIALS'])
현재 Jump AI 2025 : 제 3회 AI 신약개발 경진대회를 참가하면서 baseline 코드를 lgbm으로 튜닝한 실제 코드이다.
댓글