카테고리 없음

XGBoost (eXtreme Gradient Boosting)

SuldenLion 2026. 4. 28. 21:11
반응형
XGBoost — AI/ML 엔지니어링 | 머신러닝 기초
AI/ML 엔지니어링 · 머신러닝 기초 #8

XGBoost
(eXtreme Gradient Boosting)

캐글을 정복한 알고리즘 — 그래디언트 부스팅을 극한까지 최적화한 강력한 앙상블 완전 정복

Section 01

그래디언트 부스팅의 핵심 아이디어

앞서 랜덤 포레스트는 배깅(Bagging) 앙상블이었습니다. 여러 트리를 독립적으로 학습하고 결과를 평균냅니다. 반면 부스팅(Boosting)은 전혀 다른 접근법입니다. 트리를 순차적으로 학습하며, 이전 트리가 틀린 샘플에 더 집중합니다.

그래디언트 부스팅(Gradient Boosting)은 이 아이디어를 수학적으로 엄밀하게 정립한 것입니다. 각 단계에서 이전 모델의 잔차(residual)의 방향, 즉 손실 함수의 음의 그래디언트를 예측하는 새 트리를 추가합니다.

그래디언트 부스팅 vs 배깅 비교

배깅 (랜덤 포레스트) — 병렬 원본 데이터 트리 1 트리 2 트리 3 평균 / 다수결 부스팅 (XGBoost) — 순차 원본 데이터 트리 1 → 잔차₁ 트리 2 → 잔차₂ Σ 가중 합산
그래디언트 부스팅 예측 (반복 추가) F̂ₘ(x) = F̂ₘ₋₁(x) + η · hₘ(x)

여기서 η는 학습률(learning rate), hₘ(x)는 m번째 트리의 예측값입니다.

Section 02

XGBoost가 특별한 이유

XGBoost(eXtreme Gradient Boosting)는 2014년 Tianqi Chen이 개발한 그래디언트 부스팅의 최적화 구현체입니다. 단순한 구현 개선이 아닌, 알고리즘 자체에 여러 핵심 혁신을 담고 있습니다.

정규화항 내장

목적 함수에 L1/L2 정규화를 포함해 과적합을 알고리즘 수준에서 방지합니다.

2차 근사 활용

1차 미분(gradient)만 사용하는 기존과 달리 2차 미분(hessian)까지 활용해 더 정확하게 최적화합니다.

결측치 자동 처리

결측값을 각 분기에서 최적 방향으로 자동으로 처리합니다. 별도 전처리 불필요.

병렬 처리

분기점 탐색을 병렬로 처리합니다. 순차적 부스팅이지만 트리 내부는 병렬입니다.

Section 03

목적 함수와 정규화항

XGBoost의 목적 함수는 손실 함수(Loss)정규화항(Regularization)의 합입니다:

XGBoost 목적 함수 Obj = Σᵢ L(yᵢ, ŷᵢ) + Σₖ Ω(fₖ)

Ω(f) = γT + (1/2)λ‖w‖² + α‖w‖₁

정규화항 Ω(f)의 각 요소:

  • T: 리프 노드의 수 — γ가 클수록 트리가 단순해짐
  • ‖w‖²: 리프 가중치의 L2 정규화 — λ로 제어
  • ‖w‖₁: 리프 가중치의 L1 정규화 — α로 제어
기존 그래디언트 부스팅과의 차이: 기존 GBM은 정규화항 없이 학습률과 트리 깊이로만 복잡도를 조절합니다. XGBoost는 목적 함수 자체에 정규화를 포함해 수학적으로 더 엄밀하게 과적합을 제어합니다.
Section 04

2차 근사 — 테일러 전개 활용

XGBoost는 손실 함수를 2차 테일러 전개로 근사합니다. 이를 통해 분기점 탐색을 닫힌 형태(closed form)로 풀 수 있어 계산이 훨씬 빠릅니다.

테일러 2차 근사 L ≈ Σᵢ [l(yᵢ, ŷᵢ⁽ᵗ⁻¹⁾) + gᵢfₜ(xᵢ) + (1/2)hᵢfₜ(xᵢ)²] + Ω(fₜ)

gᵢ = ∂ŷ l(yᵢ, ŷ⁽ᵗ⁻¹⁾)  (1차 미분, gradient)
hᵢ = ∂²ŷ l(yᵢ, ŷ⁽ᵗ⁻¹⁾)  (2차 미분, hessian)

이 근사를 통해 최적 리프 가중치와 최적 분기 이득을 닫힌 형태로 계산할 수 있습니다:

최적 분기 이득 (Gain) Gain = (1/2) [ G²_L/(H_L+λ) + G²_R/(H_R+λ) − (G_L+G_R)²/(H_L+H_R+λ) ] − γ
hessian의 역할: 2차 미분 정보는 손실 곡면의 곡률을 나타냅니다. 곡률이 큰 방향에서는 조심스럽게, 작은 방향에서는 과감하게 업데이트합니다. 이것이 XGBoost가 기존 GBM보다 빠르게 수렴하는 핵심 이유입니다.
Section 05

트리 분기 최적화

Exact Greedy Algorithm

모든 가능한 분기점을 탐색합니다. 정확하지만 메모리와 시간이 많이 필요합니다.

Approximate Algorithm (근사 탐색)

특성 값을 분위수(quantile)로 나누어 후보 분기점만 탐색합니다. 대용량 데이터에 사용합니다.

Weighted Quantile Sketch

단순 분위수가 아닌 hessian 가중 분위수를 사용해 더 정확한 근사를 제공합니다.

Column Subsampling: 랜덤 포레스트처럼 각 트리 또는 분기에서 특성을 무작위로 선택합니다. colsample_bytree, colsample_bylevel로 제어하며, 과적합 방지와 학습 속도 향상에 도움됩니다.
Section 06

XGBoost의 핵심 기법들

기법설명효과
Shrinkage (η) 각 트리의 기여도를 학습률 η로 축소 이후 트리들이 보정할 여지를 남김 → 과적합 방지
Row Subsampling 각 트리 학습 시 데이터의 일부만 사용 분산 감소, 과적합 방지, 속도 향상
Column Subsampling 각 트리/분기에서 특성의 일부만 사용 트리 다양성 증가, 과적합 방지
Early Stopping 검증 성능이 개선되지 않으면 조기 중단 최적 트리 수 자동 결정, 과적합 방지
Sparsity Awareness 결측치와 0값에 대해 최적 방향 학습 별도 결측치 처리 불필요
Cache Optimization 데이터 접근 패턴을 CPU 캐시에 최적화 메모리 접근 효율 대폭 향상
Section 07

주요 하이퍼파라미터

하이퍼파라미터 그룹별 정리

부스팅 제어

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 — 병렬 처리 수

Section 08

Python 구현 예제

Python import xgboost as xgb
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를 활용한 자동 하이퍼파라미터 튜닝

Python — Optuna + XGBoost import 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)

핵심 정리

알고리즘 유형앙상블 / 순차 부스팅
핵심 혁신2차 근사 + 정규화 내장 + 병렬처리
목적 함수손실함수 + L1/L2 정규화 + 트리 복잡도
결측치자동 처리 (전처리 불필요)
장점높은 성능, 정규화 내장, 조기 종료, GPU 지원
한계파라미터 많음, 학습 느림, 메모리 많이 사용
반응형