이번 포스팅에 다룰 내용은 "부스팅(Boosting)" 앙상블이다. 부스팅은 이전에 정리한 Voting, Bagging 앙상블과는 다르게 순서를 가진다. 부스팅 모델은 여러개의 약한모델(weak learner)을 순차적으로 학습하면서, 잘못 예측한 데이터에 가중치를 부여해 오류를 개선해나가는 모델이다.
부스팅 모델에 가장 대표적인 방식이 ADA Boost (Adaptive Boosting), GBM (Gradient Boosting Method)인데 이번 포스팅에는 GBM 부류의 모델들에 대해 정리하겠다. (ADA 는 틀린 데이터셋에 대해 가중치를 줘가며 오답을 줄이려는 방향이고, GBM 은 모델의 전체 손실함수를 최소화 하는 방향으로 GBM 이 좀더 유연하다)
ADA Boost
부스팅도 배깅과 마찬가지로 여러개의 동일한 결정트리 모델을 조합한다 (↔보팅은 다른 종류의 모델 조합). 다만, 배깅 대비 통상적으로 성능이 더 좋지만, 계산속도가 오래걸리는 단점이 있다.
2. GBM (Gradient Boosting Machine)
가중치 업데이트에 Gradient Descent (경사하강법), 즉 잔차를 Gradient를 통해 최소화 하는 방법이다. 첫번째 트리에서 생긴 잔차 데이터를 가지고 두번째 트리를 그리고, 두번째 트리결과의 잔차로 세번째 트리를 그리는 방식
GBM Regression 모델 예시
GBM은 Random Forest와 같은 배깅 모델 대비 성능이 좋지만, Overfit되기 쉽고 파라미터 튜닝이 까다롭다.(오래걸림) 그만큼 Loss function 등을 통해 Regulation 을 잘 활용하는것이 중요하다.
Parameter 종류:loss = cost function 을 뭘로 쓸지, learning_rates , subsample = 학습데이터의 몇 퍼센트 정도를 가지고 학습할지, n_estimator = weak learner 의 개수
3. XGBoost (eXtra Gradient Boosting Machine)
GBM의 두가지 큰 단점 ①순차적(직렬) 계산방식이기 때문에 속도(Computational cost)문제가 크고 ②과적합이 쉽다.
XGB는 속도문제를 개선하기위해 병렬 CPU 환경에서 학습기능을 제공한다. (최근 버전은 GPU도 지원한다고함)
XGB에서는 GBM 에 없는 가중치규제 (Regularization) L1,L2 등을 파라미터로 사용할 수 있다.
XGB는 또 하나의 과적합 방지기법으로 Tree Pruning(나무가지치기)을 사용할 수 있는데, 이는 더 이상 긍정 이득이 없는 분할을 가지치기 해서 분할을 줄이는 방법이다. (쉽게 말하면 기존 GBM 은 Bottomup 방식으로 일단 정해진 깊이까지 최대한 분리하고 필요없는 가지제거 ↔ XGB는 gamma 매개변수를 통해 노드 분리로 인한 이득이 일정수준 미만이면 분리를 안한다)
교차검증이 자체 내장되어 있어 early stopping 기능과 같이 사용하면, 지정된 반복회수(트리의개수)를 n_estimator 파라미터로 지정해두어도 (예를들어 200개), 무조건 200만큼 학습하는 것이 아니라 조기중단 (early stopping) 파라미터를 지정해두면 (예를들어 50개) 50번 반복까지 학습오류가 좋아지지 않으면 멈춰버린다.
XGBoost 모델의 feature importance 시각화 (LightGBM 에서도 같은 코드로 피쳐중요도 시각화 가능하다)
from xgboost import plot_importance
importmatplotlib.pyplotasplt
fig, ax = plt.subplots(figsize=(4, 4))
plot_importance(xgb_wrapper, ax=ax)
4. LightGBM
XGBoost는 성능이 매우 뛰어나지만 수행시간이 너무 오래걸린다 (특히 GridSearchCV 를 통해 최적화 하는과정). 학습속도 + 메모리 사용량을 상대적으로 적게하면서도 성능을 유지하는 더 최신 모델이 LightGBM 이다.
적은 데이터 (10,000 이하)에서는 과적합이 쉽다고 알려져있다.
XGBoost 를 포함한 대부분의 트리구조는 level wise 의 균형적인 트리 알고리즘을 사용한다. level wise 는 과적합에 강하지만, 균형을 맞추기 위한 시간이 필요하다. LightGBM은 leaf wise 방식으로 leaf를 지속 분리해서 같은 시간동안 예측오류를 더 많이 최소화 시킬 수 있다.
카테고리형 피처를 원-핫 인코딩 하지 않고도 자동 변환하여 최적분할한다.
XGBoost 와 같이 병렬CPU, GPU 까지 지원하며 early stopping 기능도 가지고 있다.
댓글