●부스팅은 여러 개의 약한 학습기(weak learner)를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식
●부스팅의 대표적인 구현은 AdaBoost(Adaptive boosing)와 그래디언트 부스트가 있음
<AdaBoost>
오류 데이터에 가중치를 부여하면서 부스팅을 수행하는 대표적인 알고리즘
맨 왼쪽 그림과 같이 +와 -로 된 피처 데이터 세트가 있다면
●step 1: 첫 번째 약한 학습기가 분류 기준 1로 +와 -를 분류한 것이다. 오른쪽에 + 데이터는 잘못 분류된 오류 데이터이다.
●step 2: 이 오류 데이터에는 다음 약한 학습기가 잘 분류할 수 있게 가중치 값을 부여한다.
●step 3: 두 번째 약한 학습기가 분류 기준 2로 +와 -를 분류하고, 왼쪽의 -는 잘못 분류된 오류 데이터이다.
●step 4: 이 오류 데이터에는 다음 약한 학습기가 잘 분류할 수 있게 가중치 값을 부여한다.
●step 5: 세 번째 약한 학습기가 분류 기준 3으로 +와 -를 분류하고 오류 데이터를 찾는다. 에이다 부스트는 이렇게 약한 학습기가 순차적으로 오류 값에 대해 가중치를 부여한 예측 결정 기준을 모두 결합해 예측을 수행한다.
●마지막은 모든 약한 학습기를 결합한 결과 예측이다. 하나의 약한 학습기들보다 훨씬 정확도가 올라갔다.
<GBM(Gradient Boost Machine)>
GBM도 에이다부스트와 유사하나, 가중치 업데이트를 경사 하강법(Gradient Descent)을 이용하는 것이 큰 차이이다.
오류 값은 실제값-예측값이다. 분류의 실제 결과값을 y, 피처를 x1, x2, ..., xn 그리고 이 피처에 기반한 예측 함수를 F(x) 함수라고 하면 오류식 h(x) = y - F(x)를 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트하는 것이 경사 하강법(Gradient Descent)이다.
경사 하강법은 반복 수행을 통해 오류를 최소화할 수 있도록 가중치의 업데이트 값을 도출하는 기법으로서 머신러닝에서 중요한 기법 중 하나이다.
<GBM 하이퍼 파라미터>
사이킷런은 GBM 분류를 위해 GradientBoostingClassifier 클래스를 제공한다.(회귀의 경우 GradientBoostingRegressor)
n_estimators, max_features, max_depth, min_samples_leaf, min_samples_split과 같은 트리 기반의 자체의 파라미터는 결정트리, 랜덤 포레스트에서 이미 소개했으므로 생략하고 나머지 다르 파라미터에 대해 설명하겠다.
●loss: 경사 하강법에서 사용할 비용 함수를 지정한다. 특별한 이유가 없으면 default인 'deviance'를 그대로 적용한다.
●learning_rate: GBM이 학습을 진행할 때마다 적용하는 학습률이다. weak learner가 순차적으로 오류값을 보정해 나가는 데 적용하는 계수이다.('하강하는 보폭' 이라고 생각)
→0~1 사이의 값을 지정할 수 있으며 기본값은 0.1이다. 너무 작은 값을 적용하면 업데이트 되는 값이 작아져서 최소 오류 값을 찾아 예측 성능이 높아질 가능성이 높지만 많은 weak learner는 순차적인 반복이 필요해서 수행 시간이 오래 걸리고, 모든 weak learner의 반복이 완료되어도 최소 오류 값을 찾지 못할 수 있다. 반대로 큰 값을 적용하면 최소 오류 값을 찾지 못하고 그냥 지나쳐 버려 예측 성능이 떨어질 가능성이 있지만 빠른 수행이 가능하다. 이러한 특성때문에 learning_rate는 n_estimators와 상호 보완적으로 조합해 사용하는데 작은 learning_rate를 사용하고 n_estimator를 크게 하면 최고의 성능을 보일 수 있는 지점까지 학습이 가능하겠지만 수행 시간이 너무 오래 걸리고 예측 성능도 들이는 시간 만큼 현격하게 좋아지지는 않는다.
●n_estimators: weak learner의 개수이다. weak learner가 순차적으로 오류를 보정하므로 개수가 많을수록 예측 성능이 일정 수준까지는 좋아질 수 있다. 하지만 개수가 많을수록 수행 시간이 오래 걸린다. default는 100이다.
●subsample: weak learner가 학습에 사용하는 데이터의 샘플링 비율이다. default는 1이며, 이는 전체 학습 데이터를 기반으로 학습한다는 의미이다(0.5이면 학습 데이터의 50%). 과적합이 염려되는 경우 subsample을 1보다 작은 값으로 설정한다.
마찬가지로 사용자 행동 인식 데이터 세트를 GradientBoostingClassifier를 이용해 예측해 보자. 그리고 GBM으로 학습하는 시간이 얼마나 걸리는지 수행 시간도 같이 측정해본다.
재 수행 할 때마다 동일한 예측 결과를 출력하기 위해 RandomForestClassifier의 random_state는 0으로 설정한다.
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score
import time
import warnings
warnings.filterwarnings('ignore')
X_train, X_test, y_train, y_test = get_human_dataset()
# GBM 수행 시간 측정을 위함. 시작 시간 설정
start_time = time.time()
gb_clf = GradientBoostingClassifier(random_state=0)
gb_clf.fit(X_train, y_train)
gb_pred = gb_clf.predict(X_test)
gb_accuracy = accuracy_score(y_test, gb_pred)
print('GBM 정확도:{0:.4f}'.format(gb_accuracy))
print('GBM 수행 시간:{0:.1f}초'.format(time.time() - start_time))
default 하이퍼 파라미터만으로 93.89%의 정확도가 나왔다. GBM은 수행 시간이 오래 걸리기 때문에 이 문제는 GBM이 극복해야 할 중요한 과제이다.
*수행 시간이 오래 걸리는 이유: 사이킷런의 GBM은 약한 학습기의 순차적인 예측 오류 보정을 통해 학습을 수행하므로 멀티 CPU 코어 시스템을 사용하더라도 병렬 처리가 지원되지 않아서 대용량 데이터의 경우 학습에 매우 많은 시간이 필요하다.
이번에는 GridSearchCV를 이용하여 하이퍼 파라미터 튜닝을 해보겠다.(시간이 너무 오래 걸리는 관계로 결과는 스크래핑)
from sklearn.model_selection import GridSearchCV
params = {
'n_estimators':[100, 500],
'learning_rate':[0.05, 0.1]
}
grid_cv = GridSearchCV(gb_clf, param_grid=params, cv=2)
grid_cv.fit(X_train, y_train)
print('최적 하이퍼 파라미터:\n', grid_cv.best_params_)
print('최고 예측 정확도:{0:.4f}'.format(grid_cv.best_score_))
최적 하이퍼 파라미터:
{'n_estimaotrs':500, 'learning_rate':0.05}
최고 예측 정확도:0.9013
검증용 데이터 세트에서 예측 성능이 90.13%의 정확도가 나왔고 해당 하이퍼 파라미터로 테스트 데이터 세트에도 적용하여 성능을 확인해보자.
# GridSearchCV를 이용하여 최적으로 학습된 estimator로 predict 수행
gb_pred = grid_cv.best_estimator_.predict(X_test)
gb_accuracy = accuracy_score(y_test, gb_pred)
print('GBM 정확도:{0:.4f}'.format(gb_accuracy))
GBM 정확도: 0.9396
GBM은 과적합에도 강한 뛰어난 예측 성능을 가진 알고리즘이며 수행 시간이 오래걸린다는 단점이 존재한다.
따라서 GBM의 단점을 보완하면서 GBM을 기반한 알고리즘들이 새롭게 만들어지고 있다. 그 중 XGBoost와 LightGBM이 가장 많이 사용되고 있는데 이 두개에 대한 정리는 다음 글에서 소개한다!
'파이썬 머신러닝 완벽가이드 > [4장] 분류' 카테고리의 다른 글
XGBoost(eXtra Gradient Boost) (2) (0) | 2023.02.14 |
---|---|
XGBoost(eXtra Gradient Boost) (1) (0) | 2023.02.12 |
배깅 (0) | 2023.02.09 |
앙상블 학습 (0) | 2023.02.09 |
결정 트리 실습 - 사용자 행동 인식 데이터 세트 (0) | 2023.02.09 |