Classification: Santander Customer Satisfaction에서 수행한 결과를 바탕으로 XGBoost와 LightGBM 하이퍼파라미터 튜닝 실험을 진행하였다.
캐글 Santander Customer Satisfaction 데이터를 기반으로
하이퍼파라미터 튜닝을 통해 XGBoost, LightGBM 모델의 성능을 개선하고, 최종적으로 ROC AUC 성능이 가장 높은 하이퍼 파라미터 조합을 도출하는 것을 목표로 진행하였다.
🛠️ 실험 환경: Python, Scikit-learn, XGBoost, LightGBM, Jupyter Notebook
🪧 성능 기준: ROC AUC
XGBClassifier(n_estimators=500, learning_rate=0.05, eval_metric='auc')
# Best params from HyperOpt
{
'n_estimators': 500,
'colsample_bytree': 0.6849,
'learning_rate': 0.0709,
'max_depth': 6,
'min_child_weight': 5
}
max_depth
min_child_weight
| 실험 | max_depth | min_child_weight | ROC AUC |
|---|---|---|---|
| 1-1 | 5 | 4 | 0.8441 |
| 1-2 | 5 | 5 | 0.8456 |
| 1-3 | 6 | 5 | 0.8465 |
| 1-4 | 6 | 6 | 0.8455 |
| 1-5 | 7 | 5 | 0.8463 |
- max_depth=6, min_child_weight=5일 때, ROC-AUC가 0.8465로 가장 높은 성능을 보인다.
- 너무 낮거나 높은 depth는 성능 저하 또는 과적합 문제가 발생할 수 있으므로 주의가 필요하다.
colsample_bytree:
| 실험 | colsample_bytree | ROC AUC |
|---|---|---|
| 2-1 | 0.60 | 0.8464 |
| 2-2 | 0.65 | 0.8469 |
| 2-3 | 0.70 | 0.8457 |
| 2-4 | 0.80 | 0.8446 |
- colsample_bytree=0.65에서 ROC-AUC가 0.8469로 미세한 성능 향상을 보인다.
- 너무 높거나 낮은 경우 모두 성능 저하 경향이 있으므로, 적절한 피처 샘플링 비율이 필요하다.
learning_rate
n_estimators
| 실험 | learning_rate | n_estimators | ROC AUC |
|---|---|---|---|
| 3-1 | 0.05 | 500 | 0.8468 |
| 3-2 | 0.03 | 700 | 0.8464 |
| 3-3 | 0.06 | 500 | 0.8471 |
| 3-4 | 0.07 | 500 | 0.8462 |
- learning_rate=0.06에서 ROC-AUC가 0.8471로 미세한 성능 향상을 보인다.
각 파라미터에 대해 실험을 반복하면서 실제 ROC AUC 수치의 미세한 변화에 대한 해석을 시도했고,
그 결과 최적의 하이퍼파라미터 조합을 다음과 같이 도출할 수 있었습니다:
XGBClassifier(
n_estimators=500,
learning_rate=0.06,
max_depth=6,
min_child_weight=5,
colsample_bytree=0.65,
early_stopping_rounds=100,
eval_metric='auc',
use_label_encoder=False
)
최종 ROC AUC: 0.8471
{
'n_estimators': 500,
'learning_rate': 0.0594,
'max_depth': 115,
'min_child_samples': 64,
'num_leaves': 38,
'subsample': 0.8226
}
LightGBM은 num_leaves가 트리의 복잡도를 더 직접적으로 통제하지만, max_depth로 성장을 제한하면 연산을 최적화하고 과적합을 방지할 수 있다.
| 실험 | max_depth | ROC AUC |
|---|---|---|
| 1-1 | 115 | 0.8423 |
| 1-2 | 50 | 0.8423 |
| 1-3 | 30 | 0.8423 |
| 1-4 | 10 | 0.8430 |
| 1-5 | 130 | 0.8423 |
- max_depth=30에서 ROC-AUC가 0.8430으로 미세한 성능 향상을 보인다.
- max_depth=10~30 범위에서도 충분한 표현력을 확인할 수 있으며, 너무 깊은 트리는 오히려 과적합의 원인이 될 수 있다.
num_leaves:
num_leaves가 많으면 모델 표현력이 좋아지지만, 과적합 위험도가 올라간다.| 실험 | num_leaves | ROC AUC |
|---|---|---|
| 2-1 | 38 | 0.8430 |
| 2-2 | 64 | 0.8424 |
| 2-3 | 20 | 0.8420 |
| 2-4 | 32 | 0.8419 |
| 2-5 | 37 | 0.8437 |
- num_leaves=37에서 ROC-AUC가 0.8437로 미세한 성능 향상을 보인다.
- num_leaves=37이 가장 높은 AUC를 기록했지만, 전반적인 성능 차이가 미세하여 실험 결과의 통계적 유의성은 낮을 수 있다.
subsample:
| 실험 | subsample | ROC AUC |
|---|---|---|
| 3-1 | 0.82 | 0.8437 |
| 3-2 | 0.90 | 0.8437 |
| 3-3 | 0.70 | 0.8437 |
| 3-4 | 1.00 | 0.8437 |
- 모든 실험에서 성능 동일함이 확인되어 subsample=0.82를 유지한다.
- subsample은 0.7~1.0 사이에서 성능 민감도 낮은 것을 확인했으므로 기본값을 유지할 수 있다.
| 실험 | learning_rate | ROC AUC |
|---|---|---|
| 4-1 | 0.0594 | 0.8443 |
| 4-2 | 0.06 | 0.8414 |
| 4-3 | 0.05 | 0.8414 |
| 4-4 | 0.04 | 0.8415 |
- learning_rate는 Best params인 0.0594에서 가장 높은 성능을 보인다.
LGBMClassifier(
n_estimators=500,
learning_rate=0.0594,
max_depth=30,
num_leaves=37,
min_child_samples=64,
subsample=0.82
)
최종 ROC AUC: 0.8443
| Model | ROC AUC | 최종 설정 |
|---|---|---|
| XGBoost | 0.8471 | max_depth=6, learning_rate=0.06, colsample_bytree=0.65 |
| LightGBM | 0.8443 | max_depth=30, learning_rate=0.0594, num_leaves=37 |
XGBoost가 미세하게 더 높은 ROC AUC를 보여주었다.
학습 속도와 리소스 효율성 측면을 고려했을 때 LightGBM도 좋은 선택이 될 수 있으므로 실제 적용 환경에 따라 적절한 모델 선택 기준을 세워야 한다.
각 실험을 통해 성능에 민감한 하이퍼파라미터를 구분하고, 불필요한 복잡도나 과적합을 유발하는 설정을 배제함으로써 성능을 향상시킬 수 있었다.
이번 실험을 통해 하이퍼파라미터가 모델 성능에 미치는 영향과 그 민감도를 확인할 수 있었다.
XGBoost 실험에서는 max_depth, min_child_weight, colsample_bytree, learning_rate와 같은 주요 파라미터를 변경할 때마다 ROC AUC 점수가 미세하게 변동되었고, 이 중 learning_rate=0.06 조합이 가장 높은 성능(0.8471)을 보여주었다. colsample_bytree와 같이 상대적으로 간과하기 쉬운 파라미터도 성능 향상에 유의미한 영향을 줄 수 있음을 확인하였다.
LightGBM 실험에서는 HyperOpt가 도출한 max_depth=115가 과도한 복잡도로 인해 오히려 성능 개선에 도움이 되지 않았고, max_depth=30 수준에서 더 안정적인 성능을 보여주었다. 이를 통해 LightGBM이 빠르고 효율적인 구조를 갖고 있기 때문에, 적절한 깊이와 리프 수 조절이 성능과 학습 시간 모두에 긍정적인 영향을 준다는 것을 확인할 수 있었다.
실험 중 subsample, num_leaves, learning_rate 등은 일정 범위 내에서는 성능에 큰 영향을 주지 않는 구간이 존재한다는 점을 알 수 있었다. 추후 모델 튜닝 시에는 민감도가 높은 파라미터부터 우선 조정하는 것이 효율적이겠다는 생각을 할 수 있었다.
실험 결과와는 관련 없는 이야기지만, 로그 관리(verbosity, early stopping, log_evaluation 등)와 GPU 활용을 통해 모델 학습 시간을 줄이고 불필요한 출력 로그를 제거하는 방법을 찾아보며 효율적으로 모델링하는 방법을 정리해가는 시간이 되었다.
해당 실험은 책 『파이썬 머신러닝 완벽가이드』 를 참고하며 진행하였으며, 책에서 제안된 하이퍼파라미터 튜닝 순서를 따르되 실험 결과를 바탕으로 어떤 조합이 실제 성능에 어떤 영향을 주는지를 실험하는 데 중점을 두었다.