pythonML

[pythonML] 부스팅(Boosting)- XGBoost(eXtra Gradient Boost)

독립성이 강한 ISFP 2022. 4. 4. 02:24
728x90
반응형

# XGBoost 의 개요

GBM에 기반하고 있지만, GBM의 단점인 느린 수행시간, 과적합 규제 등을 해결한 알고리즘

 

#XGBoost의 장점

1. 뛰어난 예측 성능 -> 분류/회귀에서 뛰어난 예측 성능을 발휘함

2. GBM 대비 빠른 수행 시간 ->  GBM에 비해서 빠른 수행성능을 보장함

3. 과적합 규제 -> GBM의 경우 과적합 규제기능이 없음

4. 나무 가지치기 

5. 자체 내장된 교차 검증

6. 결손값 자체 처리 

 

 

# 사이킷런 래퍼 XGBoost의 개요 및 적용

 

  • 사이킷런의 기본 Estimator를 이용해 만들어 fit()과 predict()만으로 학습과 예측이 가능
  • GridSearchCV,Pipeline 등 사이킷런의 유틸리티를 그대로 사용 가능
  • 분류 : XGBClassifier / 회귀 : XGBRegressor

 

# 조기 중단 수행을 하지 않은 성능 결과

# 사이킷런 래퍼 XGBoost 클래스인 XGBClassifier 임포트
from xgboost import XGBClassifier

evals = [(X_test, y_test)]
xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
xgb_wrapper.fit(X_train , y_train,  early_stopping_rounds=400,eval_set=evals, eval_metric="logloss",  verbose=True)
w_preds = xgb_wrapper.predict(X_test)
get_clf_eval(y_test , w_preds)
오차 행렬
[[35  2]
 [ 1 76]]
정확도: 0.9737, 정밀도: 0.9744, 재현율: 0.9870,    F1: 0.9806, AUC:0.9665

 

사이킷런 래퍼 XGBoost에서 조기 중단 기능을 수행할 수 있는데 fit( )에 해당 파라미터를 입력하면 됨.
→ early_stopping_rounds, eval_metrics, eval_set

 

 

# 조기 중단 수행 후의 성능 결과

xgb_wrapper.fit(X_train, y_train, early_stopping_rounds=10, 
                eval_metric="logloss", eval_set=evals,verbose=True)

ws10_preds = xgb_wrapper.predict(X_test)
get_clf_eval(y_test , ws10_preds)
get_clf_eval(y_test , ws100_preds)
오차 행렬
[[34  3]
 [ 1 76]]
정확도: 0.9649, 정밀도: 0.9620, 재현율: 0.9870,    F1: 0.9744, AUC:0.9530

 

# 조기 중단을 너무 급격하게 줄인 경우

# early_stopping_rounds를 10으로 설정하고 재 학습. 
xgb_wrapper.fit(X_train, y_train, early_stopping_rounds=10, 
                eval_metric="logloss", eval_set=evals,verbose=True)

ws10_preds = xgb_wrapper.predict(X_test)
get_clf_eval(y_test , ws10_preds)
오차 행렬
[[34  3]
 [ 2 75]]
정확도: 0.9561, 정밀도: 0.9615, 재현율: 0.9740,    F1: 0.9677, AUC:0.9465

 

# 피처 중요도 시각화

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)

728x90
반응형