앙상블 학습을 통한 분류는 여러 개의 분류기를 생성하고 그 예측을 결합함으로써 보다 정확한 예측을 도출하는 방법을 말한다. 대부분의 정형 데이터 분류 시에는 앙상블이 뛰어난 성능을 나타내며, 성능이 좋다고 알려진 최신 앙상블 모델로는 XGboost, LightGBM이 있다.
앙상블 학습의 유형
보팅 (Voting)
보팅과 배깅 모두 여러 개의 분류기가 '투표'를 통해 최종 예측 결과를 결정하는 방식이다. 이때, 보팅은 일반적으로 서로 '다른' 알고리즘을 가진 분류기를 결합하는 것.
배깅 (Bagging)
배깅도 '투표'를 통해 최종 예측 결과를 결정하는 방식이지만, 보팅과는 다르게 일반적으로 '같은' 알고리즘을 가진 분류기를 결합하는 것이다. 단, 데이터 샘플링은 서로 다르게 가져가며 (부스스트래핑 Bootstrapping 분할 방식, 데이터 중첩 허용) 학습을 수행한다. 대표적인 배깅 방식으로는 '랜덤 포레스트 알고리즘'이 있다.
부스팅 (Boosting)
부스팅은 여러 개의 분류기가 '순차적으로 학습'을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에게는 가중치를 부여하면서 학습과 예측을 수행하는 방식이다. 예측 성능이 뛰어나며, 대표적인 부스팅 모델로는 XGboost, LightGBM이 있다.
보팅 방법에는 하드 보팅과 소프트 보팅이 있다. 일반적으로 하드 보팅에 비해 소프트 보팅의 예측 성능이 좋다.
하드 보팅 (Hard Voting)
소프트 보팅 (Soft Voting)
사이킷런은 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스를 제공한다. 로지스틱 회귀와 KNN 알고리즘을 보팅으로 사용될 여러 개의 Classifier로 지정한 예제는 아래와 같다.
import pandas as pd
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression ## 로지스틱 회귀
from sklearn.neighbors import KNeighborsClassifier ## KNN
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()
data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
data_df.head(3)
로지스틱 회귀와 KNN을 기반으로 하여 소프트 보팅 수행
## 학습 및 검증 데이터 준비
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.2 , random_state= 156)
## 개별 모델 = '로지스틱 회귀' and 'KNN'
lr_clf = LogisticRegression()
knn_clf = KNeighborsClassifier(n_neighbors=8)
## 개별 모델을 소프트 보팅 기반의 앙상블 모델로 구현한 분류기
vo_clf = VotingClassifier(estimators=[('LR', lr_clf),('KNN', knn_clf)] , voting='soft') ## soft = 소프트 보팅
## 앙상블 모델의 학습 / 예측 / 평가
vo_clf.fit(X_train , y_train)
pred = vo_clf.predict(X_test)
print('Voting 분류기 정확도: {0:.4f}'.format(accuracy_score(y_test, pred)))
## 개별 모델의 학습 / 예측 / 평가
classifiers = [lr_clf, knn_clf]
for classifier in classifiers:
classifier.fit(X_train, y_train)
pred = classifier.predict(X_test)
classifier_name = classifier.__class__.__name__
print('{0} 정확도: {1:.4f}'.format(classifier_name, accuracy_score(y_test, pred)))
앙상블 학습을 통한 분류는 개별 분류기에 비해 높은 성능을 낼 수 있다.
앙상블 학습의 유형에는 보팅(다른 알고리즘의 투표), 배깅(부스스트래핑, 같은 알고리즘 투표), 부스팅(순차적 다른 알고리즘) 등이 있으며, 배깅의 예로는 랜덤 포레스트, 부스팅의 예로는 XGboost, LightGBM이 있다.
보팅 방식에는 하드 보팅(다수결), 소프트 보팅(예측 확률 더한 후 평균)이 있다.
사이킷런의 VotingClassifier 클래스를 이용하여 구현이 가능하다.
파이썬 머신러닝 완벽 가이드 교재