XGBoost (eXtreme Gradient Boosting)
XGBoost
(eXtreme Gradient Boosting)
캐글을 정복한 알고리즘 — 그래디언트 부스팅을 극한까지 최적화한 강력한 앙상블 완전 정복
목차
그래디언트 부스팅의 핵심 아이디어
앞서 랜덤 포레스트는 배깅(Bagging) 앙상블이었습니다. 여러 트리를 독립적으로 학습하고 결과를 평균냅니다. 반면 부스팅(Boosting)은 전혀 다른 접근법입니다. 트리를 순차적으로 학습하며, 이전 트리가 틀린 샘플에 더 집중합니다.
그래디언트 부스팅(Gradient Boosting)은 이 아이디어를 수학적으로 엄밀하게 정립한 것입니다. 각 단계에서 이전 모델의 잔차(residual)의 방향, 즉 손실 함수의 음의 그래디언트를 예측하는 새 트리를 추가합니다.
그래디언트 부스팅 vs 배깅 비교
여기서 η는 학습률(learning rate), hₘ(x)는 m번째 트리의 예측값입니다.
XGBoost가 특별한 이유
XGBoost(eXtreme Gradient Boosting)는 2014년 Tianqi Chen이 개발한 그래디언트 부스팅의 최적화 구현체입니다. 단순한 구현 개선이 아닌, 알고리즘 자체에 여러 핵심 혁신을 담고 있습니다.
정규화항 내장
목적 함수에 L1/L2 정규화를 포함해 과적합을 알고리즘 수준에서 방지합니다.
2차 근사 활용
1차 미분(gradient)만 사용하는 기존과 달리 2차 미분(hessian)까지 활용해 더 정확하게 최적화합니다.
결측치 자동 처리
결측값을 각 분기에서 최적 방향으로 자동으로 처리합니다. 별도 전처리 불필요.
병렬 처리
분기점 탐색을 병렬로 처리합니다. 순차적 부스팅이지만 트리 내부는 병렬입니다.
목적 함수와 정규화항
XGBoost의 목적 함수는 손실 함수(Loss)와 정규화항(Regularization)의 합입니다:
Ω(f) = γT + (1/2)λ‖w‖² + α‖w‖₁
정규화항 Ω(f)의 각 요소:
T: 리프 노드의 수 —γ가 클수록 트리가 단순해짐‖w‖²: 리프 가중치의 L2 정규화 —λ로 제어‖w‖₁: 리프 가중치의 L1 정규화 —α로 제어
2차 근사 — 테일러 전개 활용
XGBoost는 손실 함수를 2차 테일러 전개로 근사합니다. 이를 통해 분기점 탐색을 닫힌 형태(closed form)로 풀 수 있어 계산이 훨씬 빠릅니다.
gᵢ = ∂ŷ l(yᵢ, ŷ⁽ᵗ⁻¹⁾) (1차 미분, gradient)
hᵢ = ∂²ŷ l(yᵢ, ŷ⁽ᵗ⁻¹⁾) (2차 미분, hessian)
이 근사를 통해 최적 리프 가중치와 최적 분기 이득을 닫힌 형태로 계산할 수 있습니다:
트리 분기 최적화
Exact Greedy Algorithm
모든 가능한 분기점을 탐색합니다. 정확하지만 메모리와 시간이 많이 필요합니다.
Approximate Algorithm (근사 탐색)
특성 값을 분위수(quantile)로 나누어 후보 분기점만 탐색합니다. 대용량 데이터에 사용합니다.
Weighted Quantile Sketch
단순 분위수가 아닌 hessian 가중 분위수를 사용해 더 정확한 근사를 제공합니다.
colsample_bytree, colsample_bylevel로 제어하며, 과적합 방지와 학습 속도 향상에 도움됩니다.
XGBoost의 핵심 기법들
| 기법 | 설명 | 효과 |
|---|---|---|
| Shrinkage (η) | 각 트리의 기여도를 학습률 η로 축소 | 이후 트리들이 보정할 여지를 남김 → 과적합 방지 |
| Row Subsampling | 각 트리 학습 시 데이터의 일부만 사용 | 분산 감소, 과적합 방지, 속도 향상 |
| Column Subsampling | 각 트리/분기에서 특성의 일부만 사용 | 트리 다양성 증가, 과적합 방지 |
| Early Stopping | 검증 성능이 개선되지 않으면 조기 중단 | 최적 트리 수 자동 결정, 과적합 방지 |
| Sparsity Awareness | 결측치와 0값에 대해 최적 방향 학습 | 별도 결측치 처리 불필요 |
| Cache Optimization | 데이터 접근 패턴을 CPU 캐시에 최적화 | 메모리 접근 효율 대폭 향상 |
주요 하이퍼파라미터
하이퍼파라미터 그룹별 정리
부스팅 제어
n_estimators — 트리 수 (100~1000)learning_rate η — 학습률 (0.01~0.3)max_depth — 트리 깊이 (3~10)
과적합 방지
min_child_weight — 최소 hessian 합subsample — 행 샘플링 비율colsample_bytree — 열 샘플링
정규화
reg_alpha α — L1 정규화reg_lambda λ — L2 정규화gamma γ — 최소 분기 이득
성능 향상
tree_method — 분기 알고리즘device — 'cpu'/'cuda' GPU 지원n_jobs — 병렬 처리 수
Python 구현 예제
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import roc_auc_score
# 1. 데이터 준비
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.15)
# 2. 모델 정의
model = xgb.XGBClassifier(
n_estimators=500,
learning_rate=0.05,
max_depth=4,
min_child_weight=1,
subsample=0.8,
colsample_bytree=0.8,
reg_alpha=0.1,
reg_lambda=1.0,
eval_metric='auc',
random_state=42
)
# 3. Early Stopping 적용
model.fit(
X_tr, y_tr,
eval_set=[(X_val, y_val)],
early_stopping_rounds=30,
verbose=50
)
# 4. 평가
y_proba = model.predict_proba(X_test)[:, 1]
print(f"AUC-ROC: {roc_auc_score(y_test, y_proba):.4f}")
print(f"최적 트리 수: {model.best_iteration}")
Optuna를 활용한 자동 하이퍼파라미터 튜닝
def objective(trial):
params = {
'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
'learning_rate': trial.suggest_float('lr', 0.01, 0.3, log=True),
'max_depth': trial.suggest_int('max_depth', 3, 9),
'subsample': trial.suggest_float('subsample', 0.5, 1.0),
'colsample_bytree': trial.suggest_float('cbt', 0.5, 1.0),
}
model = xgb.XGBClassifier(**params, random_state=42)
return cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc').mean()
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)