본문 바로가기
Machine Learning/scikit-learn

[앙상블] 파이썬 래퍼 XGBoost 개념과 예제

by ISLA! 2023. 8. 22.

 

XGBoost의 하이퍼 파라미터

import xgboost

model = xgboost.XGBRegressor(objective='reg:squarederror', n_estimators = 3000, eval_metric = 'rmse', early_stopping_rounds=10, random_state=42)

 

  • objective : 목적함수
    • reg:squarederror : 회귀문제에 사용. 오차 제곱합을 의미(오차 제곱합을 최소화하는 방향으로 학습 수행)
    • binary:logistic : 이진분류에 사용
    • multi:softmax : 소프트맥스 함수를 사용하는 다중분류
    • mulfi:softprob : 확률값을 구하는 다중분류
  • n_estimators : 트리 수
  • eval_metric : 조기 종료를 위한 평가 지표
    • rmse, mae, mape 등 다양한 값 설정 가능
  • early_stopping_rounds : 조기 종료 조건, 평가 지표가 향상될 수 있는 반복 횟수
    • 예를 들어 10이라면, 10회 반복될 동안 성능이 향상되지 않을 경우 조기 종료 됨
* GBM은 n_estimators에 지정된 횟수만큼 학습을 끝까지 수행
* XGB의 경우, 오류가 더 이상 개선되지 않으면 수행 중지 ▶︎ 불필요한 학습 시간 단축!
* 하지만 이 조기 중단 값을 급격하게 줄이면 모델 성능이 향상될 여지가 있어도 학습이 조기 중단 될 수도 있음

 


XGBoost 예제

 

  • 위스콘신 유방암 예측 데이터를 활용
  • 파이썬 래퍼 XGBoost API 활용

 

XGBoost 임포트 및 버전 확인

import xgboost
print(xgboost.__version__)

 

라이브러리 불러오기 및 환경설정

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()
features = dataset.data # 독립변수
labels = dataset.target # 종속변수

cancer_df = pd.DataFrame(data=features, columns=dataset.feature_names)
cancer_df['target'] = labels
cancer_df.head(3)

결과

 

훈련 데이터와 테스트 데이터 분리

X_features = cancer_df.iloc[:, :-1]
y_label = cancer_df.iloc[:, -1]

# 80:20으로 학습 / 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size = 0.2, random_state = 156)
X_train.shape, X_test.shape, y_train.shape, y_test.shape 

# 학습데이터를 9 : 1로 구분하여 검증용 데이터 분리
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size = 0.1, random_state = 156)

print(X_train.shape, X_test.shape)
print(X_tr.shape, X_val.shape)

결과

 

 

파이썬 래퍼 XGBoost 적용 - 위스콘신 유방암 예측 모델 학습

  • C 언어 기반의 XGBoost인 파이썬 래퍼 XGBoost를 사용하는 법은 기존의 사이킷런의 fit(), predict()과 조금 다르다
  • 데이터프레임을 XGBoost 객체로 변환하는 과정을 거쳐, 아래 예제와 같이 조금 다른 방식으로 코드를 작성해주어야 한다
    • xgb.DMatrix 파라미터로 data 와 label 지정
    • 하이퍼파라미터는 주로 딕셔너리 형태로 입력
  • 조기 중단 수행을 위한 early_stopping_rounds 파라미터 설정을 하려면, 반드시 평가용 세트 지정 필요
    • eval_list에 튜플을 담은 리스트 형태로 저장 : [(dtr, 'train'), (dval, 'eval')] 또는 [(dval, 'eval')] 만 명기
    • evals = eval_list 처리
# XGBoost 객체로 데이터 변환
dtr = xgb.DMatrix(data=X_tr, label=y_tr)
dval = xgb.DMatrix(data=X_val, label=y_val)
dtest = xgb.DMatrix(data=X_test, label=y_test)

# 파라미터 설정
params = {
    'max_depth': 3,   # 트리의 최대 깊이
    'eta':0.05,   # 사이킷런 래퍼모듈에서는 learning_rate
    'objective':'binary:logistic',   # 이진분류의 목적함수 지정
    'eval_metric':'logloss'  # 오류 함수의 평가 성능 지표
}

# 부스팅 반복 횟수
num_rounds = 300

# 훈련 / 검증 데이터셋 지정
eval_list = [(dtr, 'train'), (dval, 'eval')]

# 조기 중단 횟수 여기서 설정
xgb_model = xgb.train(params=params, dtrain=dtr, num_boost_round=num_rounds,
                      early_stopping_rounds=50, evals=eval_list)

결과

  • 위 결과와 같이 train()으로 학습을 수행하면서 반복시마다, 오류(eval-logloss) 값이 감소하고 있음
  • 단, 초기 설정한 num_round 값이 300인데, 176번째 반복에서 완료했음
    👉 early_stopping_round 였던 50번 동안(126~ 176회 수행) 126번째 수행의 오류값이 개선되지 않았기 때문

 

예측 수행

  • 파이썬 래퍼 xgboost의 predict()는 예측 결괏값이 아닌, 예측 결과를 추정할 수 있는 확률값을 반환
  • 따라서, 이진 분류의 경우 예측 확률이 0.5보다 크면 1, 그렇지 않으면 0으로 예측 값을 결정하는 로직을 추가하면 됨
pred_probs = xgb_model.predict(dtest)
print('predict( ) 수행 결과값을 10개만 표시, 예측 확률 값으로 표시됨')
print(np.round(pred_probs[:10],3))

# 예측 확률이 0.5 보다 크면 1 , 그렇지 않으면 0 으로 예측값 결정하여 List 객체인 preds에 저장
preds = [ 1 if x > 0.5 else 0 for x in pred_probs ]
print('예측값 10개만 표시:',preds[:10])

 

예측 모델 성능 평가

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)
    # ROC-AUC print 추가
    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)

 

결과

 

 


[참고] 공식 사이트

 

XGBoost Documentation — xgboost 1.7.6 documentation

© Copyright 2022, xgboost developers. Revision 36eb41c9.

xgboost.readthedocs.io

728x90