[머신러닝 완벽 가이드] 4장_분류 - XGBoost

이경민·2023년 1월 8일
0

📌 XGBoost (eXtra Gradient Boost)

✅ 개요

  • 트리 기반의 앙상블 학습에서 가장 각광받고 있는 알고리즘 중 하나

    • 뛰어난 예측 성능

    • GBM 대비 빠른 수행 시간: 병렬 학습 가능

    • 과적합 규제 (Regularization): 과적합 규제 기능 제공

    • 나무 가지치기 (Tree pruning): 더 이상 긍정 이득이 없는 분할 가지치기

    • 자체 내장된 교차 검증: 조기 중단 가능

    • 결측값 자체 처리

✅ 파이썬 래퍼

(1) 일반 파라미터

  • booster: gbtree 또는 gblinear 선택

  • silent: 출력 메시지 표시 (default=0)

  • nthread: CPU의 실행 스레드 개수

(2) 부스터 파라미터

  • eta: 0~1 사이의 값을 지정하며 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값으로 보통 0.01~0.2 사이의 값을 선호 (default=0.3)

  • num_boost_round: GBM의 n_estimators와 같은 파라미터

  • min_child_weight: 트리에서 추가적으로 가지를 나눌지를 결정하기 위해 필요한 데이터들의 weight 총합으로, 값이 클수록 분할을 자제한다.

  • gamma: 트리의 리프 노드를 추가적으로 나눌지를 결정할 최소 손실 감소 값으로, 해당 값보다 큰 손실(loss)이 감소된 경우에 리프 노드를 분리한다. 값이 클수록 과적합 감소 효과가 있다.

  • max_depth: 트리 기반 알고리즘의 max_depth와 같다. 0을 지정하면 깊이에 제한이 없으며, 보통은 3~10 사이의 값을 적용한다.

  • sub_sample: GBM의 subsample과 동일하며 데이터를 샘플링하는 비율을 지정한다. 일반적으로 0.5 ~ 1 사이의 값을 사용한다.

  • colsample_bytree: GBM의 max_features와 유사하며 트리 생성에 필요한 피처를 임의로 샘플링하는 데 사용된다.

  • lambda: L2 Regularization 적용 값으로, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다.

  • alpha: L1 Regularization 적용 값으로, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다.

  • scale_pos_weight: 특정 값으로 치우친 비대칭한 클래스로 구성된 데이터 세트의 균형을 유지하기 위한 파라미터

(3) 학습 태스크 파라미터

  • objective: 최솟값을 가져야할 손실 함수 정의

    • binary:logistic: 이진 분류

    • multi:softmax: 다중 분류, 레이블 클래스의 개수인 num_class 파라미터 지정 필요

    • multi:softprob: 다중 분류, 개별 label 클래스에 해당되는 예측 확률 반환

  • eval_metric: 검증에 사용되는 함수 정의

    • rmse: Root Mean Square Error

    • mae: Mean Absolute Error

    • logloss: Negative log-likelihood

    • error: Binary classification error rate (0.5 threshold)

    • merror: Multiclass classification error rate

    • mloglose: Multiclass logloss

    • auc: Area under the curve

(4) 과적합 제어

  • eta 값을 낮춘다 (0.01 ~ 0.1)
    (단, eta 값을 낮출 경우 num_round(또는 n_estimator)는 반대로 높여준다.)

  • max_depth 값을 낮춘다.

  • min_child_weight 값을 높인다.

  • gamma 값을 높인다.

  • subsamplecolsample_bytree를 조정하는 것도 트리가 너무 복잡하게 생성되는 것을 막아 과적합 문제에 도움이 될 수 있다.

(5) 실습

import xgboost as xgb
from xgboost import plot_importance
import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

# 위스콘신 유방암 데이터 세트: 악성/양성 종양 분류
dataset = load_breast_cancer()
X_features= dataset.data
y_label = dataset.target

cancer_df = pd.DataFrame(data=X_features, columns=dataset.feature_names)
cancer_df['target'] = y_label

# 전체 데이터 중 80%는 학습용 데이터, 20%는 테스트용 데이터로 추출
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size=0.2, random_state=156 )

# 학습용과 테스트용 데이터 세트를 위해 별도의 객체인 DMatrix 생성 필요
# DMatrix: 주로 넘파이 입력 파라미터를 받아서 만들어지는 XGBoost만의 전용 데이터 세트 
dtrain = xgb.DMatrix(data=X_train, label=y_train)
dtest = xgb.DMatrix(data=X_test, label=y_test)

# 하이퍼 파라미터 설정
params = {'max_depth':3,
          'eta': 0.1,
          'objective':'binary:logistic',
          'eval_metric':'logloss'}
num_rounds = 400

# 학습용 데이터 세트: ‘train’, 테스트용 데이터 세트: ‘eval’
wlist = [(dtrain, 'train'),(dtest,' eval')]

# 하이퍼 파라미터와 early stopping 파라미터를 train() 함수의 파라미터로 전달
xgb_model = xgb.train(params=params, dtrain=dtrain, num_boost_round=num_rounds, 
					  early_stopping_rounds=100, evals=wlist)

# predict(): 예측 결과를 추정할 수 있는 확률 값을 반환
pred_probs = xgb_model.predict(dtest)

# 예측 확률이 0.5보다 크면 1, 그렇지 않으면 0으로 결정
preds = [1 if x > 0.5 else 0 for x in pred_probs]

# 평가 함수
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.metrics import precision_score, recall_score
from sklearn.metrics import f1_score, roc_auc_score

def get_clf_eval(y_test, pred=None, pred_proba=None):
    confusion = confusion_matrix(y_test, pred)
    accuracy = accuracy_score(y_test , pred)
    precision = precision_score(y_test , pred)
    recall = recall_score(y_test , pred)
    f1 = f1_score(y_test, pred)
    # ROC-AUC 추가 
    roc_auc = roc_auc_score(y_test, pred_proba)
    print('오차 행렬')
    print(confusion)
    print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f}, F1: {3:.4f}, AUC: {4:.4f}'.format(accuracy, precision, recall, f1, roc_auc))

get_clf_eval(y_test, preds, pred_probs)

# 시각화 기능 내장
import matplotlib.pyplot as plt
%matplotlib inline

fig, ax = plt.subplots(figsize=(10, 12))
plot_importance(xgb_model, ax=ax) # 피처 순서별로 f0, f1 ···

  • 조기 중단 기능 내장
    early_stopping_rounds: 수행 성능을 개선하기 위해서 더 이상 지표 개선이 없을 경우에 num_boost_round 횟수를 모두 채우지 않고 중간에 반복을 빠져 나올 수 있도록 한다.
    단, 조기 중단을 수행하기 위해서는 반드시 eval_set(평가용 데이터 세트, evals에서 설정), eval_metric(성능 평가 방법)이 함께 설정되어야 한다.
  • 시각화 기능 내장
    plot_importance(): 기본 평가 지표로 f1 스코어를 기반으로 해 각 피터의 중요도를 시각화

(6) cv()

  • xgboost.cv(): 데이터 세트에 대한 교차 검증 수행 후 최적 파라미터를 구할 수 있는 방법 제공 (GridSearchCV와 유사)

    • params: 부스터 파라미터 (dict)

    • dtrain: 학습 데이터 (DMatrix)

    • num_boost_round: 부스팅 반복 횟수

    • nfold: CV 폴드 갯수

    • stratified: CV 수행 시 층화 표본 추출 수행 여부

    • metrics: CV 수행 시 모니터링할 성능 평가 지표

    • early_stopping_rounds: 조기 중단 활성화, 반복 횟수 지정

✅ 사이킷런 래퍼

(1) 하이퍼 파라미터

  • n_estimators: GBM의 n_estimators와 같은 파라미터 (=num_boost_round)

  • learning_rate: 0~1 사이의 값을 지정하며 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값으로 보통 0.01~0.2 사이의 값을 선호 (=eta)

  • subsample: GBM의 subsample과 동일하며 데이터를 샘플링하는 비율을 지정한다. 일반적으로 0.5 ~ 1 사이의 값을 사용한다. (=sub_sample)

  • reg_lambda: L2 Regularization 적용 값으로, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다. (=lambda)

  • reg_alpha: L1 Regularization 적용 값으로, 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있다. (=alpha)

(2) 실습

from xgboost import XGBClassifier

xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
# 평가에 테스트 데이터를 사용하면 학습 시에 미리 참고가 되어 과적합이 발생 가능
# 예제 코드에서는 데이터 세트의 크기가 작아 평가용으로도 사용할 것일 뿐 주의
evals = [(X_test, y_test)]
xgb_wrapper.fit(X_train, y_train, early_stopping_rounds=100, eval_metric="logloss", eval_set=evals, verbose=True)

ws100_preds = xgb_wrapper.predict(X_test)
ws100_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1]
  • 조기 중단 관련 파라미터는 fit()에 입력하여 사용한다.

    • early_stopping_rounds: 평가 지표가 향상될 수 있는 반복 횟수 정의

    • eval_metric: 조기 중단을 위한 평가 지표

    • eval_set: 성능 평가를 수행할 데이터 세트

  • 성능 평가를 수행할 데이터 세트는 학습 데이터가 아니라 별도의 데이터 세트를 사용해야 한다.
from xgboost import plot_importance
import matplotlib.pyplot as plt
%matplotlib inline

fig, ax = plt.subplots(figsize=(10, 12))
# 사이킷런 래퍼 클래스를 입력해도 무방 
plot_importance(xgb_wrapper, ax=ax)
  • 피처의 중요도를 시각화하는 모듈인 plot_importance()에 사이킷런 래퍼 클래스를 입력해도 동일한 시각화 결과를 제공한다.
profile
열정 가득한 공간

0개의 댓글