데이터 청년 캠퍼스/분류(결정트리, 앙상블)
[분류] 앙상블 기법 - Boosting(Adaboost)
뚱뚜루뚱
2022. 7. 13. 11:53
GBM (Gradient Boosting Machine)
오류는 예측값과 실제값의 차이를 의미하며, 부스팅 기법은 각각 오분류 데이터를 다음 모델에 어떻게 반영할 것인가의 차이를 가지고 있다. GBM 기법은 이전 모델의 오류(잔차, Residual)을 예측하는 새로운 모델을 생성한다.
과적합을 방지하기 위해 예측 과정에서 잔차에 학습률 Learning Rate을 곱한다. 좋은 예측을 위해 작은 스텝을 진행하며, 정해진 iteration 횟수에 도달하거나 더 이상 residual이 작아지지 않을 때까지 반복한다.
Predicted Value = Initial Tree Value + (Learning Rate * 1st Residual Predict Tree)
+ (Learning Rate * 2nd Residual Predict Tree) + ...
GradientBoostingClassifier 주요인자
- loss: {'deciance', 'exponential'} default='deviance
- learning_rate: float, default=0.1 # 오류값 보정 속도. 값이 작으면 예측 성능이 높아질 가능성이 높으나 학습 시간이 오래 걸리고, 너무 작으면 weak learner의 반복으로 완료되어도 최소 오류값을 찾지 못할 수 있다. 값이 크면 최소 오류값을 찾지 못하고 그냥 지나쳐 예측 성능이 떨어질 가능성이 높으나 학습 속도가 빠르다.
- n_estimators: int, default=100 # 값이 클수록 예측 성능이 일정 수준까지 높아질 가능성이 있으나 학습 시간이 오래 걸림
- subsample: float, default=1.0 # Weak Learner가 학습에 사용할 데이터의 샘플링 비율. 과적합이 우려되는 경우 1보다 작은 값으로 설정
Boosting 알고리즘의 종류
AdaBoost | 다수결을 통한 정답 분류 및 오답에 가중치 부여 |
GBM | Loss Function의 gradient를 통해 오답에 가중치 부여 |
XgBoost | GMB 대비 성능향상 시스템 자원(CPU, Mem) 효율적 사용 Kaggle을 통한 성능 검증 |
Light GBM | Xgboost 대비 성능향상 및 자원소모 최소화 Xgboost가 처리하지 못하는 대용량 데이터 학습 가능 근사치 분할 Approximates the Split을 통한 성능 향상 |
Random Forest(Bagging)과 GBM(Boosting) 방법 비교
Random Forest(Bagging) | GBM (Boosting) | |
장점 | 모델 해석력 우수 파라미터 최적화를 많이 하지 않아도 훌륭한 성능 보장 병렬 처리가 가능해 학습시간이 상대적으로 짧음 과적합 방지 |
지도 학습에서 가장 강력하고 널리 사용되는 모델 중 하나로 성능이 가장 우수 과적합 방지 파라미터 최적화시, 매우 훌륭한 성능 |
단점 | Boosting 대비 성능이 안 좋음 메모리 사용량 높음 |
파라미터 최적화 필수.미 최적화시 성능보장X 병렬 처리가 어려워 학습 시간이 김 Outlier에 취약해 데이터 전처리 필수 |
AdaBoost와 GBM 실습(지난 실습에 이어서 진행)
from sklearn.ensemble import AdaBoostClassifier, GradientBoostingClassifier
# AdaBoost
ada = AdaBoostClassifier()
ada_params = {
'n_estimators': [100, 200],
'learning_rate': [0.1, 0.5, 1]
}
grid_ada = GridSearchCV(ada, ada_params, cv=5)
grid_ada.fit(X_train, y_train)
grid_ada.best_params_
grid_ada.score(X_test, y_test)
# GBM
gbm = GradientBoostingClassifier()
gbm_params = {
'n_estimators': [100, 200],
'learning_rate': [0.01, 0.1],
'max_depth': [3,5]
}
grid_gbm = GridSearchCV(gbm, gbm_params, cv=5)
grid_gbm.fit(X_train, y_train)
grid_gbm.best_params_
grid_gbm.score(X_test, y_test)
XGBoost (eXtreme Gradient Boost)
GBM 기반 구현으로 업그레이드된 버전. GBM과 비슷한 방식으로 작동하지만 트리 생성 방법이 조금 다르다. 핵심 라이브러리는 C/C++로 구현되며 패키지명은 xgboost이다. 초기에는 scikit-learn과 호환되지 않아 scikit-learn에서 제공해주는 다양한 유틸리티 기능과 함께 사용할 수 없었지만, 지금은 연동 가능한 Wrapper Class를 제공하며 클래스명은 XGBClassifier, XGBRegressor이다.
주요 장점
뛰어난 예측 성능 | 분류와 회귀 영역에서 뛰어난 예측 성능 발휘 |
GBM 대비 빠른 수행 시간 | 일반적인 GBM은 순차적으로 weak learner가 가중치를 증감하는 방법으로 학습하기에 병렬 수행이 불가능하여 학습속도가 느리다 XGBoost는 병렬 수행 및 다양한 기능으로 빠른 학습 성능을 보장한다. GBM 대비 빠른 것으로, 결정트리나 랜덤포레스트 등 타 ML 알고리즘에 비해서는 느리다 |
과적합 규제 | |
나무 가지치기 Tree Pruning | 일반적인 GBM은 분할 시 부정 손실이 발생하면 분할을 수행하지 않는다. (부정손실: 트리를 분할하면 엔트로피나 지니지수와 같은 정보이득이 줄어드는 것) XGBoost는 max_depth까지 진행한 뒤 loss function에서 개선이 일정 threshold에 미치지 못할 경우까지 역방향으로 pruning 과정을 수행한다 |
자체 내장된 교차 검증 | 반복 수행 시마다 내부적으로 교차검증을 수행 조기 중단 기능 있음: 지정된 반복 횟수가 아니라 교차검증을 통해 최적화되면 반복을 멈춘다 |
결손값 자체 처리 | |
GPU 지원 | CUDA-capable GPU 지원 |
분산 처리 지원 | Yarn, Kubernetes, Spark 등 기반으로 분산 처리 지원 |
일반 파라미터
booster[gbtree] | 모델의 종류 gbtree: tree-based models gblinear: linear models |
silent[0] | 메시지 출력 여부. If silent=1, 로그 출력X |
nthread[CPU의 전체 스레드 사용] | CPU 실행 스레드 개수로 병렬 처리를 위한 인자 미설정 시 자동으로 시스템에서 사용할 수 있는 최대 CPU 사용 전체 CPU를 사용하지 않고 일부만 사용해 ML 애플리케이션 구동 시 변경 |
부스터 파라미터
learning_rate(eta) [default=0.3] | learning rate와 동일. 각 스텝별로 weight를 감소시키는 정도로 클수록 빠르게 감소한다. 0과 1사이의 값을 지정 가능하며 일반적으로 [0.01, 0.2] 정도로 설정 |
min_child_weight [default=1] | Child의 weights 최소 합으로 더 높은 값을 설정할수록 과적합을 방지한다. 단 너무 높은 값으로 설정하면 underfitting이 발생 |
max_depth [default=6] | 트리의 최대 Depth로 일반적으로 [3, 10] |
min_split_loss(gamma) [default=0] | 트리의 리프 노드를 추가적으로 확장할 것인지 결정할 최소 손실 감소 값으로 값이 클수록 과적합을 방지한다. 트리를 분할할 때 얻는 이득(Gain) - gamma 값이 0보다 작으면 분할X |
sub_sample(subsample) [default=1] | 트리 확장 시 고려되는 샘플의 비율로 값을 낮추면 과적합을 방지할 수 있다. 너무 낮은 값은 underfitting을 유발할 가능성이 있다 |
colsample_bytree [default=1] | Max_features와 동일하며 보통 0.5 ~ 1로 설정 |
reg_lambda(lambda) [default=1] | L2 regularization 적용값으로 피처 개수가 많을 경우 검토한다. 과적합을 감소하는 효과가 있으며 lambda 값이 커질수록 정보이득이 작아진다(정보이득 계산 시 분모에 lambda 더해짐) |
reg_alpha(alpha) [default=0] | L1 regularization 적용값으로 피처 개수가 많을 경우 검토한다. 과적합을 감소하는 효과가 있다 |
학습 파라미터
objective [default=reg:squarederror] | 손실함수 정의. 주로 이진/다중 분류 여부에 따라 선택 reg:squarederror - regression with squared error binary:logistic - logistic regression for binary classification, returns predicted probability (not class) multi:sofmax - multiclass classification using the softmax objective, returns predicted class (not probabilities) multi:softprob - same as softmax, but returns predicted probability for each data point belonging to each class |
eval_metric [default: rmse for regression error for classification] | 검증에 사용되는 함수 정의 rmse: root mean squre error mae: mean absolute error logloss: negative log-likelihood error: binary classification error rate (0.5 threshold) merror: multiclass classification error rate mlogloss: multiclass logloss auc: area under the curve |
seed [default=0] | 랜덤 값 생성을 위한 seed 값 |
과적합 개선 방안
- learning_rate값은 낮춤과 함께 n_estimators는 높여줌
- max_depth 값을 낮춤
- min_child_weight 값을 높임
- min_split_loss 값을 높임
- sub_sample 값을 줄임
- colsample_bytree 값을 줄임
XGBoost 실습
# XGBoost 설치
!pip install xgboost
import xgboostfrom xgboost import XGBClassifier
xgb_clf = XGBClassifier(n_estimators=300, learning_rate=0.1, max_depth=5, use_label_encoder=False)
xgb_clf.fit(X_train, y_train, eval_metric='logloss')
xgb_clf.score(X_test, y_test)
# early-stopping
eval_data = [(X_test, y_test)] #early-stopping을 위한 평가 데이터셋
xgb_clf.fit(X_train, y_train, eval_metric='logloss', early_stopping_rounds=100, eval_set=eval_data)
from xgboost import plot_importance
pd.DataFrame(xgb_clf.feature_importances_, columns=['importance'], index=cancer.feature_names)
plot_importance(xgb_clf)