본문 바로가기
Data Analysis/Python

XGBoost_하이퍼파라미터

by su_hyeon 2023. 2. 28.

 XGBoost는 GBM에 기반을 하고 있지만, GBM의 단점인 느린 수행 시간 및 과적합 규제(Regularization) 부재 등의 문제를 해결한 트리기반 알고리즘 모델이다.

 

XGBoost의 장점은 

  • 뛰어난 예측 성능 : 분류 및 회귀 둘 다 뛰어난 예측 성능
  • GBM 대비 빠른 수행 시간 : 약한 학습기가 가중치를 증감하는 방법으로 돌아가는 GBM과는 달리 병렬 수행 및 다양한 기능으로 GBM보다는 빠른 수행시간을 가지고 있음
  • 과적합 규제 : XGBoost 자체에 과적합 규제 기능을 가지고 있음
  • Tree pruning (나무 가지치기) : max depth 파라미터를 이용하여 트리 분할 깊이를 조절할 수도 있지만, tree pruning으로 더 이상 긍정 이득이 없는 분할을 가지치기 해서 분할 수를 더 줄이는 추가적인 장점을 가지고 있음
  • 자체 내장된 교차검증 : XGBoost는 내부적으로 학습 데이터와 테스트 데이터에 대한 교차검증을 수행해 최적화된 반복 수행 횟수를 가질 수 있음 / 조기중단(early stopping) 가능
  • 결손값 자체 처리 : 결손값을 자체적으로 처리할 수 있는 기능을 가지고 있음

XGBoost의 파이썬 패키지 명은 'xgboost'이다.

또한, xgboost 패키지 내에는 XGBoost 전용의 파이썬 패키지와 사이킷런과 호환되는 XGBoost가 함께 존재한다.

XGBoost 전용의 파이썬 패키지는 파이썬 언어 기반에서 구현한 별도의 API이기 때문에 사이킷런의 fit()과 predict() 메서드와 같은 기능을 사용할 수 없다. 또한, cross_val_score, GridSearchCV, Pipeline 등과 같은 다양한 유틸리티를 사용할 수 없다.

 

하지만 사이킷런과 호환되는 XGBoost 클래스는 fit()과 predict() 메서드를 사용할 수 있으며 XGBClassifier과 XGBRegressor로 분류와 회귀 분석에 사용할 수 있다.

이러한 모듈을 책에서는 사이킷런 래퍼 XGBoost 모듈이라고 지칭한다.

 

xgboost

위의 코드를 사용하여 XGBoost Classifier를 불러올 수 있다.

 

XGBoost 전용의 파이썬 패키지와 사이킷런과 호환되는 XGBoost의 하이퍼 파라미터가 약간 다르지만 사이킷런을 사용하여 실습을 진행할 것이기 때문에 사이킷런과 호환되는 XGBoost의 하이퍼 파라미터를 집중적으로 설명하도록 하겠다.

 

  • XGBoost 하이퍼 파라미터

 

사이킷런 래퍼 XGBoost 모듈 하이퍼 파라미터를 유형별로 아래와 같이 나눌 수 있다.

  • 일반 파라미터 : 스레드의 개수나 silent 모드 등의 선택을 위한 파라미터이지만 디폴트로 지정된 파라미터 값을 변경하는 일은 거의 없음
Hyper Parameter default mean
booster 'gbtree' 어떤 부스터를 사용할 것인지를 정하는 파라미터로 gbtree(트리기반) 또는
gblinear(선형회귀 기반)을 선택함. 
slient  0 출력 메세지를 나타내고 싶지 않을 경우 1,
출력 메세지를 나타내고 싶으면 0으로 지정 
nthread 사용할 수 있는 최대 스레드 갯수 먼저, thread(스레드)는 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
여기서 프로세스란, 파이썬 코드가 실행되고 있는 것을 의미하는데 이는 데이터, 자원, 스레드에 의해 돌아간다. 

따라서, nthread는 파이썬 CPU 구동시 실행 스레드의 갯수를 조정하며,
멀티 코어 / 스레드 CPU 시스템에서 전체 CPU를 사용하지 않고 일부 CPU만 사용해 프로그램을 구동하는 경우에 변경이 필요하다.

 

  • 부스터(Booster) 파라미터 : 트리 최적화, 부스팅, regularization 등과 관련 파라미터 등을 지정 / 대부분 하이퍼 파라미터가 속해져 있음

 

Hyper Parameter default mean
eta 0.3
alias = learning_rate
GBM의 학습률의 역할을 하는 파라미터.
0 ~ 1 사이의 값을 지정하며 부스팅 기법을 반복적으로 수행할 때 업데이트되는 학습률 값

파이썬 래퍼 xgboost의 default는 0.3,
사이킷런 래퍼 xgboost는 learning_rate 파라미터로 대체 되며 default는 0.1이다.
보통은 0.01 ~ 0.2 사이의 값을 선호 
num_boost_rounds (= n_estimators) 100 GBM의 n_estimators와 같은 파라미터
즉, weak learner(약한 학습기)의 갯수를 의미한다.
갯수가 많을수록 오류를 보정하는 것도 증가하기 때문에 성능이 좋아질 수 있지만, 그만큼 수행시간이 오래걸림
min_child_weight 1 트리기반 모델에서 추가적으로 가지를 나눌지 결정하기 위해 필요한 데이터들의 가중치(weight) 총합을 의미

과적합을 조절하기 위해 사용하는 파라미터로써, 이 값이 클수록 분할을 줄임
gamma 0
alias = min_split_loss
트리의 리프노드를 추가적으로 나눌지를 결정할 최소 손실(loss) 감소 값
값이 클수록 과적합 감소 효과가 있음
max_depth 6 트리기반 알고리즘의 max_depth와 같은 파라미터
0을 지정하면 트리의 깊이에 제한이 없고, 보통 3 ~10 사이의 값을 적용
sub_sample 1 GBM의 subsample과 동일함
트리가 커져 과적합되는 것을 제어하기 위해 데이터를 샘플링하는 비율을 지정

만약, 0.5로 지정하면 트리를 생성할 때 전체 데이터의 절반을 사용함
일반적으로 0.5 ~ 1 사이의 값을 사용
colsample_bytree 1 트리 생성에 필요한 피처(열)를 임의로 샘플링하는데 사용하는 파라미터
GBM의 max_features와 유사
lambda 1
alias = reg_lambda
L2 Regularization 적용 값
값이 클수록 과적합 감소 효과가 있음
alpha 0
alias = reg_alpha
L1 Regularization 적용 값
값이 클수록 과적합 감소 효과가 있음
scale_pos_weight 1 특정 값으로 치우친 비대칭한 클래스로 구성된 데이터 세트의 균형을 유지하기 위한 파라미터

 

  • 학습 태스크 파라미터 : 학습 수행 시의 객체 함수, 평가를 위한 지표 등을 설정하는 파라미터
Hyper Parameter mean
objective 최소값을 가져야 할 손실 함수 정의
이진분류와 다중 분류인지에 따라 손실함수가 달라짐
binary 이진 분류일때 적용
multi:softmax 다중 분류일 때 적용 / 레이블 클래스의 갯수인 num_class 파라미터를 지정해야 함
multi:softprob 개별 레이블 클래스의 해당되는 예측 확률을 반환함
eval_metric 검증에 사용되는 함수 정의 / 회귀 : rmse, 분류 : error

- eval_metric 파라미터의 유형은 아래와 같다.

 

  -> rmse 

  -> mae

  -> logloss

  -> error

  -> merror

  -> mlogloss

  -> auc : area under the curve

 

하이퍼 파라미터의 종류가 많지만, 파라미터를 조정하는 노력 대비 성과가 좋은 경우는 드물다.

만약, 과적합 문제가 심각하다면 아래의 파라미터를 조절하는 것이 좋다.

- eta 값은 낮춤 (eta 값을 낮출 경우 num_round 또는 n_estimators는 반대로 높여주어야 함)

- max_depth 값을 낯춤

- min_child_weight 값을 높임

- gamma 값을 높임

- subsamploe과 colsample_bytree를 조절

 

XGBoost는 자체적으로 교차검증, 성능 평가, 피처 중요도 시각화 기능을 가지고 있다.

가장 대표적으로는 수행 속도를 향상시키기 위한 조기중단(Early Stopping)기능이 있다.

조기 중단 기능은 XGBoost 뿐만 아니라 LGBM에도 있어서, n_estimators에 지정한 부스팅 반복 횟수에 도달하지 않더라도 예측 오류가 더 이상 개선되지 않으면 반복을 끝까지 수행하지 않고 중지해 수행 시간을 개선할 수 있다.