부스팅(boosting)은 약한 학습기를 여러 개 연결하여 강한 학습기를 만드는 앙상블 방법을 말한다. 부스팅 방법에는 여러 가지가 있지만 가장 있기 있는 것은 에이다부스트(AdaBoost, adaptive boosting의 줄임말)와 그레이디언트 부스팅(gradient boosting)이다.
<에이다부스트>
이전 예측기를 보완하는 새로운 예측기를 만드는 방법은 이전 모델이 과소적합했던 훈련 샘플의 가중치를 더 높이는 것이다. 이렇게 하면 새로운 예측기는 학습하기 어려운 샘플에 점점 더 맞춰지게 된다. 이것이 에이다부스트에서 사용하는 방식이다.
에이다부스트 분류기를 만들 때 먼저 알고리즘이 기반이 되는 첫 번째 분류기(예를 들면 결정 트리)를 훈련 세트에서 훈련시키고 예측을 만든다. 그 다음에 알고리즘이 잘못 분류된 훈련 샘플의 가중치를 상대적으로 높인다. 두 번째 분류기는 업데이트된 가중치를 사용해 훈련 세트에서 훈련하고 다시 예측을 만든다. 그다음에 가중치를 업데이트 하는 식으로 계속된다.
다음 그림은 moons 데이터셋에 훈련시킨 다섯 개의 연속된 예측기의 결정 경계이다. 첫 번째 분류기가 많은 샘플을 잘못 분류해서 이 샘플들의 가중치가 높아졌다. 따라서 두 번째 분류기는 이 샘플들을 더 정확히 예측하게 된다. 오른쪽 그래프는 학습률을 반으로 낮춘 것만 빼고 똑같은 일련의 예측기이다(즉, 잘못 분류된 샘플의 가중치는 반복마다 절반 정도만 높아진다). 그림에서 볼 수 있듯이 이런 연속된 학습 기법은 경사 하강법과 비슷한 면이 있다. 경사 하강법은 비용 함수를 최소화하기 위해 한 예측기의 모델 파라미터를 조정해가는 반면 에이다부스트는 점차 더 좋아지도록 앙상블 예측기를 추가한다.
from sklearn.ensemble import AdaBoostClassifier
ada_clf=AdaBoostClassifier(
DecisionTreeClassifier(max_depth=1),n_estimators=200,
algorithm='SAMME.R',learning_rate=0.5)
ada_clf.fit(X_train,y_train)
<그레이디언트 부스팅>
그레이디언트 부스팅은 에이다부스트 처럼 앙상블에 이전까지의 오차를 보정하도록 예측기를 순차적으로 추가한다. 하지만 에이다부스트처럼 반복마다 샘플의 가중치를 수정하는 대신 이전 예측기가 만든 잔여 오차에 새로운 예측기를 학습시킨다.
결정 트리를 기반 예측기로 사용하는 간단한 회귀 문제를 풀어보자. 이를 그레이디언트 트리 부스팅(gradient tree boosting 또는 그레이디언트 부스티드 회귀 트리 gradient boosted regression tree(GBRT))라고 한다.
사이킷런의 GradientBoostingRegressor를 사용하면 GBRT 앙상블을 간단하게 훈련시킬 수 있다. 트리 수(n_estimators)와 같이 앙상블의 훈련을 제어하는 매개변수는 물론 RandomForestRegressor와 아주 비슷하게 결정 트리의 성장을 제어하는 매개변수(max_depth, min_samples_leaf)를 가지고 있다. 다음은 이전에 만든 것과 같은 앙상블을 만드는 코드이다.
from sklearn.ensemble import GradientBoostingRegressor
gbrt=GradientBoostingRegressor(max_depth=2,n_estimators=3,learning_rate=1.0)
gbrt.fit(X,y)
learning_rate 매개변수가 각 트리의 기여 정도를 조절한다. 이를 0.1처럼 낮게 설정하면 앙상블을 훈련 세트에 학습시키기 위해 많은 트리가 필요하지만 일반적으로 예측의 성능은 좋아진다. 이는 축소라고 부르는 규제방법이다.
최적의 트리 수를 찾기 위해서는 조기 종료기법을 사용할 수 있다. 간단하게 구현하면 staged_predict() 메서드를 사용한다. 이 메서드는 훈련의 각 단계(트리 하나, 트리 두개 등)에서 앙상블에 의해 만들어진 예측기를 순회하는 반복자(iterator)를 반환한다. 다음 코드는 120개의 트리로 GBRT 앙상블을 훈련시키고 최적의 트리 수를 찾기 위해 각 훈련 단계에서 검증 오차를 측정한다. 마지막의 최적의 트리 수를 사용해 새로운 GBRT 앙상블을 훈련시킨다.
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
X_train,X_val,y_train,y_val=train_test_split(X,y)
gbrt=GradientBoostingRegressor(max_depth=2,n_estimators=120)
gbrt.fit(X_train,y_train)
y_pred=gbrt.predict(X_val)
errors=[mean_squared_error(y_val,y_pred)
for y_pred in gbrt.staged_predict(X_val)]
bst_n_estimators=np.argmin(errors) + 1
gbrt_best=GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators)
gbrt_best.fit(X_train,y_train)
많은 수의 트리를 먼저 훈련시키고 최적의 수를 찾기 위해 살펴보는 대신 실제로 훈련을 중지하는 방법으로 조기 종료를 구현할 수도 있다. warm_start=True로 설정하면 사이킷런이 fit() 메서드가 호출될 때 기존 트리를 유지하고 훈련을 추가할 수 있도록 해준다. 다음 코드는 연속해서 다섯 번의 반복 동안 검증 오차가 향상되지 않으면 훈련을 멈춘다.
GradientBoostingRegressor는 각 트리가 훈련할 때 사용할 훈련 샘플의 비율을 저장할 수 있는 subsample 매개변수도 지원한다. sumsample=0.25라고 하면 각 트리는 무작위로 선택된 25%의 훈련 샘플로 학습된다. 편향이 높아지는 대신 분산이 낮아지게 된다. 또한 훈련 속도를 상당히 높인다. 이런 기법을 확률적 그레이디언트 부스팅 이라고 한다.
<XGBoost>
최적화된 그레이디언트 부스팅 구현으로 XGBoost 파이썬 라이브러리가 유명하다. XGBoost는 익스트림 그레이디언트 부스팅의 약자이다. 이 패키지의 목표는 매우 빠른 속도, 확장성, 이식성이다.
import xgboost
xgb_reg=xgboost.XGBRegressor()
xgb_reg.fit(X_train,y_train)
y_pred=xgb_reg.predict(X_val)
XGBoost는 자동 조기 종료와 같은 여러 좋은 기능도 제공한다.
xgb_reg.fit(X_train,y_train,eval_set=[(X_val,y_val)],early_stopping_rounds=2)
y_pred=xgb_reg.predict(X_val)
'Machine Learning > Advanced (hands on machine learning)' 카테고리의 다른 글
24. 차원 축소 - 차원의 저주 (0) | 2021.05.26 |
---|---|
22. 앙상블 학습과 랜덤 포레스트 - 스태킹 (0) | 2021.05.22 |
20. 앙상블 학습과 랜덤 포레스트 - 랜덤 포레스트 (0) | 2021.05.22 |
19. 앙상블 학습과 랜덤 포레스트 - 배깅과 페이스팅 (0) | 2021.05.22 |
19. 앙상블 학습과 랜덤 포레스트 - 투표 기반 분류기 (0) | 2021.05.22 |