본문 바로가기
AI

XGBoost 알고리즘: 상세 설명 및 Python 구현

by markbyun 2025. 5. 13.

XGBoost 알고리즘: 상세 설명 및 Python 구현

XGBoost는 "Extreme Gradient Boosting"의 약자로, 기계 학습 분야에서 널리 사용되는 강력한 알고리즘입니다. 특히 회귀 및 분류 문제에서 높은 성능을 자랑하며, 데이터 과학 대회에서 자주 사용됩니다. 이 글에서는 XGBoost의 주요 특징과 Python을 사용한 기본 구현 방법, 그리고 Scikit-learn 라이브러리를 활용한 학습 예제를 소개합니다.

XGBoost의 주요 특징

  • Gradient Boosting: 여러 약한 학습기를 순차적으로 학습시키고, 각 단계에서 이전 모델의 오차를 줄이는 방식으로 모델을 개선합니다.
  • Regularization: L1 및 L2 정규화를 통해 모델의 복잡성을 제어하고 과적합을 방지합니다.
  • Tree Pruning: 최대 심도 기반의 트리 가지치기를 통해 불필요한 복잡성을 줄입니다.
  • Handling Missing Values: 결측치를 자동으로 처리하는 기능을 내장하고 있습니다.
  • Parallel Processing: 병렬 처리를 지원하여 학습 속도를 크게 향상시킵니다.
  • Scalability: 대규모 데이터셋에서도 효율적으로 작동하도록 설계되었습니다.

XGBoost 하이퍼파라미터 설정

XGBoost는 다양한 하이퍼파라미터를 제공하여 모델의 성능을 최적화할 수 있습니다. 주요 하이퍼파라미터는 다음과 같습니다:

  • n_estimators: 학습할 약한 학습기의 수를 지정합니다. 일반적으로 더 많은 학습기가 더 복잡한 모델을 생성하지만, 과적합의 위험도 증가합니다.
  • learning_rate: 각 약한 학습기의 기여도를 조절하는 학습률입니다. 낮은 학습률은 더 많은 학습기가 필요하지만, 더 안정적인 학습을 제공합니다.
  • max_depth: 각 결정 트리의 최대 깊이를 설정합니다. 더 깊은 트리는 더 복잡한 관계를 모델링할 수 있지만, 과적합의 위험이 있습니다.
  • subsample: 각 학습 단계에서 사용할 데이터 샘플의 비율입니다. 1보다 작은 값을 설정하면 모델의 분산을 줄이고 과적합을 방지할 수 있습니다.
  • colsample_bytree: 각 트리를 학습할 때 사용할 특징의 비율입니다. 이는 모델의 다양성을 증가시켜 과적합을 방지하는 데 도움이 됩니다.
  • gamma: 트리의 추가 분할에 필요한 최소 손실 감소를 설정합니다. 이는 모델의 복잡성을 줄이는 데 도움이 됩니다.

Python으로 XGBoost 알고리즘 구현하기

XGBoost를 처음부터 구현하는 것은 복잡하지만, 간단한 Gradient Boosting 알고리즘을 통해 기본 원리를 이해할 수 있습니다. 아래는 Python을 사용하여 간단한 형태의 Gradient Boosting을 구현한 예제입니다.


import numpy as np

class SimpleGBM:
    def __init__(self, n_estimators=100, learning_rate=0.1):
        self.n_estimators = n_estimators
        self.learning_rate = learning_rate
        self.models = []

    def fit(self, X, y):
        y_pred = np.full(y.shape, np.mean(y))
        for _ in range(self.n_estimators):
            residuals = y - y_pred
            model = DecisionStump()
            model.fit(X, residuals)
            self.models.append(model)
            y_pred += self.learning_rate * model.predict(X)

    def predict(self, X):
        y_pred = np.zeros(X.shape[0])
        for model in self.models:
            y_pred += self.learning_rate * model.predict(X)
        return y_pred

class DecisionStump:
    def __init__(self):
        self.feature_index = None
        self.threshold = None
        self.left_value = None
        self.right_value = None

    def fit(self, X, y):
        m, n = X.shape
        best_loss = float('inf')
        for feature_index in range(n):
            thresholds = np.unique(X[:, feature_index])
            for threshold in thresholds:
                left_mask = X[:, feature_index] <= threshold
                right_mask = X[:, feature_index] > threshold
                left_value = np.mean(y[left_mask])
                right_value = np.mean(y[right_mask])
                loss = np.sum((y[left_mask] - left_value) ** 2) + np.sum((y[right_mask] - right_value) ** 2)
                if loss < best_loss:
                    best_loss = loss
                    self.feature_index = feature_index
                    self.threshold = threshold
                    self.left_value = left_value
                    self.right_value = right_value

    def predict(self, X):
        y_pred = np.where(X[:, self.feature_index] <= self.threshold, self.left_value, self.right_value)
        return y_pred

위 코드는 매우 간단한 형태의 Gradient Boosting을 구현한 것입니다. 이 코드는 XGBoost의 모든 기능을 포함하지 않지만, 기본적인 작동 원리를 이해하는 데 도움이 됩니다.

Scikit-learn을 이용한 XGBoost 학습 예제

Scikit-learn 라이브러리를 사용하면 XGBoost를 쉽게 학습시킬 수 있습니다. 아래는 Scikit-learn을 사용하여 XGBoost 모델을 학습시키고 평가하는 예제입니다.


from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from xgboost import XGBRegressor

# 데이터 로드 및 분할
boston = load_boston()
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=42)

# XGBoost 모델 생성 및 하이퍼파라미터 설정
model = XGBRegressor(
    n_estimators=100,       # 학습기 수
    learning_rate=0.1,      # 학습률
    max_depth=3,            # 트리의 최대 깊이
    subsample=0.8,          # 데이터 샘플링 비율
    colsample_bytree=0.8,   # 특징 샘플링 비율
    gamma=0,                # 분할 최소 손실 감소
    random_state=42
)

# 모델 학습
model.fit(X_train, y_train)

# 예측 및 평가
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")

위 예제에서는 Boston 주택 가격 데이터셋을 사용하여 XGBoost 회귀 모델을 학습시켰습니다. 모델의 성능은 평균 제곱 오차(Mean Squared Error)로 평가되었습니다. 각 하이퍼파라미터는 모델의 성능과 복잡성을 조절하는 데 중요한 역할을 합니다.

참고 자료

이 글을 통해 XGBoost 알고리즘의 기본 개념과 Python을 사용한 구현 방법, 그리고 Scikit-learn을 활용한 학습 방법에 대해 이해할 수 있기를 바랍니다. XGBoost는 그 강력한 성능 덕분에 머신러닝 엔지니어와 데이터 과학자들 사이에서 매우 인기 있는 도구입니다.