XGBoost

이승수·2021년 9월 6일
0

Boosting(xgboost for gradient boosting)

  • 트리를 깊게 학습시키면 과적합을 일으키기 때문에 배깅(랜덤포레스트)이나 부스팅 앙상블 모델을 사용해 과적합을 피해야한다
  • 랜덤포레스트의 장점은 하이퍼파라미터에 상대적으로 덜 민감하다는 것
  • 그래디언트 부스팅의 경우 하이퍼파라미터 셋팅에 따라 랜덤포레스트보다 더 좋은 예측 가능

※ Boosting과 Bagging의 차이점
그래디언트 부스팅 / 랜덤포레스트– 둘 다 앙상블 모델이지만 트리를 만드는 방법이 다름

  • 부스팅 : 만들어지는 트리가 이전에 만들어진 트리에 영향을 받는다

  • 랜덤포레스트 : 각 트리를 독립적으로 만든다

  • 부스팅 알고리즘 중 AdaBoost는 각 트리(weak learners)가 만들어질 때 잘못 분류되는 관측치에 가중치를 준다(잘못 분류된 것을 더 신경쓴다의 의미)

  • 다음 트리가 만들어질 때 이전에 잘못 분류된 관측치가 더 많이 샘플링되게 하여 그 관측치를 분류하는데 더 초점을 맞춘다


AdaBoost


AdaBoost 알고리즘 예시

  1. 모든 관측치에 대해 가중치를 동일하게 설정
  2. 관측치를 복원추출 하여 약한 학습기 Dn을 학습하고 +, - 분류
  3. 잘못 분류된 관측치에 가중치를 부여해 다음 과정에서 샘플링이 잘되도록 한다
  4. step 2, 3을 n회 반복 ex) n = 3
  5. 분류기들 ex) D1, D2, D3 을 결합하여 최종 예측 수행

Gradient Boosting

첫번째 기본트리에서 예측한 후 다음트리에서 첫번째의 잔차(오류)를 타겟으로 하여 예측

그래디언트 부스팅 (회귀 / 분류 문제 모두 사용가능)

  • AdaBoost와 유사하지만 비용함수(Loss function)을 최적화하는 방법이 다르다
  • 샘플의 가중치를 조정하는 대신 잔차(residual)을 학습
  • 이것은 잔차가 더 큰 데이터를 더 학습하도록 만드는 효과
from xgboost import XGBClassifier

model = XGBClassifier(
    n_estimators=1000,  # early stopping 에 따라 조절
    max_depth=7,        
    learning_rate=0.2,
    n_jobs=-1
)
# 인코더와 분류모델 분리
eval_set = [(X_train_encoded, y_train), 
            (X_val_encoded, y_val)]
# early stopping
model.fit(X_train_encoded, y_train, 
          eval_set=eval_set,
          eval_metric='error', 
          early_stopping_rounds=50  #50번 동안 스코어의 개선이 없으면 멈춤
         ) 

※ XGBoost parameter

  • learning_rate (높을경우 과적합 위험)
  • max_depth (낮은값에서 증가시키며 튜닝, 너무 깊어지면 과적합위험, -1 설정시 제한 없이 분기, 특성이 많을 수록 깊게 설정)
  • n_estimators (너무 크게 주면 긴 학습시간, early_stopping_rounds와 같이 사용)
  • scale_pos_weight (imbalanced 문제인 경우 적용시도)
profile
AI/Data Science

0개의 댓글

관련 채용 정보