
앞선 글에서
- 1편: 앙상블 개념과 보팅(Voting)
- 2편: 배깅(Bagging)과 랜덤 포레스트(Random Forest)
를 살펴보았습니다.
이번 **3편에서는 부스팅(Boosting)**을 다룹니다.
부스팅은 현재 실무와 대회에서 가장 강력한 분류·회귀 성능을 보이는 앙상블 계열이며,
XGBoost와 LightGBM은 사실상 표준 알고리즘으로 자리 잡았습니다.
1. 부스팅(Boosting)이란 무엇인가
부스팅은
여러 개의 약한 학습기(Weak Learner)를 순차적으로 학습시키면서,
이전 모델이 잘못 예측한 데이터에 더 많은 가중치를 부여해
오류를 점진적으로 줄여 나가는 앙상블 학습 방식
입니다.
배깅과의 핵심 차이
| 학습 방식 | 병렬(동시에 학습) | 순차(이전 모델 결과 반영) |
| 데이터 가중치 | 동일 | 오답 데이터 가중치 증가 |
| 목표 | 분산 감소 | 편향 + 분산 감소 |
| 과적합 | 상대적으로 적음 | 잘못 튜닝 시 발생 가능 |
2. 부스팅의 핵심 아이디어
부스팅의 학습 흐름은 다음과 같습니다.
- 첫 번째 약한 모델 학습
- 잘못 예측한 데이터의 가중치 증가
- 다음 모델은 어려운 데이터에 더 집중해 학습
- 이 과정을 반복하면서 전체 오류를 감소
👉 “틀린 문제를 더 많이 복습하는 방식”이라고 이해하면 쉽습니다.
3. 대표적인 부스팅 알고리즘
(1) AdaBoost
- 가장 초기의 부스팅 알고리즘
- 오분류된 샘플의 가중치를 직접 조정
- 단순하지만 대규모 데이터에는 한계
(2) GBM (Gradient Boosting Machine)
GBM은 AdaBoost를 확장한 알고리즘으로,
오차를 줄이는 방향을 수학적으로 최적화합니다.
핵심 개념: 손실 함수와 경사 하강법
- 손실(Loss) = 실제값 − 예측값
- 이 손실을 최소화하는 방향으로 모델을 업데이트
- 이때 **경사 하강법(Gradient Descent)**을 사용
즉,
이전 모델의 예측 오류를 새로운 학습 데이터로 삼아
그 오류를 예측하는 트리를 계속 추가
하는 구조입니다.
주요 하이퍼파라미터
- loss : 손실 함수
- learning_rate : 학습률 (0~1, 기본 0.1)
- n_estimators : 약한 학습기 개수
- subsample : 샘플링 비율
4. GBM 실습
from sklearn.ensemble import GradientBoostingClassifier
import time
import warnings
warnings.filterwarnings('ignore')
# 앞선 글에서 사용한 Human Activity 데이터 로딩
X_train, X_test, y_train, y_test = get_human_dataset()
# 수행 시간 측정 시작
startTime = time.time()
# GBM 모델 생성
gb_clf = GradientBoostingClassifier(random_state=0)
# 모델 학습
gb_clf.fit(X_train, y_train)
# 예측 수행
gb_pred = gb_clf.predict(X_test)
# 정확도 측정
gb_accuracy = accuracy_score(y_test, gb_pred)
print(f"GBM 정확도 : {gb_accuracy}")
print(f"GBM 수행시간 : {time.time() - startTime}")
🔹 GBM의 단점
- 학습 속도가 느림
- 대용량 데이터에서 비효율적
👉 이 단점을 해결한 것이 XGBoost, LightGBM입니다.
5. XGBoost란 무엇인가
XGBoost(eXtreme Gradient Boosting)는
GBM을 속도·성능·안정성 측면에서 크게 개선한 알고리즘입니다.
XGBoost의 특징
- 뛰어난 예측 성능
- CPU / GPU 병렬 처리 지원
- 규제(Regularization) 기능 내장
- 트리 가지치기(Tree Pruning)
- Early Stopping 지원
Native XGBoost vs Scikit-learn Wrapper XGBoost
XGBoost는 두 가지 방식으로 사용할 수 있습니다.
(1) Native XGBoost (xgb.train)
- XGBoost의 원래 API
- DMatrix 사용
- 세밀한 제어 가능
- 실무·대회에서 자주 사용
(2) Scikit-learn Wrapper (XGBClassifier)
- 사이킷런 API 호환
- fit / predict 사용
- GridSearchCV 연동 편리
- 입문자에게 적합
| 구분 | Native | Scikit-learn |
| 데이터 구조 | DMatrix | numpy / DataFrame |
| API 스타일 | Low-level | sklearn 방식 |
| 제어력 | 높음 | 중간 |
| 튜닝 편의성 | 낮음 | 높음 |
7. Native XGBoost 실습
7-1. 데이터 준비
import xgboost as xgb
from xgboost import plot_importance
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
dataset = load_breast_cancer()
X_features = dataset.data
y_label = dataset.target
# 학습 / 테스트 분리
X_train, X_test, y_train, y_test = train_test_split(
X_features, y_label, test_size=0.2, random_state=156
)
# 학습 데이터 중 10%를 검증용으로 분리
X_tr, X_val, y_tr, y_val = train_test_split(
X_train, y_train, test_size=0.1, random_state=156
)
# DMatrix 변환 (XGBoost 전용 데이터 구조)
dtr = xgb.DMatrix(X_tr, label=y_tr)
dval = xgb.DMatrix(X_val, label=y_val)
dtest = xgb.DMatrix(X_test, label=y_test)
7-2. 하이퍼파라미터 설정 및 학습
params = {
'max_depth': 3, # 트리 깊이
'eta': 0.05, # learning_rate
'objective': 'binary:logistic',
'eval_metric': 'logloss'
}
num_rounds = 400
# 평가 데이터 설정
eval_list = [(dtr, 'train'), (dval, 'eval')]
# 모델 학습 + Early Stopping
xgb_model = xgb.train(
params=params,
dtrain=dtr,
num_boost_round=num_rounds,
early_stopping_rounds=50,
evals=eval_list
)
👉 early_stopping_rounds
- 검증 데이터 성능이 지정된 횟수 동안 개선되지 않으면 학습 중단
- 과적합 방지 + 시간 단축
7-3. 예측 및 평가
# 예측 확률 반환
pred_probs = xgb_model.predict(dtest)
# threshold 0.5 기준 클래스 변환
preds = [1 if x > 0.5 else 0 for x in pred_probs]
get_clf_eval(y_test, preds, pred_probs)
7-4. 피처 중요도 시각화
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 12))
plot_importance(xgb_model, ax=ax)
plt.show()
8. LightGBM(LGBM)이란 무엇인가
LightGBM은 XGBoost보다 더 빠르고 가벼운 부스팅 알고리즘입니다.
LightGBM의 핵심 특징
- 매우 빠른 학습 속도
- 낮은 메모리 사용량
- 범주형 피처 자동 처리
- 리프 중심 트리 분할(Leaf-wise) 방식
👉 데이터가 클수록 XGBoost보다 유리한 경우가 많습니다.
9. LightGBM 실습
from lightgbm import LGBMClassifier, early_stopping
# 모델 생성
lgbm_wrapper = LGBMClassifier(
n_estimators=400,
learning_rate=0.05
)
# 평가 데이터 설정
evals = [(X_tr, y_tr), (X_val, y_val)]
# 학습 + Early Stopping
lgbm_wrapper.fit(
X_tr,
y_tr,
eval_set=evals,
eval_metric='logloss',
callbacks=[early_stopping(stopping_rounds=50, verbose=True)]
)
# 예측
preds = lgbm_wrapper.predict(X_test)
pred_proba = lgbm_wrapper.predict_proba(X_test)[:, 1]
get_clf_eval(y_test, preds, pred_proba)
피처 중요도 시각화
from lightgbm import plot_importance
fig, ax = plt.subplots(figsize=(10, 12))
plot_importance(lgbm_wrapper, ax=ax)
plt.show()
결론 요약
- 부스팅은 이전 모델의 오류를 보완하며 학습하는 강력한 앙상블 기법입니다.
- GBM은 개념적으로 중요하지만 느립니다.
- XGBoost는 GBM을 실무 수준으로 개선한 알고리즘입니다.
- LightGBM은 대규모 데이터에서 가장 강력한 선택지 중 하나입니다.
- Early Stopping과 하이퍼파라미터 튜닝이 성능의 핵심입니다.
이로써 **앙상블 3부작(보팅 → 배깅 → 부스팅)**이 완성되었습니다.
'Programming' 카테고리의 다른 글
| (Bayesian Optimization 2편) HyperOpt로 XGBoost 하이퍼파라미터 튜닝 실습 (0) | 2025.12.22 |
|---|---|
| (Bayesian Optimization 1편) GridSearch · RandomSearch · Bayesian Optimization 개념 완전 정리 (1) | 2025.12.22 |
| 앙상블 학습 2편: 배깅(Bagging)과 랜덤 포레스트(Random Forest) 완전 이해 (0) | 2025.12.17 |
| 앙상블 학습(Ensemble Learning) 완전 정리 1편: 개념 이해와 보팅(Voting) 실습 (0) | 2025.12.17 |
| 결정트리 속성 중요도(Feature Importance)와 과적합(Overfitting) 쉽게 이해하기 (0) | 2025.12.16 |