[ML] Boosting Model

박경국·2022년 1월 17일
0

Machine Learning

목록 보기
13/16
post-thumbnail

1. Boosting Model

  • 랜덤포레스트의 경우 각 트리를 독립적으로 만들지만, 부스팅은 만들어지는 트리가 이전에 만들어진 트리의 영향을 받습니다.
  • AdaBoost의 경우 트리를 만들 때 잘못 분류되는 관측치에 가중치를 주어 다음 트리에서 해당 오류를 더 잘 신경 쓸 수 있도록 합니다.
  • Gradient boost는 처음 예측값에서 더 나은 예측을 할 수 있도록 잔차를 학습하여 이전의 예측값을 조정해나갑니다.

1) AdaBoosting 알고리즘

1) 모든 관측치에 대해 가중치를 동일하게 설정하고,
2) 관측치를 복원추출하여 약한 학습기(트리)를 학습한 뒤 타겟을 분류합니다.
3) 잘못 분류된 관측치에 가중치를 부여해 다음 과정에서 샘플링이 잘되도록 합니다.
4) Step 1~2 과정을 지정한 횟수만큼 n회 반복합니다.
4) 분류기들을 결합하여 최종 예측을 수행합니다.

2) Gradient Boosting Model

  • 그래디언트 부스팅은 비용함수를 최적화하는 방법에서 AdaBoost와 차이가 있습니다.
  • 그래디언트 부스팅은 관측치에 가중치를 조정하는 대신 잔차를 학습하도록 하여 잔차가 더 큰 데이터를 더 학습하도록 만듭니다.
  • 즉 각 leaf에 예측값 대신에 예측값과 관측값의 차이인 잔차가 자리합니다.
  • 그리고 이 잔차에 최초의 예측값을 더하는 방식으로 새로운 예측값을 계산합니다.
  • 이때 잔차를 그대로 학습하면 학습 데이터에 과적합이 되기 쉽기 때문에 Learning rate를 조절하는 방식으로 잔차를 학습합니다.
  • 분류문제에서 그래디언트 부스팅은 첫 분류의 odds Probability에서 확률을 뺀 값을 잔차로 사용합니다. 이때 odds Probability는 로그 변환을 하여 사용합니다.
  • odds Probability가 0.7이라면 양성으로 판정된 샘플의 잔차는 0.3이고(1-0.7), 음성으로 판정된 샘플의 잔차는 -0.7입니다(0-0.7).

2. Modeling

1) XGBoosting

  • XGBoosting의 사용방법은 sklearn과 매우 유사합니다.
from xgboost import XGBClassifier

pipe = make_pipeline(
    OrdinalEncoder(),
    SimpleImputer(strategy='median'),
    XGBClassifier(n_estimators=200
                  , random_state=2
                  , n_jobs=-1
                  , max_depth=7
                  , learning_rate=0.2
                 )
)

pipe.fit(X_train, y_train);

2) XGBoosting Early Stopping

  • Early Stopping을 사용하여 학습 결과에 변화가 없을 때 학습을 멈출 수 있습니다. 각 트리가 연결되어 있는 Gradient Boosting의 특징을 활용한 방법입니다.
encoder = OrdinalEncoder()
X_train_encoded = encoder.fit_transform(X_train) # 학습데이터
X_val_encoded = encoder.transform(X_val) # 검증데이터

model = XGBClassifier(
    n_estimators=1000,  # <= 1000 트리로 설정했지만, early stopping 에 따라 조절됩니다.
    max_depth=7,        # default=3, high cardinality 특성을 위해 기본보다 높여 보았습니다.
    learning_rate=0.2,
    scale_pos_weight=ratio # imbalance 데이터 일 경우 비율을 적용합니다.
    n_jobs=-1
)

eval_set = [(X_train_encoded, y_train), 
            (X_val_encoded, y_val)]

model.fit(X_train_encoded, y_train, 
          eval_set=eval_set,
          eval_metric='error', # (wrong cases)/(all cases)
          early_stopping_rounds=50
         ) # 50 rounds 동안 스코어의 개선이 없으면 멈춤

3) 하이퍼파라미터

  • learning_rate : 높을 경우 과적합 위험이 있습니다.
  • Max_depth : 낮은 값에서 서서히 증가시키며 튜닝을 하면 좋습니다. 너무 깊어지면 과적합 위험이 있습니다. -1로 설정하면 제한 없이 분기합니다. 특성이 많고 high cardinality 속성이 있으면 깊게 설정합니다.
  • n_estimators : 너무 크게 설정하면 학습 시간이 길어집니다. early_stopping_rounds와 함께 사용하면 좋습니다.
  • scale_pos_weight : 타겟이 imbalanced일 경우 사용합니다.

0개의 댓글