050 XGBoost 회귀 상세
키워드: XGBoost, 회귀
개요
XGBoost(eXtreme Gradient Boosting)는 회귀에서도 뛰어난 성능을 보이는 알고리즘입니다. Kaggle 대회에서 가장 많이 사용되는 회귀 알고리즘 중 하나입니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
pycaret[full]>=3.0
PyCaret에서 XGBoost 회귀
from pycaret.regression import *
from pycaret.datasets import get_data
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
# 050 XGBoost 회귀
xgb = create_model('xgboost')
주요 하이퍼파라미터
# 050 n_estimators: 부스팅 라운드 수
xgb = create_model('xgboost', n_estimators=100)
# 050 learning_rate (eta): 학습률
xgb = create_model('xgboost', learning_rate=0.1)
# 050 max_depth: 트리 최대 깊이
xgb = create_model('xgboost', max_depth=6)
# 050 min_child_weight: 자식 노드 최소 가중치
xgb = create_model('xgboost', min_child_weight=1)
# 050 subsample: 샘플 비율
xgb = create_model('xgboost', subsample=0.8)
# 050 colsample_bytree: 특성 비율
xgb = create_model('xgboost', colsample_bytree=0.8)
# 050 gamma: 분할 최소 손실 감소
xgb = create_model('xgboost', gamma=0)
# 050 reg_alpha (L1), reg_lambda (L2): 정규화
xgb = create_model('xgboost', reg_alpha=0, reg_lambda=1)
목적 함수
# 050 objective: 회귀용 목적 함수
xgb_mse = create_model('xgboost', objective='reg:squarederror') # 기본값
xgb_mae = create_model('xgboost', objective='reg:absoluteerror') # MAE
xgb_log = create_model('xgboost', objective='reg:squaredlogerror') # 양수 타겟용
Early Stopping
import xgboost as xgb
from sklearn.model_selection import train_test_split
from pycaret.regression import *
from pycaret.datasets import get_data
data = get_data('boston')
reg = setup(data, target='medv', 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
)
# 050 XGBoost 네이티브 API
dtrain = xgb.DMatrix(X_tr, label=y_tr)
dval = xgb.DMatrix(X_val, label=y_val)
params = {
'objective': 'reg:squarederror',
'max_depth': 6,
'learning_rate': 0.1,
'eval_metric': 'rmse'
}
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 RMSE: {model.best_score:.4f}")
튜닝
from pycaret.regression import *
from pycaret.datasets import get_data
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
xgb = create_model('xgboost', verbose=False)
# 050 자동 튜닝
tuned_xgb = tune_model(xgb, optimize='RMSE')
# 050 커스텀 그리드
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='RMSE')
특성 중요도
from pycaret.regression import *
from pycaret.datasets import get_data
import pandas as pd
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
xgb_model = create_model('xgboost', verbose=False)
# 050 특성 중요도
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)
# 050 시각화
plot_model(xgb_model, plot='feature')
SHAP 해석
import shap
from pycaret.regression import *
from pycaret.datasets import get_data
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
xgb_model = create_model('xgboost', verbose=False)
# 050 SHAP 값 계산
X_test = get_config('X_test')
explainer = shap.TreeExplainer(xgb_model)
shap_values = explainer.shap_values(X_test)
# 050 Summary Plot
shap.summary_plot(shap_values, X_test)
GPU 가속
# 050 GPU 사용 (CUDA 필요)
xgb_gpu = create_model(
'xgboost',
tree_method='gpu_hist',
gpu_id=0
)
단조 제약 (Monotonic Constraints)
비즈니스 로직에 따른 제약 추가:
import xgboost as xgb
from pycaret.regression import *
from pycaret.datasets import get_data
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
# 050 예: rm (방 개수)이 증가하면 가격도 증가해야 함
# 050 feature 순서: 0=crim, 1=zn, ..., 5=rm, ...
# 1: 증가 관계, -1: 감소 관계, 0: 제약 없음
X_train = get_config('X_train')
y_train = get_config('y_train')
feature_names = list(X_train.columns)
# 050 rm은 6번째 (인덱스 5)
monotone = [0] * len(feature_names)
rm_idx = feature_names.index('rm')
monotone[rm_idx] = 1 # rm 증가 → 가격 증가
dtrain = xgb.DMatrix(X_train, label=y_train)
params = {
'objective': 'reg:squarederror',
'max_depth': 6,
'monotone_constraints': tuple(monotone)
}
model = xgb.train(params, dtrain, num_boost_round=100)
시각화
from pycaret.regression import *
from pycaret.datasets import get_data
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
xgb = create_model('xgboost', verbose=False)
# 050 잔차 분석
plot_model(xgb, plot='residuals')
# 050 예측 오차
plot_model(xgb, plot='error')
# 050 특성 중요도
plot_model(xgb, plot='feature')
# 050 학습 곡선
plot_model(xgb, plot='learning')
장단점
장점:
- 매우 높은 예측 성능
- 빠른 학습 (병렬화)
- 결측치 자동 처리
- 정규화 내장
- Early Stopping 지원
- 단조 제약 가능
단점:
- 하이퍼파라미터 많음
- 메모리 사용량 높을 수 있음
- 외삽 불가
정리
- XGBoost는 회귀에서도 최고 수준 성능
- learning_rate, max_depth, subsample이 핵심
- Early Stopping으로 과적합 방지
- SHAP으로 모델 해석
- 단조 제약으로 비즈니스 로직 반영 가능
다음 글 예고
다음 글에서는 LightGBM 회귀 상세를 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #050