기록하는삶

[파이썬/python] 데이터분할(붓스트랩), 앙상블, Voting, 배깅(Bagging), 부스팅(Boosting) 본문

AI/파이썬(Python)

[파이썬/python] 데이터분할(붓스트랩), 앙상블, Voting, 배깅(Bagging), 부스팅(Boosting)

mingchin 2021. 9. 22. 00:44
728x90
반응형

지난 글에서 비복원추출을 통해 데이터를 훈련용과 시험용으로 나누는 예비법(Hold-out)과 예비법을 여러 번 시행, 최적의 모델을 찾는 교차검증(cross validation)에 대해 살펴봤다. 복원추출을 사용할 경우, 형성되는 모델이 중복되는 훈련데이터(혹은 시험데이터)를 사용하게 될 가능성이 존재하긴 하지만 이를 감수하는 기법도 존재한다.

붓스트랩(Bootstrap)

> 훈련용 데이터를 복원추출하는 방법.

> 한정된 데이터 내에서 반복해서 다른 모델을 생성하고 이들 간의 voting을 통해 하나의 model을 형성하거나(Bagging, VotingClassifier), 이전에 생성한 모델이 만들어내는 오차를 이후 생성되는 모델에 반영, 더 좋은 모델을 만들어내는 기법(Boosting) 등에 사용된다.

앙상블(Ensemble)

> 여러 모델의 결과(분류, 예측 등)를 voting을 통해 결합하여 하나의 결과 데이터를 만들어내는 모형

> 하나의 알고리즘(모델)을 반복하여 사용하되 훈련 데이터를 매번 다르게 하는 것도, 여러 알고리즘(모델)을 결합하여 사용하는 것도 모두 앙상블의 일종

ex) 결정트리(Decision Tree)를 여러 개 사용, voting을 통해 하나의 결과를 만들어내는 랜덤포레스트(Random forest). 이때 예비법(hold-out)을 통해 나누어진 훈련용 데이터 셋 내에서 복원추출을 통해 여러 개의 동일한 weight를 갖는 결정트리 모델을 만들어내는 것이 배깅(Bootstrap Aggregating _ Bagging)을 사용한 예이다.

ex) sklearn.ensemble의 VotingClassifier 모듈

여러 종류의 estimator를 리스트 형태로 넣으면, 해당 estimator들의 결과를 동일 비중('hard') 혹은 가중치 방식('soft')으로 voting하여 새로운 모델(알고리즘)을 형성하는 모듈이다.

[사용 예시]

from sklearn.ensemble import VotingClassifier

# voting = 'hard' - 단순 투표 / voting = 'soft' - 확률 반영 투표
# 가중치 투표를 하고 싶다면 array-like of shape의 가중치 부여
voting_model = VotingClassifier(estimators=[('LR',logreg_model),('KNN',kn_model)] , voting='soft',
weights = None)

voting_model.fit(X_train , y_train)
pred = voting_model.predict(X_test)
accuracy = accuracy_score(y_test , pred)

print('VotingClassifier 정확도: {0:.4f}'.format(accuracy))

Voting

> 여러 모델(동일한 알고리즘이지만 hyper parameter가 다른 경우, 다른 종류의 알고리즘 등)을 동시에 사용하여 결과 값을 도출하는 앙상블 기법의 결과 산출 방식

> 동일 비중을 부여하는 단순 투표와 모델 성능을 고려해 가중치를 부여하는 가중치 투표가 있다.

ex)

개와 고양이를 분류하기 위해 4개의 결정트리(Decision Tree)를 사용하는 랜덤포레스트(Random forest) 모델이 있다고 가정하자. 4개의 결정트리를 각각 A,B,C,D라 하고, 각각의 accuracy를 다음과 같이 가정하자. (이해를 위한 극단적인 예시다.)

A = 95%, B = 90%, C = 80%, D = 60%

 

[단순 투표(hard voting)]

하나의 개 사진을 보고 A, C, D는 개, B는 고양이라고 분류했다면, 이 앙상블 모델은 3:1 이므로 다수결을 통해 개라고 결론 짓는다. 이와 같이 각각의 모델의 성능과 관계 없이 동일한 비중으로 다수결 투표를 하는 방식이 단순 투표다.

 

[가중치 투표]

각 모델에게 특정 가중치를 부여하여 결과 값을 산출하는데 반영하는 방법이다. 일반적으로 가중치는 모델의 학습 성능에 비례하게 부여하며, 위 예시에서는 A, B, C, D 순으로 큰 가중치를 부여받을 것이다. 예를 들어 A, B에는 각각 1.5의 가중치를 부여하고 C,D에는 각각 1의 가중치를 부여했을 때 A,B가 개라 예측하고 C,D가 고양이라 예측한다면 개는 3표, 고양이는 2표에 해당하므로 정답은 개로 정해질 것이다.

 

[확률 투표(soft voting)]

각 모델이 예측한 class들의 확률을 반영하여 최종 결과를 산출하는 방식이다. 예시는 아래와 같다.

모델 예측 확률 (개) 예측 확률 (고양이)
A 0.6 0.4
B 0.3 0.7
C 0.9 0.1
D 0.4 0.6

​각 모델이 위와 같이 예측했다면, 개일 확률은 (0.6+0.3+0.9+0.4)/4 = 0.55, 고양이일 확률은 (0.4 + 0.7 + 0.1 + 0.6)/4 = 0.45로 계산하는 방법이다. Probability Voting이라고도 한다.

 

배깅(Bagging _ Bootstrap Aggregating)

> 붓스트랩 방법론 중 하나로, 훈련용 데이터로부터 같은 크기의 표본을 여러 번 단순 반복추출을 통해 만들고, 이를 통해 학습시킨 여러 개의 모델의 결과 값을 voting을 통해 결합하여 최종 결과를 산출하는 방법

> 랜덤포레스트(Random forest)가 대표적인 배깅을 활용한 estimator

> 특정 데이터가 중복 추출되거나 추출되지 않을 수 있다

부스팅(Boosting)

> 붓스트랩 표본을 통해 n번의 반복학습 및 모델 설계를 하되, (분류에 사용시) 오분류된 학습 데이터를 다음 모델 빌드 시 학습 튜플로 선택할 가능성을 높여 오류를 보완하는 방법

> n번의 시행에서 이전 시행의 학습 및 테스트가 다음 시행에 영향을 미침

> 과도한 횟수로 반복 학습을 진행할 경우 과적합 문제가 발생할 수 있어, early stopping 기법을 사용하기도 함

ex) xgboost의 XGBClassifier 모듈, lightgbm의 LGBMClassifier

둘 다 결정트리 기반의 알고리즘으로, 부스팅 기법을 사용해 더 좋은 성능을 보일 수 있는 모델이다.

[사용 예시 1]

from xgboost import XGBClassifier

# early_stopping_rounds 의 횟수만큼 정확도가 향상되지 않으면 중단
# verbose = True : 과정을 로그로 남김
xgb_model2 = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
evals = [(X_test, y_test)]
xgb_model2.fit(X_train, y_train, early_stopping_rounds=100, eval_metric="logloss", eval_set=evals, verbose=True)

xgb_pred = xgb_model2.predict(X_test)
xgb_accuracy = accuracy_score(y_test, xgb_pred)

print('XGBoost EarlyStopping 정확도: {0:.4f}'.format(xgb_accuracy))

[사용 예시 2]

from lightgbm import LGBMClassifier

# early_stopping_rounds 의 횟수만큼 정확도가 향상되지 않으면 중단
# verbose = True : 과정을 로그로 남김
lightgbm_model2 = LGBMClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
evals = [(X_test, y_test)]
lightgbm_model2.fit(X_train, y_train, early_stopping_rounds=100, eval_metric="logloss", eval_set=evals, verbose=True)
lightgbm_pred = lightgbm_model2.predict(X_test)
lightgbm_accuracy = accuracy_score(y_test, lightgbm_pred)

print('LGBMClassifier EarlyStopping 정확도: {0:.4f}'.format(lightgbm_accuracy))
728x90
반응형