부스팅
부스팅은 머신러닝 앙상블 기법 중 하나로 약한 학습기를 순차적으로 결합하여 예측/분류 성능을 높이는 알고리즘이다.
위의 데이터처럼 모델링을 진행하면서 가중치를 업데이트하며 순차적으로 학습시키는 방식이다.
부스팅 알고리즘에 여러 개의 모델(알고리즘)이 있는데 각기 다른 특징을 가지고 있다.
1. AdaBoost
AdaBoost는 Adaptive Boosting의 약자로 오류 데이터에 가중치를 가하여 더하는 방식이다.
분류하기 어려운 것들에는 가중치를 더하고, 분류하기 쉬운 것들에는 가중치를 줄이면서 가중치를 업데이트한다. 이때 약한 학습기 즉 각각의 분류기는 Decision Tree를 약한 학습기로 사용한다.
그림으로 보면, 첫 번째 반복에서 잘못학습된 것들은 두 번째 반복에서 가중치가 커진 것(모양이 커짐)으로 표현하였고, 반복 3에서 틀린 것(-)도 가중치를 증가시킨 다음 각 가중치들을 결합하여 최종 모델을 생성하여 예측한다.
참고
2. Gradient Boosting Machine(GBM)
GBM은 Adaboost와 유사하게 이전까지의 오차를 보정하는 방식으로 학습을 하여 예측기를 순차적으로 학습시킨다.
그런데 Adaboost처럼 매 반복마다 샘플의 가중치를 조정하는 것이 아니라, 이전 예측기가 만든 잔여오차(Residual Error)를 예측하는 방식으로 다음 예측기를 학습시킨다. 여기서 residual error이 Gradient descent의 loss와 동일하다.
위의 말을 쉽게 적어보자면, 모델 A를 이용하여 $y$를 $y_1$이라 예측했을 때 다음 모델 B는 y가 아닌 $y-y_1$을 예측하는 방식으로 학습된다. 마지막에 이 A, B 모델을 합쳐 y를 예측한다. 그러나 이러한 방식은 과적합을 유발할 수도 있다.
따라서 과적합을 보정하기 위해서 learning rate라고 하는 숫자를 이전 학습기의 결과에 곱해주게 된다.
참고
XGBoost
GBM은 train데이터의 residual만을 줄이기 위해서 학습하다 보니까 과적합의 문제가 있었으며 속도도 느리다는 단점이 있다. 이러한 단점을 보완한 모델이 eXtreme Gradient Boosting, XGBoost이다.
동일한 Gradient descent방식을 이용하지만 하드웨어 최적화(분산, 병렬처리)를 통해서 더 빠르고, 과적합 방지를 위한 Regularization이 있으며 분류와 회귀 모두가 가능한 모델이 XGBoost이다. 또한 c++로 구현이 되어있어 빠르다.
LightGBM
LightGBM, LGBM은 이름에서도 느껴지듯이 가볍고 빠른 알고리즘이다.
이 모델의 가장 큰 차이점은 다른 트리기반 모델들은 모두 level-wise방식으로 트리를 확장해 나가는데, lgbm의 경우는 leaf-wise방식으로 트리를 확장해 나간다.
간단하게 설명하자면, level wise는 같은 level에 있는 노드들을 모두 split 한 다음 level로 넘어감, 그러나 너무 깊어지면 overfitting이 되기 때문에 기존에는 max depth를 제한하면서 사용해 왔음. lgbm은 level wise나 leaf wise나 최적을 만들게 되면 비슷하다는 생각을 가지고 시작.
이런 방식을 사용하면 빠른 속도(xgboost의 1.5배 정도)로 학습을 하면서 손실을 최소화(메모리사용량) 할 수 있지만, 데이터가 적을 경우(10000개 이하-공식문서기준) 과적합이 된다.
-> 특정 레벨의 다른 노드들을 전부 분할시키지 않고 residual이 큰 노드만 계속하여 쪼갬.
->학습에 도움 되는 노드만 계속 쪼갬.
이러한 lgbm은 파라미터 종류도 100여 가지가 되기 때문에 튜닝이 어렵지만, 튜닝만 잘한다면 강력한 모델이다.
중요한 하이퍼 파라미터들은 아래와 같다.
보통 아래와 같은 기준으로 파라미터를 튜닝한다.
[더 높은 정확도]
- `max_bin`을 크게
- `n_estimators` 크게
- `learning_rate` 작게
- `num_leaves` 크게
- `boosting` 을 'dart' 사용
[과적합을 줄이기]
- `max_bin` 작게
- `num_leaves` 작게
- `min_data_in_leaf` 크게
`max_depth` : Tree의 최대 깊이로 feature이 많으면 크게 설정해도 된다. 모델이 과적합될거 같으면 max_depth를 줄이면 된다.
`learning_rate` : 최종 결과에 대한 각각의 Tree가 영향을 미치는 정도. 0.01 ~ 0.1 정도로 설정하고 다른 파라미터들을 튜닝한 후 추후에 성능을 높일 때 learning_rete를 높인다.
`n_estimators`: 생성할 약한 학습기의 개 -> 너무 크면 과적합
`feature_fraction`: feature fraction이 1보다 작다면 매 iteration(tree)마다 다른 feature를 랜덤 하게 추출하여 학습하게 된다. 만약 0.8로 값을 설정하면 매 tree를 구성할 때, feature의 80%만 랜덤 하게 선택한다. 과적합을 방지하기 위해 사용할 수 있으며 학습 속도가 향상된다.
`device` : 디폴트 값=cpu, gpu로 변경가능
`num_leaves` : 하나의 Tree가 가질 수 있는 최대 leave 수이고, 디폴트값은 31입니다.
`min_data_in_leaf`: 한 리프의 최소 데이터 수(클수록 과적합 방지)
`reg_alpha/reg_lambda`: L1, L2 정규화
`boosting`: gbdt / rf / dart / goss 등이 있다.
'ML & DL > 개념정리' 카테고리의 다른 글
분류와 회귀 (0) | 2023.12.11 |
---|---|
Evaluation metric (평가 지표) (1) | 2023.12.11 |
Clustering: 클러스터링 (0) | 2023.11.28 |
머신러닝 기초 (0) | 2023.11.24 |
데이터사이언스 시작 (0) | 2023.11.24 |