Data Science/Machine Learning

Classification 3. 앙상블 학습(Ensemble Learning) - Boosting (1. AdaBoost, 2. GBM)

HJChung 2020. 10. 10. 09:37

권철민 강사님의 '파이썬 머신러닝 완벽 가이드'을 학습하고 정리한 것입니다. 배우는 중이라 잘못된  내용이 있을 수 있으며 계속해서 보완해 나갈 것입니다. :)) 

 

앞선 <Classification 2. 앙상블 학습(Ensemble Learning) - Voting과 Bagging> 에서 앙상블 학습의 개요와 앙상블 학습의 유형 중 voting과 bagging에 대해서 학습 한 것을 정리해 보았다. 

 

앙상블 학습의 유형에는 

1. Voting

2. Bagging - Random Forest

3. Boosting - AdaBoost, Gradient Boost, XGBoost(eXtra Gradient Boost), LightGBM(Light Gradient Boost)

4. Stacking

이런 것들이 있다. 

 

이번 포스트에서는 Boosting 에 대해서 배운 것을 정리해보고자 한다. 

 

3) Boosting

Boosting 알고리즘이란 여러 개의 weak learner를 순차적으로 학습, 예측하면서 잘못 예측한 데이터에 가중치를 부여하여 오류를 개선해 나가면서 학습하는 방식을 말한다. 다만 '순차적으로' 학습하기 때문에 수행시간이 상대적으로 길다는 단점이 있다. 

 

Boosting의 대표적인 알고리즘은 AdaBoost, Gradient Boost, XGBoost(eXtra Gradient Boost), LightGBM(Light Gradient Boost)이런 것들이 있다.

1. AdaBoost

AdaBoost의 학습/예측 프로세스

출처: 파이썬 머신러닝 완벽 가이드

  step0. +와 -로 구성된 데이터셋이있고, 이를 분류해야한다. 

  step1.  분류기준1로 해당 데이터를 나눴다. 

  step2. 오류에 해당하는 - class 로 분류된 3개의 + 데이터에 대해 가중치를 부여한다. 

  step3. 이 가중치가 반영되어서 분류기준2로 데이터가 나눠진다. 

  step4. 오류에 해당하는 + class 로 분류된 3개의 - 데이터에 대해 가중치를 부여한다. 

  step5. 이 가중치가 반영되어서 분류기준3으로 데이터가 나눠진다. 

  step6. 최종적으로는 분류기준 1, 2, 3 각각에 가중치를 부여하고 결합하여 분류가 이루어진다. 

 

sklearn AdaBoost)

class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, *, 
	n_estimators=50, learning_rate=1.0, algorithm='SAMME.R', random_state=None)

 

2. GBM(Gradient Boost Machine) 

GBM는 AdaBoost와 비슷하나 가중치 업데이트를 경사하강법(Gradient Descent) 를 이용한다는 점이 큰 차이점이다.

 

sklearn GBM)

class sklearn.ensemble.GradientBoostingClassifier(*, loss='deviance',
	learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse',
    	]min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
        max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None, 
        random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, 
        warm_start=False, presort='deprecated', validation_fraction=0.1, 
        n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0)

주요 Parameter)

 

sklearn GBM(Gradient Boost Machine) 코드)

 

 

In [1]:
import pandas as pd

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score
In [2]:
cancer_dataset = load_breast_cancer()

cancer_dataset_df = pd.DataFrame(cancer_dataset.data, columns=cancer_dataset.feature_names)
cancer_dataset_df.head()
Out[2]:
  mean radius mean texture mean perimeter mean area mean smoothness mean compactness mean concavity mean concave points mean symmetry mean fractal dimension ... worst radius worst texture worst perimeter worst area worst smoothness worst compactness worst concavity worst concave points worst symmetry worst fractal dimension
0 17.99 10.38 122.80 1001.0 0.11840 0.27760 0.3001 0.14710 0.2419 0.07871 ... 25.38 17.33 184.60 2019.0 0.1622 0.6656 0.7119 0.2654 0.4601 0.11890
1 20.57 17.77 132.90 1326.0 0.08474 0.07864 0.0869 0.07017 0.1812 0.05667 ... 24.99 23.41 158.80 1956.0 0.1238 0.1866 0.2416 0.1860 0.2750 0.08902
2 19.69 21.25 130.00 1203.0 0.10960 0.15990 0.1974 0.12790 0.2069 0.05999 ... 23.57 25.53 152.50 1709.0 0.1444 0.4245 0.4504 0.2430 0.3613 0.08758
3 11.42 20.38 77.58 386.1 0.14250 0.28390 0.2414 0.10520 0.2597 0.09744 ... 14.91 26.50 98.87 567.7 0.2098 0.8663 0.6869 0.2575 0.6638 0.17300
4 20.29 14.34 135.10 1297.0 0.10030 0.13280 0.1980 0.10430 0.1809 0.05883 ... 22.54 16.67 152.20 1575.0 0.1374 0.2050 0.4000 0.1625 0.2364 0.07678

5 rows × 30 columns

In [3]:
# dataset split
X_train, X_test, y_train, y_test = train_test_split(cancer_dataset.data, cancer_dataset.target, test_size=0.2, random_state=121)
In [4]:
boosting_gbm_ensemble = GradientBoostingClassifier()

boosting_gbm_ensemble.fit(X_train, y_train)
y_pred = boosting_gbm_ensemble.predict(X_test)

print("boosting GBM 분류기 정확도 {0:.4f}".format(accuracy_score(y_test, y_pred)))
 
boosting GBM 분류기 정확도 0.9825
In [5]:
# GBM 의 hyper paramter 튜닝 - hyper parameter가 너무 많아 수동으로 하나하나 시도해보며 찾아주기가 어렵다. 
# 그래서 GridSearchCV를 이용한 후 , 최적의 것을 찾아주고 이를 이용하는 순서로 진행해본다. 
params = {
    'n_estimators': [100, 300, 500], #100개의 sub Dataset, Decision Tree
    'max_depth': [6, 8, 10, 12],
    'min_samples_leaf': [8, 12, 18],
    'min_samples_split': [8, 16, 20],
    'learning_rate': [0.05, 0.1] #GBM의 weak learner가 순차적으로 오류 ㄱ밧ㅅ을 보정해 나가는데 적용하는 계수 
}
In [6]:
grid_cv = GridSearchCV(boosting_gbm_ensemble, param_grid=params, cv=2, verbose=1)
grid_cv.fit(X_train, y_train)
 
Fitting 2 folds for each of 216 candidates, totalling 432 fits
 
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 432 out of 432 | elapsed:  6.9min finished
Out[6]:
GridSearchCV(cv=2, estimator=GradientBoostingClassifier(),
             param_grid={'learning_rate': [0.05, 0.1],
                         'max_depth': [6, 8, 10, 12],
                         'min_samples_leaf': [8, 12, 18],
                         'min_samples_split': [8, 16, 20],
                         'n_estimators': [100, 300, 500]},
             verbose=1)
In [7]:
print("최적의 하이퍼 파라미터: ", grid_cv.best_params_)
print("최고의 예측 정확도: ", grid_cv.best_score_)
 
최적의 하이퍼 파라미터:  {'learning_rate': 0.1, 'max_depth': 12, 'min_samples_leaf': 8, 'min_samples_split': 20, 'n_estimators': 100}
최고의 예측 정확도:  0.9604393693484814
In [8]:
#일단 이렇게 최적의 하이퍼 파라미터를 찾을 수 있다.
# 최적의 하이퍼 파라미터를 알았으니, 최적으로 학습 된 것을 가지고 예측을 수행한다. 
y_pred = grid_cv.best_estimator_.predict(X_test)
print("boosting GBM 정확도: {0:.4f}".format(accuracy_score(y_pred, y_test)))
 
boosting GBM 정확도: 1.0000
In [9]:
#feature 중요도도 그려볼 수 있다. 
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

feature_importances_values = grid_cv.best_estimator_.feature_importances_
feature_importances = pd.Series(feature_importances_values, index=cancer_dataset_df.columns)
feature_importances_top20 = feature_importances.sort_values(ascending=False)[:20] #중요한 순서로 정렬 후 top 20개만 뽑아 시각화

plt.figure(figsize=(8, 6))
plt.title('Feature Importances Top 20')
sns.barplot(x=feature_importances_top20, y=feature_importances_top20.index)
plt.show()
 
In [ ]:
 

 

 

 

지금까지 Boosing 기법의 AdaBoost와 Gradient Boost Machine에 대해 정리해 보았다. 다음에는 XGBoost에 대해서 정리해보겠다. 

 

Reference

파이썬 머신러닝 완벽 가이드 - 권철민 저