반응형
Index
1. Boosting 앙상블 개요
- 이번 포스팅에 다룰 내용은 "부스팅(Boosting)" 앙상블이다. 부스팅은 이전에 정리한 Voting, Bagging 앙상블과는 다르게 순서를 가진다. 부스팅 모델은 여러개의 약한모델(weak learner)을 순차적으로 학습하면서, 잘못 예측한 데이터에 가중치를 부여해 오류를 개선해나가는 모델이다.
- 부스팅 모델에 가장 대표적인 방식이 ADA Boost (Adaptive Boosting), GBM (Gradient Boosting Method)인데 이번 포스팅에는 GBM 부류의 모델들에 대해 정리하겠다. (ADA 는 틀린 데이터셋에 대해 가중치를 줘가며 오답을 줄이려는 방향이고, GBM 은 모델의 전체 손실함수를 최소화 하는 방향으로 GBM 이 좀더 유연하다)
- 부스팅도 배깅과 마찬가지로 여러개의 동일한 결정트리 모델을 조합한다 (↔보팅은 다른 종류의 모델 조합). 다만, 배깅 대비 통상적으로 성능이 더 좋지만, 계산속도가 오래걸리는 단점이 있다.
2. GBM (Gradient Boosting Machine)
- 가중치 업데이트에 Gradient Descent (경사하강법), 즉 잔차를 Gradient를 통해 최소화 하는 방법이다. 첫번째 트리에서 생긴 잔차 데이터를 가지고 두번째 트리를 그리고, 두번째 트리결과의 잔차로 세번째 트리를 그리는 방식
- 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 활용코드는 사이킷런 래퍼기준.
from xgboost import XGBClassifier
# XGBoost 로 학습 기본
xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.05, max_depth=3)
xgb_wrapper.fit(X_train, y_train)
w_preds = xgb_wrapper.predict(X_test)
# XGBoost 의 교차검증을 통한 early stopping 기능 활용하기
# eval_set[(1),(2)] 은 (1)으로 학습을 하고 (2)로 검증을 하라는 뜻
evals = [(X_tr,y_tr),(X_val,y_val)]
xgb_wrapper.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric="logloss",
eval_set=evals, verbose=False)
ws10_preds = xgb_wrapper.predict(X_test)
- XGBoost 모델의 feature importance 시각화 (LightGBM 에서도 같은 코드로 피쳐중요도 시각화 가능하다)
from xgboost import plot_importance
import matplotlib.pyplot as plt
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 기능도 가지고 있다.
from lightgbm import LGBMClassifier
lgbm_wrapper = LGBMClassifier(n_estimators=400, learning_rate=0.05)
# LightGBM도 XGBoost와 동일하게 조기 중단 수행 가능.
evals = [(X_val, y_val)]
lgbm_wrapper.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric="logloss", eval_set=evals, verbose=True)
preds = lgbm_wrapper.predict(X_test)
반응형
'Study > ML' 카테고리의 다른 글
8. 베이지안 최적화(Bayesian Optimization) (0) | 2023.05.30 |
---|---|
지니계수 (0) | 2023.05.28 |
6. 앙상블(Ensemble) - 보팅(Voting),배깅(Bagging) (0) | 2023.05.28 |
5. 분류(Classification) - Decision Tree (0) | 2023.05.27 |
4. 성능 평가 (Evaluation) - Classification 평가방법 (0) | 2023.05.27 |
댓글