이것저것 공부 기록하기

[MachineLearning] 앙상블 소개 / XGBoost 와 LightGBM 비교 본문

MachineLearning

[MachineLearning] 앙상블 소개 / XGBoost 와 LightGBM 비교

얍욥얍 2020. 7. 3. 16:32

 

 

먼저, XGBoost와 lightGBM은 앙상블 알고리즘이므로 잠시 앙상블에 대해 간략히 다뤄보겠습니다.

앙상블(Ensemble)이란?

앙상블 학습은 여러 개의 결정 트리(Decision Tree)를 결합하는 것으로, 하나의 결정 트리보다 알고리즘 성능을 더 높일 수 있습니다. 앙상블 학습을 통해 약한 분류기(Weak Classifier) 여러 개를 결합해서 강한 분류기(Strong Classifier)를 만들 수 있습니다.

머신러닝 앙상블은 크게 배깅(Bagging), 부스팅(Boosting)으로 구분됩니다.

 

배깅(Bagging)

배깅(Bagging)은 Bootstrap Aggregation의 약자로 샘플을 여러 번 뽑는 Bootstrap 과정을 거쳐 각 모델을 학습시킨 후 그 결과물을 집계(Aggregation)하는 방법입니다.

출처: swallow.github.io

그림과 같이 Input Sample 데이터를 부트스트랩하여 데이터를 샘플링하고 학습된 각 모델의 결과를 집계해서 최종 결과값을 구해내는 방식입니다.

범주형 데이터는 Voting을 통해 결과를 집계하며, 연속형 데이터는 평균으로 집계합니다.

 

부스팅(Boosting)

부스팅(Boosting)은 이전 모델의 예측 결과에 따라 가중치를 활용해서 강분류기를 만드는 방법입니다.

출처: Medium (Boosting and Bagging explained with examples)

그림은 +와 -로 구성된 데이터셋을 분류하는 문제입니다. 잘못 분류된 데이터는 가중치를 높여주고, 잘 분류된 데이터는 가중치를 낮추어 주며 데이터 크기를 조절하는 과정을 통해 다음 모델에서 해당 데이터에 더 집중해 분류되고 있음을 볼 수 있습니다.

 

D1, D2, D3의 classifier를 합쳐 최종 classifier를 구할 수 있습니다.

 


 

요약하자면, 배깅은 여러 개의 결정 트리를 이용해서 각각의 예측 결과 값을 집계해서 최종 결과값을 예측하는 방식인 반면, 부스팅은 이전 모델의 예측 결과에 가중치를 부여하며 순차적으로 다음 모델에 영향을 주는 방식입니다.

따라서 부스팅은 배깅에 비해 정확도가 높지만, 속도가 느리고 오버피팅될 수 있기 때문에 개별 결정 트리의 낮은 성능을 개선하려면 부스팅이 적합하고, 오버피팅이 문제라면 배깅이 적합합니다.

 

XGBoost와 lightGBM는 이러한 앙상블 기법 중 부스팅 알고리즘과 관련이 있습니다.


XGBoost

XGBoost는 기존의 경사하강법(gradient boosting) 알고리즘의 단점을 보완한 알고리즘입니다.

Gradient Descent는 Loss Function을 최소화하는 최적의 파라미터를 찾는 방법인데, 쉽게 생각해서 Gradient Boosting은 이러한 탐색 과정이 파라미터가 아닌 모델 함수의 개념에서 이뤄진다고 생각하면 됩니다.

즉, Gradient Boosting은 Gradient가 현재까지 학습된 모델의 약점을 드러내며, 다른 모델이 그걸 중점적으로 보완해서 성능을 Boosting합니다.

 

하지만 Gradient Boosting은 속도가 느리고 오버피팅이 될 수 있다는 문제점이 있었고, XGBoost는 이 문제를 보완하고자 탄생된 모델입니다.

 

XGboost는 앙상블 부스팅의 특징인 가중치 부여를 경사하강법으로 하기에 기존의 Gradient Boost를 기반으로 하지만,GBM(Gradient Boosting Machine)보다는 빠르고, early stopping과 같은 규제가 포함되어 있어 오버피팅을 방지할 수 있습니다.

또한, CART 기반으로 분류와 회귀가 둘 다 가능합니다.

 

XGBoost의 파라미터

  • General Parameters
    • booster : 어떤 부스터 구조를 쓸 것인지 정하는 파라미터. gbtree, gblinear, dart(Drop out Regression Trees)가 있고 기본값은 'gbtree'이며 gbtree의 성능이 제일 낫다.
    • n_jobs : xgboost 실행시 병렬처리에 사용되는 코어 수. 따로 값을 주지 않으면 자동적으로 코어를 탐지하여 사용한다.
    • num_features : 특성의 수를 정해주어야 하는 경우에 사용한다.

 

  • Booster Parameters
    • learning_rate : 가중치를 정해주는 파라미터. 학습률
    • gamma : 트리가 분할할 때 필요한 최소 손실 감소(Minimum Loss reduction)를 지정해준다. 값이 커지면 트리의 깊이가 줄어들어 보수적인 모델이 된다.
    • n_estimators : 결정 트리 개수
    • max_depth : 트리의 깊이를 정해주는 파라미터
    • min_split_loss : 리프 노드를 추가적으로 나눌지 결정
    • reg_lambda : L2 norm. 값이 커질수록 모델이 보수적으로 변화
    • reg_alpha : L1 norm. 값이 커질수록 모델이 보수적으로 변화

 

  • Learning Task Parameters
    • objective : 목적함수를 정해주는 파라미터. binary: logistic은 이진분류, multi:softmax는 다중 클래스 분류. 이외에도 multi:softprob, rank:map 등 다양한 값들이 존재
    • eval_metric : 모델의 평가 함수를 설정하는 파라미터로 회귀분석이면 'rmse', 분류 문제에는 'error'를 기본값으로 사용. rmse, mae, error(Binary classification error rate) 등 여러 값들이 존재하며 objective에 따라 기본값이 설정되어 있다.

 

 

 

LightGBM

XGBoost는 이전 GBM보다 성능은 좋아졌지만 여전히 학습시간은 느리다는 단점을 갖고 있었습니다. 또한, 하이퍼 파라미터도 많아 grid search 등으로 하이퍼 파라미터 튜닝을 하게 되면 시간이 더욱 오래 걸리게 됩니다.

LightGBM은 이러한 XGBoost의 단점을 보완하기 위해 나왔습니다.

 

LightGBM은 대용량 데이터 처리가 가능하고 메모리를 적게 사용하며 빠르지만, 너무 적은 수의 데이터를 사용하면 오버피팅이 될 수 있으니 유의합니다.

 

 

출처: https://rohitgr7.github.io/lightgbm-another-gradient-boosting/

LGBM은 XGBoost를 포함한 기존 boosting 모델과 달리 리프 노드를 중심으로 트리 분할을 합니다.

level-wise 트리 분석은 균형을 잡아주어야 하기에 트리의 깊이가 줄어들고 연산이 추가됩니다.

LGBM은 균형은 상관없이 loss를 가장 줄일 수 있는 쪽으로 리프 노드를 지속적으로 분할해가기 때문에 비대칭적이고 깊은 트리가 생성되지만 동일한 리프를 생성할 때 level-wise보다 loss를 줄일 수 있습니다.

 

 

LightGBM의 파라미터

대체로 XGBoost와 하이퍼 파라미터들이 비슷하지만 leaf-wise 방식의 하이퍼 파라미터가 존재합니다.

    • num_leaves : 하나의 트리가 가질 수 있는 최대 리프 개수
    • min_data_in_leaf : 오버피팅을 방지할 수 있는 파라미터. 적정값은 training 샘플에 따른다. 너무 큰 값은 언더피팅을 발생시킬 수 있으므로 큰 데이터셋에서는 100이나 1000 정도로 설정하면 충분하다.
    • feature_fraction : 트리를 학습할 때마다 선택하는 feature의 비율
    • n_estimators : 결정 트리 개수
    • learning_rate : 학습률
    • reg_lambda : L2 규제
    • reg_alpha : L1규제
    • max_depth : 트리 개수 제한

 

이 외 파라미터는 아래 링크를 참조하시면 됩니다.

https://towardsdatascience.com/xgboost-mathematics-explained-58262530904a

 


XGBoost와 LightGBM 중 무엇을 써야할까?

캐글의 competition 우승 커널들에서는 XGBoost가 사실상 잘 쓰이고 있지만 데이터가 많아지면 XGBoost는 training 시간이 많이 소요됩니다.

다음은 Census Income Dataset을 다룬 코드입니다.

Loading the data

 

Data Description
Evaluation metrics:  Accuracy, auc_score & execution time (Model 1)
Evaluation metrics:  Accuracy, rsme_score & execution time (Model 2)

 

LightGBM과 XGBoost를 해당 데이터셋에서 돌려본 결과 accuracy와 AUC score에서는 LightGBM보다 XGBoost가 살짝 높게 나오고, RSME score에서는 XGBoost가 살짝 낮게 나온 것을 볼 수 있습니다.

하지만 training에 소요된 시간에서는 큰 차이를 보이고 있네요.

 

따라서 제한된 시간 내에 큰 데이터셋을 다뤄야한다면 LGBM이 효율적일 것으로 생각할 수 있습니다.

 

 

 

 

 

References

https://towardsdatascience.com/lightgbm-vs-xgboost-which-algorithm-win-the-race-1ff7dd4917d

https://towardsdatascience.com/xgboost-mathematics-explained-58262530904a

https://lsjsj92.tistory.com/

https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html

https://rohitgr7.github.io/lightgbm-another-gradient-boosting/

반응형
Comments