본문으로 건너뛰기

030 XGBoost 분류 상세

키워드: XGBoost, xgboost

개요

XGBoost(eXtreme Gradient Boosting)는 Gradient Boosting의 발전된 형태로, 속도와 성능 모두 뛰어납니다. Kaggle 대회에서 가장 많이 사용되는 알고리즘 중 하나입니다.

실습 환경

  • Python 버전: 3.11 권장
  • 필요 패키지: pycaret[full]>=3.0

XGBoost 특징

  • 정규화: L1(Lasso), L2(Ridge) 정규화 내장
  • 병렬 처리: 트리 구축 시 병렬화로 속도 향상
  • 결측치 처리: 자동으로 최적 방향 학습
  • Early Stopping: 내장 지원
  • GPU 가속: CUDA 지원

PyCaret에서 XGBoost

from pycaret.classification import *
from pycaret.datasets import get_data

# 030 데이터 로드
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

# 030 XGBoost 모델 생성
xgb = create_model('xgboost')

주요 하이퍼파라미터

부스팅 파라미터

# 030 n_estimators: 부스팅 라운드 수
xgb = create_model('xgboost', n_estimators=100)

# 030 learning_rate (eta): 학습률
xgb = create_model('xgboost', learning_rate=0.1)

# 030 booster: 부스터 유형
xgb = create_model('xgboost', booster='gbtree') # 기본값
# 030 xgb = create_model('xgboost', booster='dart')

트리 파라미터

# 030 max_depth: 트리 최대 깊이
xgb = create_model('xgboost', max_depth=6)

# 030 min_child_weight: 자식 노드 최소 가중치
xgb = create_model('xgboost', min_child_weight=1)

# 030 gamma: 분할에 필요한 최소 손실 감소
xgb = create_model('xgboost', gamma=0)

# 030 subsample: 샘플 샘플링 비율
xgb = create_model('xgboost', subsample=0.8)

# 030 colsample_bytree: 특성 샘플링 비율
xgb = create_model('xgboost', colsample_bytree=0.8)

정규화 파라미터

# 030 reg_alpha (alpha): L1 정규화
xgb = create_model('xgboost', reg_alpha=0)

# 030 reg_lambda (lambda): L2 정규화
xgb = create_model('xgboost', reg_lambda=1)

파라미터 영향 분석

from pycaret.classification import *
from pycaret.datasets import get_data
import pandas as pd

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

# 030 max_depth 영향
results = []

for depth in [3, 4, 5, 6, 8, 10]:
xgb = create_model('xgboost', max_depth=depth, verbose=False)
metrics = pull()

results.append({
'max_depth': depth,
'accuracy': metrics['Accuracy'].mean(),
'auc': metrics['AUC'].mean()
})

df = pd.DataFrame(results)
print(df)

Early Stopping

from pycaret.classification import *
from pycaret.datasets import get_data
import xgboost as xgb
from sklearn.model_selection import train_test_split

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

X_train = get_config('X_train')
y_train = get_config('y_train')

X_tr, X_val, y_tr, y_val = train_test_split(
X_train, y_train, test_size=0.2, random_state=42
)

# 030 XGBoost 네이티브 API로 Early Stopping
dtrain = xgb.DMatrix(X_tr, label=y_tr)
dval = xgb.DMatrix(X_val, label=y_val)

params = {
'objective': 'binary:logistic',
'max_depth': 6,
'learning_rate': 0.1,
'eval_metric': 'auc'
}

# 030 Early stopping 적용
model = xgb.train(
params,
dtrain,
num_boost_round=1000,
evals=[(dtrain, 'train'), (dval, 'val')],
early_stopping_rounds=50,
verbose_eval=100
)

print(f"Best iteration: {model.best_iteration}")
print(f"Best score: {model.best_score:.4f}")

특성 중요도

from pycaret.classification import *
from pycaret.datasets import get_data
import pandas as pd

data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

xgb_model = create_model('xgboost', verbose=False)

# 030 PyCaret 시각화
plot_model(xgb_model, plot='feature')

# 030 상세 중요도
feature_names = get_config('X_train').columns
importances = xgb_model.feature_importances_

importance_df = pd.DataFrame({
'feature': feature_names,
'importance': importances
}).sort_values('importance', ascending=False)

print(importance_df)

튜닝

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

# 030 기본 모델
xgb = create_model('xgboost', verbose=False)

# 030 자동 튜닝
tuned_xgb = tune_model(xgb, optimize='AUC')

# 030 커스텀 그리드
custom_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [3, 4, 5, 6],
'learning_rate': [0.01, 0.05, 0.1],
'subsample': [0.7, 0.8, 0.9],
'colsample_bytree': [0.7, 0.8, 0.9],
'reg_alpha': [0, 0.1, 1],
'reg_lambda': [0, 0.1, 1]
}

tuned_xgb = tune_model(xgb, custom_grid=custom_grid, optimize='AUC')

GPU 가속

# 030 GPU 사용 (CUDA 필요)
xgb_gpu = create_model(
'xgboost',
tree_method='gpu_hist', # GPU 사용
gpu_id=0
)

불균형 데이터 처리

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

# 030 scale_pos_weight: 양성/음성 비율 역수
neg_count = (data['default'] == 0).sum()
pos_count = (data['default'] == 1).sum()
scale = neg_count / pos_count

xgb = create_model('xgboost', scale_pos_weight=scale, verbose=False)

SHAP 해석

from pycaret.classification import *
from pycaret.datasets import get_data
import shap

data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

xgb_model = create_model('xgboost', verbose=False)

# 030 SHAP 값 계산
X_test = get_config('X_test')
explainer = shap.TreeExplainer(xgb_model)
shap_values = explainer.shap_values(X_test)

# 030 Summary Plot
shap.summary_plot(shap_values, X_test)

장단점

장점:

  • 매우 높은 예측 성능
  • 빠른 학습 속도 (병렬화)
  • 정규화 내장
  • 결측치 자동 처리
  • Early Stopping 지원
  • GPU 가속 지원

단점:

  • 하이퍼파라미터가 많음
  • 메모리 사용량 높을 수 있음
  • 작은 데이터에서는 과적합 위험

XGBoost vs Gradient Boosting

항목XGBoostGradientBoosting
속도빠름느림
정규화L1, L2 내장없음
결측치자동 처리전처리 필요
병렬화지원미지원
Early Stopping내장수동 구현
GPU지원미지원

정리

  • XGBoost는 Gradient Boosting의 최적화 버전
  • 정규화, 병렬화, 결측치 처리 등 다양한 기능 내장
  • max_depth, learning_rate, subsample이 핵심 파라미터
  • Early Stopping으로 과적합 방지
  • SHAP으로 모델 해석 가능

다음 글 예고

다음 글에서는 LightGBM 분류 상세를 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #030