# AI 이론/Machine Learning

XGBoost 소개(파이썬 Wrapper, 싸이킷런 Wrapper) 및 예제

alz 2022. 1. 26. 21:36

XGBoost 개요

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

XGBoost는 GBM에 기반하고 있지만, GBM의 단점인 느린 수행 시간 및 과적합 규제 부재등의 문제를 해결해서 매우 각광을 받고 있다.

파이썬 Wrapper와 싸이킷런 Wrapper에는 약간의 차이가 존재합니다.

XGBClassifier는 기존의 사이킷런에서 사용하는 하이퍼 파라미터 몇 가지를 변경하였는데, 변경 사항은 다음과 같습니다.

  • eta -> learning_rate
  • sub_sample ->subsample
  • lambda ->reg_lambda
  • alpha ->reg_alpha

 

장점

  • 뛰어난 예측 성능
  • GBM 대비 빠른 수행 시간
  • 과적합 규제 
  • Tree pruning
  • 자체 내장된 교차 검증 (지정된 반복횟수가 아닌 교차검증을 통해 평가 데이터 세트의 평가값이 최적화 되면 반복을 중간에 멈출 수 있는 조기 중단 기능이 있음)
  • 결손값 자체 처리

과적합 문제가 심할경우

  • eta값을 낮춘다(0.01~0.1).eta값을 낮출 경우 num_round(또는 n_estimators)는 반대로 높혀줘야한다
  • max_depth 값을 낮춘다
  • min_child_weight 값을 높인다
  • gamma 값을 높인다

XGBoost(파이썬 Wrapper)를 적용하여 위스콘신 유방암 예측 

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
cancer_df.head(5)

head(5)로 앞의 데이터 5개를 보여준다)

print(dataset.target_names)
print(cancer_df['target'].value_counts())

"결과값"
['malignant' 'benign']
1    357
0    212

train,test 데이터 분리

X_train,X_test,y_train,y_test = train_test_split(dataset.data,dataset.target,test_size = 0.2)

#X_features,y_label
print(X_train.shape,X_test.shape)


"결과값"
(455, 30) (114, 30) # X_train는 455개의 데이터, X_test는 114개의 데이터

 

XGBoost만의 전용 데이터 세트 DMatrix를 생성 할 수 있다.

주로 Numpy로 입력파라미터를 받아서 만들어진다.

  • data : 피처 데이터 세트
  • label : 분류일경우 레이블 데이터 세트
             회귀일경우 숫자형인 종속값 데이터 세트

early_stopping_rounds 파라미터를 설정해 조기 중단을 수행하기 위해서는 반드시 

eval_set 과 eval_metric이 함께 설정 돼야 한다.

XGboost는 반복마다 eval_set으로 지정된 데이터 세트에서 eval_metric의 지정된 평가 지표로 예측오류를 측정

# XGBoost 는  DMatrix 라는 numpy로 만들어지는 전용 데이터 세트 (data,label) 파라미터로 
#DF.values로 1차원 변경후 사용
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, # XGBClassifier일 경우 learning_rate 로 쓴다
    'objective':'binary:logistic', #목적함수 : 0 or 1 이므로 이진 로지스틱 사용
    'eval_metric' : 'logloss', # 오류 함수의 평가 성능 지표 : logloss
    'early_stoppings':100 #100회이상 시행시에도 오류가 내려가지않으면 중단
} # 트리 깊이 최대 3 , 학습률 0.1 , 
num_rounds = 400 # 400회 반복

wlist = [(dtrain,'train'),(dtest,'eval')]
xgb_model =  xgb.train(params = params, dtrain=dtrain,num_boost_round= num_rounds,
                      early_stopping_rounds=100,evals = wlist)

XGBoost는의 predict()는 예측 결과값이 아닌 예측결과를 추정할 수 있는 확률을 반환한다.

pred_probs = xgb_model.predict(dtest)
print("predict() 수행 결괏값을 10개만 표시,예측 확률값으로 표시됌")
print(np.round(pred_probs[:10],3))
# 예측확률이 0.5보다 크면 악성(1) 아니면 0
preds = [1 if x > 0.5 else 0 for x in pred_probs]
print(preds[:10])

"결과값"

predict() 수행 결괏값을 10개만 표시,예측 확률값으로 표시됌
[0.972 1.    0.    1.    0.165 1.    1.    0.979 0.046 0.018]
[1, 1, 0, 1, 0, 1, 1, 1, 0, 0]

XGBoost의 plot_importance()를 통해 피처의 중요도를 막대그래프 형식으로 나타내보기

from xgboost import plot_importance
import matplotlib.pyplot as plt
%matplotlib inline

fig,ax =plt.subplots(figsize=(10,12))
plot_importance(xgb_model,ax=ax)

plot_importance(학습완료된 모델객체, ax객체)

 


싸이킷런을 래퍼 XGBoost

from xgboost import XGBClassifier

xgb_wrapper = XGBClassifier(n_estimators=400,learning_rate = 0.1,max_depth = 3)
xgb_wrapper.fit(X_train,y_train)
w_preds = xgB_wrapper,predict(X_test)
w_pred_proba = xgb_wrapper.predict_proba(X_test)[:,1]


""사전에 get_clf_eval 함수를 구현해놨음"

"결과"

[0]	validation_0-logloss:0.61823
[1]	validation_0-logloss:0.55884
[2]	validation_0-logloss:0.51012
[3]	validation_0-logloss:0.46664
[4]	validation_0-logloss:0.43062
[5]	validation_0-logloss:0.40135
[6]	validation_0-logloss:0.37567
....
....
[379]	validation_0-logloss:0.09340
[380]	validation_0-logloss:0.09333
[381]	validation_0-logloss:0.09338
[382]	validation_0-logloss:0.09335

 

fig,ax = plt.subplots(figsize= (10,12))
plot_importance(xgb_wrapper,ax=ax)

이처럼 파이썬Wrapper 와 사이킷런 Wrapper 가 동일하게 피쳐 중요도가 시각화 됨을 알수있다.

'# AI 이론 > Machine Learning' 카테고리의 다른 글

[ML]캐글 신용카드 사기 검출  (0) 2022.02.05
LightGBM  (0) 2022.01.26
피처 스케일링(Feature Scaling)  (0) 2022.01.19
[Sklearn]타이타닉 생존자 예측  (0) 2022.01.14
1.머신러닝이란?  (0) 2022.01.04