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
| 항목 | XGBoost | GradientBoosting |
|---|---|---|
| 속도 | 빠름 | 느림 |
| 정규화 | L1, L2 내장 | 없음 |
| 결측치 | 자동 처리 | 전처리 필요 |
| 병렬화 | 지원 | 미지원 |
| Early Stopping | 내장 | 수동 구현 |
| GPU | 지원 | 미지원 |
정리
- XGBoost는 Gradient Boosting의 최적화 버전
- 정규화, 병렬화, 결측치 처리 등 다양한 기능 내장
- max_depth, learning_rate, subsample이 핵심 파라미터
- Early Stopping으로 과적합 방지
- SHAP으로 모델 해석 가능
다음 글 예고
다음 글에서는 LightGBM 분류 상세를 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #030