안 쓰던 블로그
부스팅 알고리즘 본문
부스팅Boosting
여러 개의 약한 학습기weak learner를 순차적으로 학습, 예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가는 학습 방식
대표적으로 아래와 같은 알고리즘들이 있다
-AdaBoost(Adaptive boosting)
-Gradient Booting Machine(GBM)
-XGBoost
-LightGBM
-CatBoost
AdaBoost
1. 피처 데이터 셋에서 +와 -를 기준의 왼쪽 오른쪽으로 나누려고 한다
2. 처음에 왼쪽에 두 +를 잡을 수 있게 분류 기준을 나눔. 그랬더니 오른쪽에 +가 세 개가 빠져나오게 되었다(오류)
3. 다음 라운드에서 전에 오류였던 +세 개에 가중치를 주어 다시 기준을 나누었더니 +세 개에 +두 개까지 전부 잡아서 기준을 잡음. 그랬더니 -세 개가 +쪽에 왔다(오류)
4. -세 개에 가중치를 두었더니 다음에는 가로로 나누게 됨
5. 이제까지 했던 분류 기준들을 결합하여 최종 예측
->약한 학습기를 순차적으로 학습, 개별 학습기에 가중치를 부여하여 모두 결합함으로써 각 학습기보다 높은 정확도의 예측 결과 도출
GBM(Gradient Boost Machine)
AdaBoost와 유사하나, 가중치 업데이트를 경사하강법(Gradient Descent)를 이용하여 최적화된 결과를 얻는 알고리즘GBM은 예측 성능이 높지만 Greedy Algorithm으로 과적합이 빠르게 되고 시간이 오래 걸린다
경사하강법
분류의 실제값을 y, 피처에 기반한 예측함수를 F(x), 오류식을 h(x) = y-F(x)라고 하면(오류식: 실제값-예측값) 이 오류식을 최소화하는 방향성을 가지고 가중치 값을 업데이트
GBM의 하이퍼 파라미터
트리 관련 하이퍼 파라미터-이전 글foxtrotin.tistory.com/447과 같음
부스팅 관련 하이퍼 파라미터
loss: 경사하강법에서 사용하는 cost function을 지정
learning_rate: GBM이 학습을 진행할 때마다 적용하는 학습률. 순차적으로 오류 값을 보정해가는 데 적용하는 계수이다. 0~1사이의 값으로 기본값은 0.1이다. 너무 작은 값이면 업데이트를 너무 많이 하게 되어 꼼꼼하지만 시간이 오래 걸린다. 너무 큰 값이면 반복이 완료되었는데도 최소 오류 값을 찾지 못할 수 있지만 빠르다.
n_estimators: weak learner의 개수(생성할 트리의 개수), 역시 많을수록 성능 향상, 시간 걸림
subsample: weak learner(개별 트리)가 학습에 사용하는 데이터의 샘플링 비율(0~1)
GBM 실습
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))
정확도는 약 93%로 나쁘지는 않지만 시간이 아주 오래 걸린다
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_))
n_estimators=500, learning_rate=0.05 일 때 90.1% 정확도가 나왔다
scores_df = pd.DataFrame(grid_cv.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score',
'split0_test_score', 'split1_test_score']]
# 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))
약 94.03% 정확도가 나왔다
'머신러닝 > 머신러닝' 카테고리의 다른 글
kaggle - Santander Customer Satisfaction 예측 (0) | 2021.02.08 |
---|---|
XGBoost과 LightGBM 개요 (0) | 2021.02.07 |
배깅, 랜덤 포레스트 (0) | 2021.02.07 |
앙상블 개요, 보팅 (0) | 2021.02.07 |
결정 트리 과적합, 결정 트리 실습 (0) | 2021.01.31 |