[BasicML] 앙상블 학습 (集成學習)
## 이 문서에 나오는 자료와 데이터는 권철민 저의 머신러닝 완벽가이드와 인프런의 강의를 바탕으로 정리한 문서입니다.
Intro
앙상블 학습(Ensemble Learning)은 여러 개의 분류기를 생성하고, 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법을 말한다.
어려운 문제의 결론을 내기 위해 여러 명의 전문가로 위원회를 구성해 다양한 의견을 수렴하는 것과 같은 원리이다.
앙상블의 유형
앙상블의 유형은 일반적으로 보팅(Voting), 배깅(Bagging), 부스팅(Boosting)으로 구분할 수 있으며, 이외에 스태킹(Stacking)등의 기법이 있다.
대표적인 배깅은 랜덤 포레스트(Random Forest)알고리즘이 있으며, 부스팅은 에이다 부스팅, 그래디언트 부스팅, XGBoost,LightGBM 등이 있다. 경영 데이터와 같은 경우, GBM계열의 성능들이 상당히 인정을 받고 있다.
앙상블의 특징
단일 모델의 약점을 다수의 모델을 결합하여 보완
뛰어난 성능을 가진 모델들만 구성하는 것보다 성능이 떨어지더라도 서로 다른 유형의 모델을 섞는 것이 오히려 전체 성능이 도움이 될 수 있음 앙상블 모델의 대표적인 랜덤 포레스트와 뛰어난 부스팅 알고리즘들은 모두 결정 트리 알고리즘을 기반 알고리즘으로 적용한다. 그 이유는 결정 트리 알고리즘은 과적합에 대한 단점이 있지만, 수천개의 분류기를 결합하면
보팅(Voting)과 배깅(Bagging) 개요
보팅과 배깅의 공통점은 여러 개의 분류기가 투표를 통해 최종 예측결과를 결정하는 방식이다.
차이점은 보팅의 경우, 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는 것이고, 배깅의 경우 각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만, 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해 보팅을 수행하는 것ㅇ다.
보팅 유형
- 하드 보팅(Hard voting) Hard voting은 다수의 Classifier 간 다수결로 최종 Class 결정
- 소프트 보팅(Soft Voting) 다수의 Class 확률을 평균하여 결정(사이킷런에서는 predict_proba() 메소드를 이용하여 class 별 확률 결정)
일반적으로 하드 보팅보다는 소프트 보팅이 예측 성능이 상대적으로 우수하여 주로 사용된다.
import pandas as pd
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
cancer = load_breast_cancer()
lr_clf = LogisticRegression()
knn_clf = KNeighborsClassifier(n_neighbors=8)
vo_clf = VotingClassifier(estimators=[('LR',lr_clf),('knn',knn_clf)],voting='soft')
X_train,X_test,y_train,y_test = train_test_split(cancer.data,cancer.target,test_size=0.2,random_state=156)
vo_clf.fit(X_train,y_train)
pred = vo_clf.predict(X_test)
print('Voting 분류기 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))
Voting 분류기 정확도: 0.9474
배깅(Bagging) - 랜덤 포레스트(Random Forest)
배깅의 대표적인 알고리즘은 랜덤 포레스트이다. 앙상블 알고리즘 중 비교적 빠른 수행 속도를 가지고 있으며, 다양한 영역에서 높은 예측 성능을 보이고 있다. 랜덤 포레스트는 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤 최종적으로 모든 분류기가 보팅을 통해 예측 결정을 하게 된다.
랜덤 포레스트의 개별적인 분류기는 결정 트리이지만 개별 트리가 학습하는 데이터 세트는 전체 데이터에서 일부가 중첩되게 샘플링된 데이터 세으이다. 이렇게 여러 개의 데이터 세트를 중첩되게 분리하는 것을 부트스트래핑(Bootstrapping) 분할 방식이라고 한다. 통계에서 평균의 신뢰도를 구하기 위해서 데이터를 여러번 추출하여 각각의 평균을 보는 것이다. 따라서 배깅은 예측 모형의 변동성이 큰 경우 예측모형의 변동성을 감소시키기 위해 사용된다. 여러 번의 복원 샘플링을 통해 예측 모형의 분산을 줄여 줌으로써 예측력을 향상 시키는 방법이며 일반적으로 과대 적합 된 모형, 편향이(Bias) 작고 분산(Variance)이 큰 모형에 사용하는 것이 적합하다.
파라미터명 | 설명 |
---|---|
n_estimators | 약한 학습기의 개수를 지정한다. 많이 설정할수록 좋은 성능을 기대할 수 있지만 무조건 향상되는 것이 아니며, 학습 수행 시간이 오래 걸린다. |
max_features | 최적의 분할을 위해 고려할 최대 피처 개수이지만, 결정 트리와 달리 ‘None’이 아니라 ‘sqrt’와 같다. 따라서 전체 피처가 16개만 분할을 위해 4개를 참조한다. |
max_depth | 트리의 최대 깊이를 규정하는데 사용함,None으로 설정한다면 완벽하게 클래스 결정 값이 될 때까지 깊이를 키움 |
부스팅(Boosting)
출처: https://swalloow.github.io/bagging-boosting
부스팅 알고리즘은 여러 개의 약한 학습기(weak learner)를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치를 부여를 통해 오류를 개선해 나가면서 학습하는 방식이다. 부스팅의 대표적인 방식은 AdaBoost와 그래디언트 부스트가 있다. 다만 부스팅은 “순차적으로” 학습하다 보니, 데이터를 읽고 데이터에 대해서 학습을 하면서 수행시간이 오래 걸린다.
Adaboost
GBM(Gradient Boost Machine)도 에이다부스트와 유사하나, 가중치 업데이트를 경사 하강법(Gradient Descent)을 이용하는 것이 큰 차이이다. 아래 표는 GBM의 하이퍼 파라미터이다.
파라미터명 | 설명 |
---|---|
loss | 경사 하강법에서 사용할 비용 함수를 지정, 기본값은 deviance |
learning_rate | GBM이 학습을 진행할 때마다 적용하는 학습률, Weak learner가 순차적으로 오류값을 보정해 나가는데 적용하는 계수, 너무 작은 값을 하면 최소오류값을 못찾을 우려가 있고, 너무 큰 값을 적용하면 최소 오류값을 넘어갈 우려도 있다. |
n_estimators | weak learner의 개수 |
subsample | weak learner가 학습에 사용하는 데이터의 샘플링 비율이다. 기본값은 1이며 이는 전체 학습 데이터를 기반으로 학습한다는 의미이다. |