[파머완] ch4.6 XGBoost

­반소희·2022년 7월 1일
1

ch4.6 XGBoost

XGBoostGBM을 기반하고 있지만, GBM느린 수행 시간과적합 규제 부재 등의 문제를 보완한 알고리즘이다. 트리 기반의 앙상블 학습에서 많이 사용되고 있다.

ch4.6 XGBoost 주요 장점

  • 분류와 회귀에서의 뛰어난 예측 성능

  • GBM 대비 빠른 수행 시간

  • 과적합 규제

  • Tree pruning

    • XGBoost도 GBM과 같이 max_depth를 조절하여 과적합 방지가 가능하다. 하지만 XGBoost는 tree pruning으로 더 이상 긍정 이득이 없는 분할을 가지치기 해서 분할 수를 더 줄이는 추가적인 장점이 있다.
  • 자체 내장된 교차 검증

    • 교차 검증을 통해 평가 데이터셋의 평가 값이 최적화 되면 반복을 중간에 엄출 수 있는 early stopping 기능 존재
  • 결손값 자체 처리

ch4.6 사이킷런 래퍼 XGBoost 하이퍼 파라미터

GBM과 유사한 하이퍼 파라미터를 가지고 있으며, 추가적으로 early stopping과 과적합 규제를 위한 하이퍼 파라미터가 존재한다.

  1. 주요 일반 파라미터
  • booster

    • gbtree (tree based model) 또는 gblinear (linear model)
  • 그 외에도 silent, nthread가 있음

  1. 주요 부스터 파라미터

트리 최적화, 부스팅, 규제 등과 관련된 파라미터를 지칭한다.

  • learning_rate

    • 학습률을 지정하는 파라미터
    • 기본값은 0.1
    • 0.01 ~ 0.2 값을 선호함
  • n_estimators

    • 약한 학습기의 개수
  • subsample

    • GBM의 subsample과 동일함
    • 트리가 커져서 과적합되는 것을 방지하기 위해 데이터를 샘플링하는 비율을 지정하기 위한 파라미터
    • 0.5 ~ 1 값을 선호함
  • reg_lambda

    • L2 Regularization 적용 값
    • 피처 개수가 많을 경우 적용을 검토하며, 값이 클수록 과적합 감소 효과 있음
  • reg_alpha

    • L1 Regularization 적용 값
    • 피처 개수가 많을 경우 적용을 검토하며, 값이 클수록 과적합 감소 효과 있음
  • scale_pos_weight

    • 특정 값으로 치우친 비대칭한 클래스로 구성된 데이터셋의 균형을 유지하기 위한 파라미터
  • 그 외에도 min_split_loss, max_depth 등의 하이퍼 파라미터가 존재함

  1. 학습 태스크 파라미터

학습 수행 시 객체 함수, 평가를 위한 지표 등을 설정하는 파라미터를 지칭한다.

  • objective

    • 손실 함수 정의 파라미터
    • 주로 이진 분류인지 다중 분류인지에 따라 달라짐
      • binary:logistic 은 이중 분류일 때 적용하는 손실 함수
      • multi:softmax 은 다중 분류일 때 적용하는 손실 함수
      • multi:softprobmulti:softmax와 유사하나 개별 클래스의 예측 확률을 반환함
  • eval_metric

    • 검증에 사용되는 함수를 정의하는 파라미터
    • 기본값은 회귀인 경우 rmse, 분류일 경우 error
      • rmse
      • mae
      • logloss
      • error
      • merror
      • mlogloss
      • auc

ch4.6 XGBoost 과적합 감소 방법

  1. learning_rate 값을 낮춘다. lr을 낮출 경우, n_estimators 값은 높여주어야 한다.
  2. max_depth을 낮춘다.
  3. min_child_weight 값을 높인다.
  4. min_split_loss를 높인다.
  5. subsample 또는 colsample_bytree 값을 조정한다.

ch4.6 XGBoost 실습

위스콘신 유방암 데이터셋을 이용하여 악성 종양인지 양성 종양인지 분류하는 문제. 종양의 크기, 모양 등의 다양한 feature 존재. 이진 분류 문제임.

  • 데이터 로드
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

import pandas as pd
import numpy as np
## 유방암 데이터셋 로드
dataset = load_breast_cancer()
features = dataset.data
labels = dataset.target
## 데이터를 Pandas DataFrame으로 로드
cancer_df = pd.DataFrame(data=features, columns=dataset.feature_names)
cancer_df['target'] = labels
cancer_df
## 클래스 별 데이터 수 확인
print(dataset.target_names)
print(cancer_df['target'].value_counts())
  • 데이터 분리 (학습 / 검증 - early stopping / 테스트)
## 학습 및 검증 데이터셋으로 데이터 분리
X_features = cancer_df.iloc[:, :-1]
y_label = cancer_df.iloc[:, -1]
## 학습, 검증용 데이터셋 비율 8 : 2
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size=0.2, random_state=156)

## X_train, y_train을 다시 9 : 1 비율로 분리
## => XGBoost가 제공하는 교차 검증 성능 평가 및 조기 중단을 수행하기 위함
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.1, random_state=156)
  • 모델 성능 평가 함수 (get_clf_eval) 선언
## 모델 성능 평가 함수 선언
from sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_score, 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_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))
  • 모델 XGBClassifier 선언
from xgboost import XGBClassifier

## 모델 선언
xgb_clf = XGBClassifier(n_estimators=1000, learning_rate=0.05, max_depth=3, eval_metric='logloss')

## 학습용 데이터, 검증용 데이터
evals = [(X_tr, y_tr), (X_val, y_val)]

## early stopping 적용
xgb_clf.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric='logloss', eval_set=evals, verbose=True)

w_preds = xgb_clf.predict(X_test)
w_preds_proba = xgb_clf.predict_proba(X_test)[:, 1]
  • 모델 성능 확인
get_clf_eval(y_test, w_preds, w_preds_proba)
  • feature 중요도 확인 및 시각화
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

ftr_importances_values = xgb_clf.feature_importances_
ftr_importances = pd.Series(ftr_importances_values, index=X_train.columns)
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20]

plt.figure(figsize=(8, 6))
plt.title('Feature importances Top 20')
sns.barplot(x=ftr_top20, y=ftr_top20.index)
plt.show()

요약

XGBoost는 GBM을 기반으로 하는 부스팅 알고리즘으로, GBM에 비해 상대적으로 속도가 빠르고 성능이 좋아 많이 쓰이는 알고리즘이다. train / test 데이터셋 분리 후, train 을 train / val 로 다시 분리하여 early stopping 적용이 가능하다.

profile
행복한 소히의 이것저것

2개의 댓글

comment-user-thumbnail
2022년 11월 16일

전부 파이썬 머신러닝 완벽 가이드 책에 나와있는 내용인가요?

1개의 답글

관련 채용 정보