XGBoost는 트리 기반 앙상블 러닝에서 가장 각광받고 있는 알고리즘 중 하나이다. 분류에 있어서 일반적으로 다른 머신러닝 알고리즘보다 뛰어난 예측 성능을 보여준다.
XGBoost
XGBoost는 GBoost(Gradient Boost)에서도 알수 있듯이, GBM(Gradient Boosting Machine)을 기반으로 하고 있다. 기존 GBM에서 단점이었던, 느린 수행시간과 과적합을 제어할 방법의 부재를 XGBoost에서 해결하였다.
XGBoost의 장점
- 빠른 수행시간 : GBM에서 하지 못헀던 병렬 수행 및 다양한 기능들을 통해서 GBM보다 빠르다. 하지만, 상대적으로 GBM보다 빠른 것이지, 전체 머신러닝 알고리즘에서 빠른 편에 속하지는 않는다.
- 과적합 규제 기능 : XGBoost는 자체에 과적합 규제 기능을 포함하고 있다.
- 나무 가지치기(Tree Prunning) : GBM도 분할을 너무 많이 하지 않도록 규제하는 장치가 존재하고, max_depth라는 것을 통해서 분할을 규제하기도 하지만, XGBoost는 추가적으로 Tree Prunning으로 긍정 이득이 없는 분할을 가지치기하여 분할을 줄이는 기능을 추가적으로 가지고 있다.
- 자체 내장 교차검증 : XGBoost는 반복 수행시마다 내부적으로 교차 검증을 수행한다. 지정된 반복 횟수를 시행하는 것이 아닌, 평가 값이 최적화되면 반복을 조기 중단하는 기능을 가지고 있다.
- 결손값 처리 : XGBoost는 결손값을 자체 처리할 수 있는 기능을 가지고 있다.
XGBoost 패키지
XGXGBoost의 핵심 라이브러리는 C와 C++로 작성되어 있다. 이로 인해서, 파이썬에서 XGBoost를 구동할 수 있도록 xgboost라는 이름의 파이썬 패키지를 제공한다. 따라서 XGBoost는 두가지 방법을 통해서 사용할 수 있는데, 하나는 앞에서 설명한 일반 파이썬 패키지인 xgboost이고, 다른 하나는 사이킷 런 패키지를 통해서 사용할 수 있다.
그 중에서 사이킷 런에 내장되어 있는 XGBoost를 더 자주 사용하게 될 것이다. 이전에는 사이킷 런에 XGBoost가 없고,
일반 파이썬 패키지로만 XGBoost가 존재했다. 하지만, 기존에 다른 ML 알고리즘들이 사이킷 런을 통해서 제공되고, 그에 따라 사이킷 런에서 제공하는 유틸리티나 매서드(fit, predict 등)를 XGBoost에서는 사용하지 못하는 것에 많은 사람들이 불편함을 느꼈다. 그 결과 사이킷 런에서 XGBoost를 사용할 수 있게 되었고, 그 후 여타 다른 ML 알고리즘과 같이 사이킷 런의 여러 기능들을 사용할 수 있게 되었다.
XGBoost 설치
위의 내용을 잘 이해했다면, 우리가 사이킷 런을 통해 XGBoost를 사용하는 경우에는 별도의 패키지 설치 과정이 필요 없다는 것을 알 수 있다. 파이썬 패키지 xgboost를 이용하고 싶은 경우에는 Anaconda Prompt 창에
conda install -c anaconda py-xgboost
라는 코드를 입력하여 xgboost를 설치할 수 있다.
XGBoost 하이퍼 파라미터
XGBoost는 GBM과 유사한 하이퍼 파라미터를 가지고 있고, 여기에 과적합, 조기 중단을 위한 하이퍼 파라미터가 추가 되었다.
XGBoost를 사용해야하는 경우가 앞으로 많을 것이기에 하이퍼 파라미터에 대해서 정리를 해보고자 한다.
일단 XGBoost는 일반 파라미터 / 부스터 파라미터 / 학습 태스크 파라미터가 있다.
일반 파라미터는 일반적으로 실행 시 스레드의 개수나 silent 모드 등의 선택을 위한 파라미터로서
'디폴트 값을 변경하는 경우가 거의 없다. ' 즉, 해당 파라미터를 별도로 지정해주는 경우가 거의 없다.
부스터 파라미터는 트리 최적화, 부스팅, 규제 등과 관련된 부분을 지정해주는 파라미터를 의미한다.
학습 태스크 파라미터는 객체 함수, 평가 지표등을 설정하는 파라미터이다.
(사이킷 런에서 사용되는 하이퍼 파라미터도 동일하다. 하지만, 하이퍼 파라미터의 이름이 다른 경우에는
괄호안에 alias인 부분이 사이킷 런에서 해당 파라미터의 이름이라고 보면 된다.)
주요 일반 파라미터
- booster : gbtree(tree based model) 또는 gblinear(linear model) 선택, 디폴트는 gbtree이다.
- silent : 디폴트는 0이며, 출력 메시지를 나타내고 싶지 않을 경우 1로 설정
- nthred : CPU의 실행 스레드 개수를 조정하며, 디폴트는 CPU의 전체 스레드를 다 사용하는 것이다.
멀티 코어 / 스레드 CPU 시스템에서 전체 CPU를 사용하지 않고 일부만 사용해 ML 애플리케이션을 구동하는 경우에 사용한다.
주요 부스터 파라미터
- eta[default = 0.3, alias: learning_rate] : GBM의 학습률(learning_rate)과 같은 파라미터이다.
0 ~ 1 사이의 값을 가지고 사이킷 런 래퍼 클래스를 이용하는 경우 디폴트는 0.1이다.
일반적인 경우에 learning_rate 는 0.01 ~ 0.2의 값을 가진다.
- num_boost_rounds : GBM의 n_estimators와 같은 파라미터.
- min_child_weight[default = 1] : 트리에서 추가적으로 가지를 나눌지 결정하기 위해 필요한 데이터들의 weight 총합.
해당 값이 클수록 분할이 잘 일어나지 않게 된다. 과적합 조절을 위해서 사용된다.
- gamma[default= 0, alias :min_split_loss] : 트리의 리프 노드를 추가적으로 나눌지 결정할 최소 손실 감소 값.
해당 값보다 손실 값이 크게 감소된다면 리프 노드를 분리한다.
- max_depth[default = 6] : 트리 기반 알고리즘과 동일. 0으로 지정하면 깊이에 제한이 없다. 일반적으로 3 ~ 10사이의 값으로 지정해준다.
- sub_sample[default = 1] : GBM의 sub_sample과 동일. 과적합 제어를 위해 샘플링하는 비율을 지정한다. 0.5로 지정하면 전체 데이터의 절반을 트리를 생성하는데 사용. 0 ~ 1사이의 값을 가지고 일반적으로 0.5에서 1사이의 값을 지정한다.
- colsample_bytree[default = 1] : GBM의 max_features와 유사. 트리 생성에 필요한 피처를 샘플링하는데 사용. 피처가 너무 많은 경우 과적합을 제어하기위한 목적으로 사용한다.
- lambda[default = 1, alias : reg_lambda] : L2 Regularization 적용 값. 값이 클수록 과적합 감소 효과가 있다.
- alpha[default = 0, alias : reg_alpha] : L1 Regularization 적용 값. 값이 클수록 과적합 감소 효과가 있다.
- scale_pos_weight[default =1 ] : 특정 값으로 편향된 데이터로 구성된 데이터 세트의 균형을 위지하기 위한 파라미터.
학습 태스크 파라미터
- objective : 손실함수를 정의.
- binary:logistic : 이진분류인 경우에 사용.
- multi:softmax : 다중 분류일때 적용. 해당 경우에 num_class 파라미터를 지정해야 한다.
- multi:softprob : multi:softmax와 유사하나 개별 레이블 클래스에 해당되는 예측 확률을 반환.
- eval_metric : 검증에 사용되는 함수를 정의, 디폴트는 rmse, 분류인 경우엔 error이다.
과적합 문제를 해결하기 위한 방법
1. eta 값을 낮춘다.
2. max_depth 값을 낮춘다.
3. min_child_weight 값을 높인다.
4. gamma 값을 높인다.
5. subsample, colsample_bytree를 조정.
LightGBM(LGBM)
LightGBM은 XGB와 같이 사이킷런과 호환하기 위해 LGBMClassifier(분류)와 LGBMRegressor(회귀) 클래스를 제공한다.
LightGBM은 XGBoost와 거의 유사하다. (성능, 하이퍼 파라미터 등). 하지만, 수행시간을 단축시킨다는 장점을 가지고 있다. 다만, XGB와 비교해서 예측 성능이 조금은 떨어진다.
LightGBM을 사용하면서 주의할 점
LightGBM이 2.1.0 버전이 되면서 boost_from_average라는 하이퍼 파라미터의 디폴트 값이 False에서 True로 변경되었다. 일반적인 경우에는 학습을 수행하는데에 문제가 없지만, 레이블 값이 불균형한 경우 성능 지표가 크게 떨어지는 경우가 발생한다. 이런 경우 해당 파라미터를 False로 설정을 해주면 성능 지표가 향상된다.
( 만약 LGBM을 책이나 자료를 참고하여 사용할 때 성능 지표가 크게 떨어지면 boost_from_average를 튜닝할 것을 추천한다. )
'기계학습 > Machine Learning' 카테고리의 다른 글
[파이썬 머신러닝 완벽 가이드] : 회귀 ( 선형 회귀 / 경사하강법) (0) | 2020.08.30 |
---|---|
[파이썬 머신러닝 완벽가이드] : 사이킷 런 앙상블 러닝 ( Stacking ) (0) | 2020.08.25 |
[파이썬 머신러닝 완벽가이드] : 사이킷 런 앙상블 러닝 ( Boosting ) (0) | 2020.08.21 |
[파이썬 머신러닝 완벽가이드] : 사이킷 런 앙상블 러닝 ( Voting / Bagging ) (0) | 2020.08.19 |
[파이썬 머신러닝 완벽가이드] : 사이킷 런 결정트리 하이퍼 파라미터, 시각화Graphviz (0) | 2020.08.12 |
최근댓글