부스팅 알고리즘이란?
여러 개의 약한 학습기(weak learner)를 순차적으로 학습 -> 예측을 하면서 잘못 예측한 데이터에 가중치를 부여해서 오류를 개선하면서 나아가는 방식입니다.
대표적인 예시로는 AdaBoost와 그래디언트 부스팅이 있습니다. AdaBoost는 오류 데이터에 가중치를 부여하면서 부스팅을 수행하는 대표적인 알고리즘입니다. 그림을 통해서 AdaBoost의 진행 방식을 정리해보도록 하겠습니다.
- Step 1에서는 점선 동그라미 표시한 ▲ 데이터가 잘못 분류된 오류 데이터입니다.
- Step 2에서는 Step 1에서의 오류 데이터에 대해서 가중치를 부여하게 됩니다. 가중치가 부여된 ▲ 데이터는 다음 약학 학습기가 더 잘 분류할 수 있게 크기가 커졌습니다.
- Step 3은 점선 동그라미 표시한 ■ 데이터가 잘못 분류된 오류 데이터입니다.
- Step 4에서는 잘못 분류된 ■ 데이터에 대해서 다음 약한 학습기가 더 잘 분류할 수 있도록 가중치를 부여하여 크기가 커졌습니다.
- Step 5 에서는 세번쨰 약한 학습기가 ▲ ,■ 를 분류하고 오류 데이터를 찾습니다. AdaBoost는 이렇게 약한 학습기가 순차적으로 오류 값에 대해 가중치를 부여한 예측 결정 기준을 모두 결합해서 예측을 수행하게 됩니다.
※ 마지막으로 약학 학습기를 모두 결합하여 결과를 예측하게 됩니다. 그 결과 개별 약학 학습기보다 훨씬 정확도가 높아짐을 알 수 있습니다.
GBM(Gradient Boosting Machine)도 AdaBoost와 유사하지만 가중치를 업데이트 할때 경사 하강법(Gradient Descent)을 이용하는 것이 큰! 차이 입니다.
경사 하강법(Gradient Descent): 분류의 실제 결과값을 Y, 피처를 X1, X2, ... , Xn 그리고 이 피처들에 기반한 예측 함수를 F(x) 함수라고 하면 오류식은 h(x) = y - F(x)라고 할 수 있습니다. 이 오류식을 최소화하는 방향성을 가지고 반복적으로 가중치의 값을 업데이터 해나가는 방식이 경사 하강법입니다.
사이킷런에서는 GradientBoostingClassifier클래스를 제공하여 GBM 기반의 분류를 실행할 수 있게 해줍니다. 마찬가지로 사용자 행동 데이터 세트를 통해 예측 분류를 해보도록 하겠습니다.
In
from sklearn.ensemble import GradientBoostingClassifier
import time
import warnings
warnings.filterwarnings('ignore')
필요한 모듈을 로딩하여 줍니다.
x_train, x_test, y_train, y_test = human_dataset()
▷ 이번 예제에서는 GBM으로 학습하는 시간을 한번 측정해보도록 하겠습니다.
In
# 시작 시간 설정하기
start_time = time.time()
gb = GradientBoostingClassifier(random_state=0)
gb.fit(x_train, y_train)
pred = gb.predict(x_test)
gb_accuracy = accuracy_score(y_test,pred)
# 시작 시간 설정하기
start_time = time.time()
gb = GradientBoostingClassifier(random_state=0)
gb.fit(x_train, y_train)
pred = gb.predict(x_test)
gb_accuracy = accuracy_score(y_test,pred)
Out
저의 컴퓨터에서는 225.2초 정도 걸렸습니다. 정확도는 랜덤 포레스트보다 나은 결과가 나왔습니다. 하지만 수행 시간이 오래 걸리는 것이 단점인것 같습니다ㅠㅠ 수행 시간의 관한 문제는 GBM 이 극복해야 될 중요한 과제 중 하나라고 합니다!! GBM 화이팅!! 파라미터를 조정하며 나아가는 노력도 필요할것 같습니다.
GBM 하이퍼 파라미터
GBM의 하이퍼 파라미터에 대해서 알아보도록 하겠습니다.
- loss: 경사 하강법에서 사용할 비용 함수를 지정하여 줍니다.
- learning_rate: GBM이 학습을 진행할 때마다 적용하는 학습률입니다. 0~1사이의 값으로 지정하며 디폴트 값은 0.1입니다. 이 값을 너무 작게 설정하면 모든 Weak learner가 반복이 완료되어도 최소 오류값을 찾지 못할수도 있습니다. 또 큰 값을 설정하면 최소 오류값을 찾지 못하고 지나쳐 버려서 예측 성능이 떨어지지만 빠른 수행이 가능합니다. 그렇기 때문에 n_estimators 값과 조합하여 보완해 나가며 사용한다고 합니다.
- n_estimators: weak learner의 개수입니다. 개수가 많을수록 예측 성능이 일정 수준까지는 좋아지지만 수행 시간이 오래 걸리게 됩니다.
- subsample: weak learner가 학습에 사용하게 되는 데이터의 샘플이 비율입니다. 기본값을 1로 전체 학습 데이터를 기반으로 학습하겠다는 의미입니다.
In
from sklearn.model_selection import GridSearchCV
params = {
'n_estimators':[100,50],
'learning_rate':[0.05,0.1]
}
grid_cv= GridSearchCV(gb, param_grid= params , cv=2, verbose=1)
grid_cv.fit(x_train, y_train)
시간이 오래 걸리기 때문에 간략하게 n_estimators를 100, 500으로 learning_rate를 0.05, 0.1로 설정하도록 하겠습니다.
out
최적 하이퍼 파리미터는 n_estimators가 500, learning_rate가 0.05일때로 나왔습니다. 최고 예측 정확도는 약 90%정도 나왔습니다. 이 파라미터를 가지고 테스트 데이터 세트에 적용을 하여 예측 정확도를 알아보겠습니다.
In
pred = grid_cv.best_estimator_.predict(x_test)
gb_accuracy = accuracy_score(y_test,pred)
print('GBM 정확도:{0:4f}'.format(gb_accuracy))
Out
테스트 데이터 세트에서는 약 94%정도가 나온것을 확인하였습니다. GBM은 과적합에 뛰어난 예측 성능을 가지지만 수행 시간이 오래 걸리는 단점이 있습니다. GBM을 기반으로 하는 많은 부스팅 기반의 알고리즘이 나오고 있는데 다음 포스팅에서는 그 종류들에 대해서 알아보도록 하겠습니다.
Reference
'Machine Learning' 카테고리의 다른 글
XGBoost 실습 - 파이썬 래퍼 - (0) | 2020.04.27 |
---|---|
XGBoost(eXtra Gradient Boost) (0) | 2020.04.26 |
랜덤 포레스트(Random forest) (0) | 2020.04.26 |
앙!상블 (0) | 2020.04.21 |
결정 트리 실습(사용자 행동 인식 데이터) (0) | 2020.04.19 |