본문 바로가기
Study/ML

7. 앙상블(Ensemble) - 부스팅(Boosting)

by 까망우동 2023. 5. 28.
반응형

Index

     

    1. Boosting 앙상블 개요 

    • 이번 포스팅에 다룰 내용은 "부스팅(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 활용코드는 사이킷런 래퍼기준. 
      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)

     

    반응형

    댓글