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,
max_depth=7,
learning_rate=0.2,
scale_pos_weight=ratio
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',
early_stopping_rounds=50
)
3) 하이퍼파라미터
- learning_rate : 높을 경우 과적합 위험이 있습니다.
- Max_depth : 낮은 값에서 서서히 증가시키며 튜닝을 하면 좋습니다. 너무 깊어지면 과적합 위험이 있습니다. -1로 설정하면 제한 없이 분기합니다. 특성이 많고 high cardinality 속성이 있으면 깊게 설정합니다.
- n_estimators : 너무 크게 설정하면 학습 시간이 길어집니다. early_stopping_rounds와 함께 사용하면 좋습니다.
- scale_pos_weight : 타겟이 imbalanced일 경우 사용합니다.