본문 바로가기
AI/Machine-Learning

XGBoost

by Wikinist 2023. 10. 2.

XGBoost는 Gradient Boosting 알고리즘을 기반으로 한 머신 러닝 라이브러리로, 특히 분류 및 회귀 문제에서 높은 예측 성능을 제공하는 인기 있는 알고리즘 중 하나입니다. "Extreme Gradient Boosting"의 약자로, 데이터 분석 및 예측 모델링 작업에 널리 사용됩니다. 아래는 XGBoost의 주요 특징과 장점에 대한 간략한 소개입니다:

XGBoost의 특장점

Gradient Boosting 기반

XGBoost는 Gradient Boosting 알고리즘을 사용하여 약한 예측 모델(일반적으로 의사 결정 트리)을 연속적으로 개선하며 강력한 앙상블 모델을 생성합니다.

Regularization

XGBoost는 모델의 복잡성을 제어하기 위한 L1(Lasso) 및 L2(Ridge) 정규화를 지원합니다. 이를 통해 과적합을 방지하고 모델의 일반화 성능을 향상시킬 수 있습니다.

Cross-Validation

내장된 교차 검증(Cross-Validation)을 지원하여 모델의 성능을 평가하고 튜닝할 때 유용합니다.

결측값 처리

XGBoost는 결측값 처리를 자동으로 다루는 기능을 제공합니다.

병렬 처리 및 고속성

XGBoost는 병렬 처리를 통해 대용량 데이터셋에서 빠른 속도로 학습하고 예측할 수 있습니다. 또한, 효율적인 분산 컴퓨팅 환경에서 사용하기에 적합합니다.

특성 중요도

모델의 각 특성의 상대적 중요도를 추정하는 기능을 제공하여 데이터의 인사이트를 얻는 데 도움을 줍니다.

대회에서의 우승 알고리즘

XGBoost는 여러 기계 학습 대회에서 우승한 모델로 널리 알려져 있으며, Kaggle과 같은 경연 대회에서 자주 사용됩니다.

유연성

XGBoost는 분류 및 회귀 문제 뿐만 아니라 순위 학습, 시계열 예측 등 다양한 유형의 기계 학습 작업에 적용될 수 있습니다.

XGBoost는 파이썬과 R을 비롯한 여러 프로그래밍 언어에서 사용할 수 있으며, scikit-learn과 같은 머신 러닝 라이브러리와 통합하여 사용할 수도 있습니다. XGBoost는 모델의 성능을 극적으로 향상시킬 수 있고, 데이터 과학 및 기계 학습 프로젝트에서 매우 유용한 도구 중 하나입니다.

생성자 시그니처

XGBoost의 Python 라이브러리에서 XGBoost 모델을 생성하는 생성자(constructor) 함수는 xgboost.XGBClassifier 또는 xgboost.XGBRegressor에 대해 약간 다르게 작동합니다. 이들 클래스는 각각 분류 및 회귀 작업에 사용됩니다.

XGBoost 분류 모델 생성자 시그니처

xgboost.XGBClassifier(
    max_depth=3,
    learning_rate=0.1,
    n_estimators=100,
    verbosity=1,
    objective='binary:logistic',
    booster='gbtree',
    n_jobs=1,
    gamma=0,
    min_child_weight=1,
    max_delta_step=0,
    subsample=1,
    colsample_bytree=1,
    colsample_bylevel=1,
    colsample_bynode=1,
    reg_alpha=0,
    reg_lambda=1,
    scale_pos_weight=1,
    base_score=0.5,
    random_state=0,
    missing=None,
    num_parallel_tree=1,
    importance_type='gain',
)


XGBoost 회귀 모델 생성자 시그니처

xgboost.XGBRegressor(
    max_depth=3,
    learning_rate=0.1,
    n_estimators=100,
    verbosity=1,
    objective='reg:squarederror',
    booster='gbtree',
    n_jobs=1,
    gamma=0,
    min_child_weight=1,
    max_delta_step=0,
    subsample=1,
    colsample_bytree=1,
    colsample_bylevel=1,
    colsample_bynode=1,
    reg_alpha=0,
    reg_lambda=1,
    scale_pos_weight=1,
    base_score=0.5,
    random_state=0,
    missing=None,
    num_parallel_tree=1,
    importance_type='gain',
)

매개변수 설명

XGBoost의 주요 하이퍼파라미터들에 대해 더 자세한 설명을 제공합니다:

max_depth

  • 트리의 깊이를 제어하며 과적합을 방지하기 위해 조절합니다.
  • 트리의 깊이가 깊어질수록 모델은 더 복잡한 패턴을 학습할 수 있지만, 과적합의 위험이 있으므로 적절한 값을 선택해야 합니다.
  • 일반적으로 3에서 10 사이의 정수 값을 사용하며, 데이터의 복잡성에 따라 조정합니다.

learning_rate

  • 학습률은 각 트리가 이전 트리의 오차를 얼마나 강하게 보정할지 결정합니다.
  • 작은 학습률은 안정적인 학습을 유지하고자 할 때 유용하며, 일반적으로 작은 값 (예: 0.01)에서 시작합니다.
  • 너무 큰 학습률은 수렴을 방해할 수 있으므로 조심해야 합니다.

n_estimators

  • 생성할 트리의 개수를 지정합니다.
  • 많은 트리를 사용하면 모델이 더 강력해지지만, 학습 시간이 길어지고 과적합의 위험이 있을 수 있습니다.

objective

  • 목적 함수는 XGBoost 모델이 최적화하려는 함수를 지정합니다.
  • 분류 작업의 경우 "binary:logistic" (이진 분류) 또는 "multi:softmax" (다중 클래스 분류) 등을 사용합니다.
  • 회귀 작업의 경우 "reg:squarederror"를 사용합니다.

eval_metric

  • eval_metric  파라미터는 모델 학습 중에 평가 지표(메트릭)를 지정하는데 사용됩니다. 이 평가 지표는 모델이 학습하는 동안 훈련 데이터에 대한 손실(Loss)을 계산하는 데 사용되며, 주로 검증 데이터나 테스트 데이터에 대한 성능을 모니터링하는 데 사용됩니다.
  • eval_metric 파라미터에는 다양한 평가 지표 문자열을 설정할 수 있으며, 선택한 평가 지표에 따라 모델의 학습과 검증을 모니터링할 수 있습니다. 일반적으로 분류와 회귀 작업에 다른 평가 지표가 사용됩니다.
  • 일반적으로 사용되는 eval_metric의 예시는 다음과 같습니다:
    • 분류 작업 (Classification):
      • 이진 분류 (Binary Classification):
        • 'error': 분류 오류율
        • 'logloss': 로그 손실(Log Loss)
        • 'auc': ROC AUC
      • 다중 클래스 분류 (Multi-Class Classification):
        • 'mlogloss': 다중 클래스 로그 손실
        • 'merror': 다중 클래스 분류 오류율
    • 회귀 작업 (Regression):
      • 'rmse': 평균 제곱근 오차 (Root Mean Squared Error)
      • 'mae': 평균 절대 오차 (Mean Absolute Error)
      • 'poisson-nloglik': Poisson 회귀의 음의 로그 우도 (Negative Log Likelihood)

n_jobs

  • 병렬 처리에 사용할 CPU 코어 수를 지정합니다.
  • 값이 -1이면 가능한 모든 CPU 코어를 사용하며, 1이면 병렬 처리를 비활성화합니다.

gamma (트리 분할을 위한 최소 손실 감소)

  • 노드를 분할할 때 최소한의 손실 감소를 필요로 하는 정수 값입니다.
  • 0 이상의 값을 설정하고, 값이 클수록 보수적인 모델이 생성됩니다.

min_child_weight (말단 노드의 최소 가중치 합)

  • 분할되는 노드의 가중치 합의 최소 값을 지정합니다.
  • 과적합을 줄이기 위해 높은 값을 설정할 수 있으며, 값이 너무 높으면 언더피팅(과소적합)의 위험이 있습니다.

max_delta_step

  • 트리의 형태와 노드 분할을 제어합니다.
  • 과적합을 방지하거나 모델의 안정성을 높이기 위해 조정할 수 있습니다.

subsample (데이터 샘플링 비율)

  • 각 트리 학습에 사용할 데이터의 일부를 무작위로 샘플링하는 비율을 설정합니다.
  • 0.5에서 1.0 사이의 값을 사용하여 다양성을 높이는 데 도움을 줍니다.

colsample_bytree, colsample_bylevel, colsample_bynode

  • 각각 트리, 레벨, 노드에서 사용할 특성의 비율을 설정합니다.
  • 0.5에서 1.0 사이의 값을 사용하여 특성 샘플링을 조절합니다.
  • 이를 통해 모델의 다양성을 증가시키고 과적합을 방지할 수 있습니다.

reg_alpha, reg_lambda

  • 정규화 관련 매개변수로, 과적합을 줄이기 위해 사용됩니다.
  • reg_alpha는 L1 정규화 (Lasso), reg_lambda는 L2 정규화 (Ridge)를 나타냅니다.
  • 정규화 항의 강도를 조절합니다.
  • 0에서 무한대 사이의 값을 사용하며, 높은 값을 설정하여 과적합을 방지합니다.

scale_pos_weight (양성 클래스 가중치)

  • 이진 분류에서 사용되며, 양성 클래스의 가중치를 조절합니다.
  • 불균형한 클래스 분포를 조정하기 위해 사용합니다.

random_state

  • 랜덤 시드를 설정하여 모델의 학습과 예측을 재현 가능하게 만듭니다.
    동일한 시드를 사용하면 결과가 일정하게 유지됩니다.

missing (결측값 처리)

  • 결측값을 처리하기 위한 값을 설정합니다.

num_parallel_tree (병렬 트리의 개수)

  • 부스트된 트리의 개수를 조정합니다. 일반적으로 1로 설정하고 필요한 경우 높인 후 튜닝합니다.

importance_type (특성 중요도 계산 방법)

  • 특성 중요도를 계산하는 방법을 설정합니다. "gain", "cover", "frequency" 등이 있습니다.

이러한 하이퍼파라미터들을 조정하면 XGBoost 모델을 튜닝하고 원하는 성능을 얻을 수 있습니다. 일반적으로는 그리드 서치(Gird Search)나 랜덤 서치(Random Search)와 같은 하이퍼파라미터 최적화 기법을 사용하여 최적의 매개변수 조합을 찾습니다.

최적화

Optuna

Optuna를 사용하여 XGBoost 모델의 하이퍼파라미터를 베이지안 최적화하는 예제를 제공하겠습니다. 이 예제에서는 Optuna를 활용하여 XGBoost 분류 모델의 max_depth, learning_rate, n_estimators, gamma, min_child_weight, subsample, colsample_bytree, 그리고 reg_alpha 하이퍼파라미터를 튜닝하는 방법을 설명합니다.

먼저, Optuna를 설치하고 필요한 라이브러리를 임포트합니다

pip install optuna

다음은 Optuna를 사용한 XGBoost 모델의 하이퍼파라미터 튜닝 예제 코드입니다.

import optuna
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 예제 데이터셋을 로드하거나 실제 데이터를 사용합니다.
# X와 y는 특성과 레이블에 해당합니다.
# 예를 들어, 다음과 같이 데이터를 로드할 수 있습니다:
# X, y = load_data()

# 목적 함수: XGBoost 모델을 학습하고 교차 검증 정확도를 반환합니다.
def objective(trial):
    # 하이퍼파라미터 탐색 범위 설정
    params = {
        'max_depth': trial.suggest_int('max_depth', 3, 10),
        'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),
        'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
        'gamma': trial.suggest_float('gamma', 0, 1),
        'min_child_weight': trial.suggest_float('min_child_weight', 1, 10),
        'subsample': trial.suggest_float('subsample', 0.5, 1),
        'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5, 1),
        'reg_alpha': trial.suggest_float('reg_alpha', 0, 10),
    }

    # XGBoost 모델 생성
    model = xgb.XGBClassifier(**params)

    # 교차 검증을 위한 데이터 분할
    X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)

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

    # 검증 데이터로 정확도 계산
    predictions = model.predict(X_valid)
    accuracy = accuracy_score(y_valid, predictions)

    return 1 - accuracy  # 목적 함수는 최소화하므로 1에서 정확도를 빼줍니다.

# Optuna 최적화 수행
study = optuna.create_study(direction='minimize')  # 목적 함수를 최소화합니다.
study.optimize(objective, n_trials=100)  # 시도 횟수를 조절하여 탐색 범위를 설정합니다.

# 최적 하이퍼파라미터 출력
best_params = study.best_params
print("Best Hyperparameters:", best_params)

# 최적 모델 재학습 및 평가
best_model = xgb.XGBClassifier(**best_params)
best_model.fit(X_train, y_train)
predictions = best_model.predict(X_valid)
accuracy = accuracy_score(y_valid, predictions)
print("Validation Accuracy with Best Hyperparameters:", accuracy)

위 코드에서는 objective 함수를 정의하여 XGBoost 모델을 학습하고 교차 검증 정확도를 최소화하는 방향으로 하이퍼파라미터를 조정합니다. Optuna는 이 목적 함수를 여러 번 호출하여 최적의 하이퍼파라미터 조합을 찾습니다.

또한, study.best_params를 사용하여 최적의 하이퍼파라미터 조합을 확인하고, 해당 조합으로 최적 모델을 재학습하고 검증 데이터에서 정확도를 평가합니다.

이를 통해 Optuna를 사용하여 XGBoost 모델의 하이퍼파라미터를 효율적으로 튜닝할 수 있습니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.