부스팅 알고리즘(boost)은 여러 개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식이다. 앙상블 알고리즘의 한 종류다.
대표적인 구현은 그래디언트 부스팅과 에이다부스트가 있다.
먼저 에이다 부스트를 학습하는 방식은 책 p223 에 나와있다.
간단히 에이다 부스트는 약한 학습기가 순차적으로 오류 값에 대해 가중치를 부여한 예측 결정 기준을 모두 결합해 예측을 수행한다. 또, 하나의 feature를 사용해서 데이터를 분류한뒤 지니계수를 통해 가중치를 업데이트한다. 사용하는 공식은 대표적으로 amount of say 다.
GBM은 에이다 부스트와 유사하나, 가중치 업데이트를 경사 하강법을 이용하는 것이 큰 차이다. 이 방법은 분류와 회귀 모두 가능하다.
사이킷런에서는 GradientBoostingClassifier 분류 클래스를 제공한다.
이번에는 GBM을 이용해 사용자 행동 데이터 세트를 예측 분류해 보겠다.
•
time.time()은 현재 시간을 반환해준다.
from sklearn.ensemble import GradientBoostingClassifier
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))
'''
GBM 정확도 : 0.9389
GBM 수행 시간 : 861.4 초
'''
Python
복사
기본 하이퍼 파라미터만을 가지고 앞의 랜덤포레스트보다 나은 예측 정확도를 보인다. 일반적으로 GBM이 랜덤 포레스트(배깅)보다는 예측 성능이 조금 뛰어난 경우가 많다.
하지만, GBM은 수행 시간이 오래걸리고 파라미터 튜닝도 좀 더 필요하다. 병렬 cpu 코어 시스템도 사용하더라도 병렬 처리가 지원되지 않는다. (즉 n_jobs=-1 이 무쓸모)
GBM 하이퍼 파라미터 및 튜닝
트리 기반 자체의 파라미터(n_estimators, max_depth, max_features)는 앞에서 말했으므로 생략하겠다.
•
loss : 경사 하강법(그래디언트 부스팅)에서 사용할 비용 함수 지정 . 일반적으로 기본값인 ‘deviance’를 그대로 적용한다.
•
learning_rate : 학습을 진행할 때마다 적용하는 학습률. 0~1사이의 값. 기본값은 0.1 . 너무 작은 값은 업데이트 되는 값이 작아지는 것이기 때문에 예측 성능이 높아질 가능성이 높다. 하지만, 수행 시간이 너무 오래 걸린다. 반대로 큰 값을 적용하면 최소 오류 값을 그냥 지나쳐버릴 수도 있기 때문에 예측 성능이 떨어질 가능성이 높지만 수행시간은 빠르다. (일반적으로 0.001 ~ 0.1 사이로 설정한다)
일반적으로 n_estimators와 상호 보완적으로 사용한다. → n_estimators가 많다면 상대적으로 learning_rate는 크게 두고 n_estiamtors가 적다면 learning_rate를 작게 둔다.
•
n_estimators : weak learner 의 개수. 개수가 많아질수록 당연히 예측 성능이 좋아지기는 하지만 수행시간이 오래걸리고 큰 폭으로 향상되는 것은 아니다. default = 100
•
subsample : 학습에 사용하는 데이터 샘플링 비율. default=1 —> 학습 데이터 전체 사용. 과적합의 가능성을 확 줄이고 싶다면 1보다 작은 값으로 설정.
먼저, GirdSearchCV를 통해서 최적 하이퍼 파라미터를 찾아보겠다. 간략하게 n_estimators=100, 500으로 learning_rate = 0.05, 0.1 로 제약하겠다. 교차검증 세트도 2개로만 설정하겠다.
유의할 점은 사용자 행동 데이터 세트는 데이터 양이 방대하기 때문에 오래걸릴 것이다. 일반적으로 30분 이상걸릴 수도 있다.
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, verbose=1)
grid_cv.fit(X_train,y_train)
print('최적 하이퍼 파라미터:\n', grid_cv.best_params_)
print('최고 예측 정확도: {0:.4f}'.format(grid_cv.best_score_))
'''
최적 하이퍼 파라미터:
{'learning_rate':0.05, 'n_estimators':500}
최고 예측 정확도 : 0.9010
'''
Python
복사
이를 그대로 테스트 데이터 세트에 적용하면
# GridSearchCV를 이용해 최적으로 학습된 estimator로 예측 수행
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.9410
'''
Python
복사
GBM은 과적합에도 강한 뛰어난 예측 성능을 가진 알고리즘이다. 단, 수행시간이 오래걸린다는 단점이 있지만.