사이킷런 래퍼 XGBoost의 개요 및 적용
사이킷런 래퍼 XGBoost 모듈은 사이킷런의 다른 estimator와 사용법이 같고, 분류의 경우 XGBClassifier, 회귀의 경우 XGBRegressor가 존재한다.
사이킷런 래퍼 XGBoost 적용 - 위스콘신 유방암 예측
분류 문제이므로 XGBClassifier를 이용해 예측해보자.
모델의 하이퍼 파라미터는 앞의 파이썬 래퍼 XGBoost와 동일하게 n_estimators(num_boost_rounds)는 400, learning_rate(eta)는 0.05, max_depth=3으로 설정하고, 앞 실습과 다르게 학습 데이터는 검증데이터로 분할되기 이전인 X_trian, y_train을 이용하고, 테스트 데이터는 그대로 X_test, y_test를 이용하겠다.
from xgboost import XGBClassifier
xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.05, 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(y_test, w_preds, w_pred_proba)
앞의 파이썬 래퍼 XGBoost보다 더 좋은 결과가 나왔다. 그 이유는 위스콘신 데이터 세트의 개수가 워낙 작은데, 앞에서는 조기 중단을 위해서 최초 학습 데이터인 X_train을 다시 학습용 X_tr, X_val로 분리하면서 최종 학습 데이터 건수가 작아지기 때문에 발생한 것으로 예상된다. 즉, 위스콘신 데이터 세트는 작기 때문에 전반적으로 검증 데이터를 분리하거나 교차검증등을 적용할 때 성능 수치가 불안정한 모습을 보인다.
하지만 데이터 건수가 많은 데이터의 경우라면, 원본 학습 데이터를 다시 학습과 검증 데이터로 분리하고 여기에 조기 중단 횟수를 적절하게 부여할 경우 일반적으로는 과적합을 개선할 수 있어서 모델 성능이 조금 더 향상될 수 있다.
이번에는 사이킷런 래퍼 XGBoost에서 조기 중단을 수행해보자. 조기 중단 관련 파라미터인 early_stopping_rounds, eval_metric, eval_set을 fit()에 입력하면 된다.
파이썬 래퍼 XGBoost 실습과 마찬가지로 최초 학습 데이터에서 다시 분리된 최종 학습 데이터와 검증 데이터를 이용하여 학습과 조기 중단을 적용해본다.
주의할 점은 eval_set은 파이썬 래퍼 XGBoost와 다르게 학습과 검증을 의미하는 문자열을 넣지 않는다. [(X_tr, y_tr), (X_val, y_val)]과 같이 지정하면 맨 앞의 튜플이 학습용 데이터, 뒤의 튜플이 검증용 데이터로 자동 인식 된다.
from xgboost import XGBClassifier
xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.05, max_depth=3)
evals = [(X_tr, y_tr), (X_val, y_val)]
xgb_wrapper.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric='logloss', eval_set=evals)
ws50_preds = xgb_wrapper.predict(X_test)
ws50_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1]
[0] validation_0-logloss:0.65016 validation_1-logloss:0.66183
[1] validation_0-logloss:0.61131 validation_1-logloss:0.63609
[2] validation_0-logloss:0.57563 validation_1-logloss:0.61144
... ... ...
[125] validation_0-logloss:0.01998 validation_1-logloss:0.25714
[126] validation_0-logloss:0.01973 validation_1-logloss:0.25587
[127] validation_0-logloss:0.01946 validation_1-logloss:0.25640
... ... ...
[175] validation_0-logloss:0.01267 validation_1-logloss:0.26086
[176] validation_0-logloss:0.01258 validation_1-logloss:0.26103
n_estimators가 400이지만 400번을 반복하지 않고 파이썬 래퍼 XGBoost의 조기 중단과 동일하게 176번째 반복에서 학습을 마무리했다. 마찬가지로 126번째 반복에서 검증 데이터 세트의 성능 평가인 validation_1-logloss가 0.25587로 가장 낮았고, 이후 50번 반복까지 더 이상 성능이 향상되지 않았기 때문에 학습이 조기 종료 되었다.
조기 중단으로 학습된 XGBClassifier의 예측 성능을 살펴보자. 결과는 파이썬 래퍼의 조기 중단 성능과 동일할 것이다. 앞에서 언급한 대로 위스콘신 데이터 세트는 워낙 작기 때문에 조기 중단을 위한 검증 데이터를 분리하면 검증 데이터가 없는 학습 데이터를 사용했을 때보다 성능이 저조하다.
get_clf_eval(y_test, ws50_preds, ws50_pred_proba)
early_stopping_rounds를 10으로 줄여보자. 10으로 하면 아직 성능이 향상될 여지가 있음에도 불구하고 10번 반복하는 동안 성능 평가지표가 향상되지 않으면 반복이 멈춰 버려서 충분한 학습이 되지 않아 예측 성능이 나빠질 수 있다. 즉, 조기 중단값을 너무 급격하게 줄이면 예측 성능이 저하될 우려가 크다.
# early_stopping_rounds를 10으로 설정하고 재학습
xgb_wrapper.fit(X_tr, y_tr, early_stopping_rounds=10, eval_metric='logloss', eval_set=evals)
ws10_preds = xgb_wrapper.predict(X_test)
ws10_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1]
get_clf_eval(y_test, ws10_preds, ws10_pred_proba)
[0] validation_0-logloss:0.65016 validation_1-logloss:0.66183
[1] validation_0-logloss:0.61131 validation_1-logloss:0.63609
[2] validation_0-logloss:0.57563 validation_1-logloss:0.61144
... ... ...
[92] validation_0-logloss:0.03152 validation_1-logloss:0.25918
[93] validation_0-logloss:0.03107 validation_1-logloss:0.25864
[94] validation_0-logloss:0.03049 validation_1-logloss:0.25951
... ... ...
[101] validation_0-logloss:0.02751 validation_1-logloss:0.25955
[102] validation_0-logloss:0.02714 validation_1-logloss:0.25901
[103] validation_0-logloss:0.02668 validation_1-logloss:0.25991
오차 행렬
[[34 3]
[ 3 74]]
정확도:0.9474, 정밀도:0.9610, 재현율:0.9610, F1:0.9610, AUC:0.9933
103번째 반복까지 수행된 후 학습이 종료했는데, 103번째 반복에서 검증 데이터 세트의 성능 평가인 validation_1-logloss가 0.25991, 93번째 반복의 validation_1-logloss가 0.25864로서 10번 반복하는 동안 성능 평가 지수가 향상되지 못해서 더 이상 수행하지 않고 학습이 종료됐다. 이렇게 학습된 모델로 예측한 결과 정확도는 0.9474로 early_stopping_rounds=50일 때의 0.9561보다 낮다.
파이썬 래퍼 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_wrapper, ax=ax)
Reference
https://dining-developer.tistory.com/3?category=929228
XGBoost (1) - 입문용 예제로 개념 쉽게 이해하기
요즘 현업에서 자주 사용하는 모델 중 하나가 XGBoost이다. 개인적으로 내 업무는 Data Scientist보다 Data Engineer에 가까워서 모델에 관해 심도 깊은 이해는 필요 없지만, 어느 정도의 이해는 필요하다
dining-developer.tistory.com
(1), (2), (3), (4) 참고
'파이썬 머신러닝 완벽가이드 > [4장] 분류' 카테고리의 다른 글
LightGBM (0) | 2023.02.19 |
---|---|
부스팅 정리 (0) | 2023.02.15 |
XGBoost(eXtra Gradient Boost) (1) (0) | 2023.02.12 |
부스팅 (0) | 2023.02.10 |
배깅 (0) | 2023.02.09 |