본문 바로가기
Machine Learning

XGBoost 실습 - 사이킷런 래퍼 -

by rubyda 2020. 4. 27.
728x90

 

사이킷런에서는 XGBoost 관련 래퍼는 크게 두가지로 나눌 수 있습니다. 바로 분류를 위한 클래스 XGBClassifier, 회귀를 위한 클래스 XGBRegressor 입니다.

 

앞에 포스팅에서 파이썬 래퍼 XGBoost와 사이킷런 래퍼 XGBoost의 파라미터들의 차이가 존재한다고 하였습니다. XGBClassifier는 기존의 사이킷런에서 사용하는 하이퍼 파라미터와의 호환성을 유지하기 위해서 기존의 xgboost 모듈에서 사용하던 하이퍼 파라미터 몇 가지를 변경하였습니다. 변경 사항은 다음과 같습니다.

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

 

파이썬 래퍼 예제와 마찬가지로 위스콘신 유방암 데이터 세트를 사용해서 분류 예측을 해보도록 하겠습니다.

하이퍼 파라미터는 앞의 파이썬 래퍼와 동일하게(n_estimators(num_rounds): 400), learning_rate(rate):0.1, max_depth:3로 설정하였습니다. 

 

In

from xgboost import XGBClassifier

xgb_sk = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
xgb_sk.fit(x_train, y_train)
sk_pred = xgb_sk.predict(x_test)
sk_pred_proba= xgb_sk.predict_proba(x_test)[:,1]

 

파이썬 래퍼와 마찬가지로 get_eval()를 사용해서 예측 성능 평가를 해보도록 하겠습니다.

 

In

get_eval(y_test, sk_pred, sk_pred_proba)

Out

 

앞의 파이썬 래퍼 예제와 동일한 결과가 나왔습니다.

 

사이킷런 래퍼에서도 조기 중단을 적용할 수 있습니다. 조기 중단을 하려면 fit() 파라미터 내의 반복 횟수를 정의하는 early_stopping_rounds, 조기 중단을 위한 평가 지표 eval_metric, 성능 평가를 수행할 데이터 세트 eval_set을 입력하여주면 됩니다.

 

 

early_stopping_rounds를 100, eval_metric은 loglss, eval_set는 테스트 데이터 세트로 설정하겠습니다.

 

In

xgb_sk = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
evals = [(x_test,y_test)]
xgb_sk.fit(x_train, y_train,early_stopping_rounds=100, eval_metric='logloss',
          eval_set=evals, verbose=True)
pred_100 = xgb_sk.predict(x_test)
pred_100_proba = xgb_sk.predict_proba(x_test)[:,1]

Out

결과를 보면 400번 모두 수행되지 않고 311번 반복 후 학습을 완료하였습니다. 그 이유는 211번 반복했을 경우 logloss가 0.85593이며 311번 반복 시 logloss가 0.085948인데 211번 에서 311번까지 early_stopping_rounds=100이 반복될 동안 성능 평가 지수가 향상이 되지 않았기 때문입니다.

 

 

예측 성능 평가를 봤을때 조기 중단을 적용하지 않았을때보다 좋지 않지만 엄청난 차이를 의미하진 않습니다.

 

 

 

하지만!! 만약 조기 중단값을 확! 급격하게 줄이면 예측 성능이 저하될 가능성이 크게 됩니다. 만약 10으로 하게 된다면? 아직 성능이 향샹이 될 여지가 남아있음에도 불구하고 반복이 멈춰서 예측 성능이 나빠지게 될 것입니다. 한번 예제로 결과과 그러한지 확인해보겠습니다.

 

In

xgb_sk.fit(x_train, y_train,early_stopping_rounds=10, eval_metric='logloss',
          eval_set=evals, verbose=True)
pred_10 = xgb_sk.predict(x_test)
pred_10_proba = xgb_sk.predict_proba(x_test)[:,1]

Out

결과를 보면 62번 반복 수행 후 학습이 종료되었는데 62번 반복 시 logloss 값이 0.090311, 52번 반복 시 logloss 값이 0.089577로 10번의 반복 동안 성능 평가 지수가 향상되지 못해서 더 이상의 반복을 수행하지 않은 상태에서 학습이 종료된것을 확인하였습니다. 

 

예측 성능평가를 보면 약 0.9561로 100일때의 값인 0.9649보다 낮게 나오게 됩니다.

 

 

마지막으로 피처의 중요도를 시각화 할때는 파이썬 래퍼와 동일하게 plot_importance()를 사용해서 출력할 수 있습니다.

 

In

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

flg, ax = plt.subplots(figsize=(10,12))
plot_importance(xgb_sk, ax=ax)

Out

 

 

 

Reference


파이썬 머신러닝 완벽가이드

'Machine Learning' 카테고리의 다른 글

분류 실습(신용카드 사기 데이터)  (0) 2020.05.03
LightGBM  (3) 2020.04.28
XGBoost 실습 - 파이썬 래퍼 -  (0) 2020.04.27
XGBoost(eXtra Gradient Boost)  (0) 2020.04.26
GBM(Gradient Boosting Machine)  (1) 2020.04.26