본문으로 건너뛰기

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