본문 바로가기

Lecture ML

머신러닝 강좌 #14] 앙상블 학습(Ensemble Learning)과 보팅(Voting)

반응형

앙상블 학습(Ensemble Learning)을 통한 분류는 여러 개의 분류기(Classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법을 말합니다. 앙상블 학습의 목표는 다양한 분류기의 예측 결과를 결합함으로써 단일 분류기 보다 신뢰성이 높은 예측값을 얻는 것입니다.

 

이미지, 영상, 음성 등의 비정형 데이터의 분류는 딥러닝이 뛰어난 성능을 보이고 있지만, 대부분의 정형 데이터 분류 시에는 앙상블이 뛰어난 성능을 나타내고 있습니다. 앙상블 알고리즘의 대표 격인 랜덤포레스트와 그래디언트 부스팅 알고리즘은 활용도가 높습니다.

 

앙상블 학습의 유형은 전통적으로 보팅(Voting), 배깅(Bagging), 부스팅(Boosting)의 세 가지로 나눌 수 있으며, 이외에도 스태깅을 포함한 다양한 앙상블 방법이 있습니다. 보팅과 배깅은 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식입니다. 보팅과 배깅의 다른 점은 보팅의 경우 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는 것이고, 배깅의 경우 각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만, 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해 보팅을 수행하는 것입니다. 대표적인 배깅 방식이 바로 랜덤 포레스트 알고리즘입니다.

 

배깅 분류기의 경우 단일 ML알고리즘으로 여러 분류기가 학습으로 개별 예측을 하는데, 학습하는 데이터 세트가 보팅 방식과는 다릅니다. 개별 분류기에 할당된 학습 데이터는 원본 학습 데이터를 샘플링해 추출하는데, 이렇게 개별 Classifier에게 데이터를 샘플링해서 추출하는 방식을 부트스트래핑(Bootstrapping) 분할 방식이라고 부릅니다. 개별 분류기가 부트스트래핑 방식으로 샘플링된 데이터 세트에 대해서 학습을 통해 개별적인 예측을 수행한 결과를 보팅 통해서 최종 예측 결과를 선정하는 방식이 바로 배깅 앙상블 방식입니다. 

 

교차 검증이 데이터 세트간에 중첩을 허용하지 않는 것과 다르게 배깅 방식은 중첩을 허용합니다. 따라서 10000개의 데이터를 10개의 분류기 배깅 방식으로 나누더라도 각 1000개의 데이터 내에는 중복된 데이터가 있습니다.

 

BAGGING

 

VOTING

 

부스팅은 여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에게는 가중치(weight)를 부여하면서 학습과 예측을 진행하는 것입니다. 계속해서 분류기에게 가중치를 부스탕하면서 학습을 진행하기에 부스팅 방식으로 불립니다.

 

예측 성능이 뛰어나 앙상블 학습을 주도하고 있으며 대표적인 부스팅 모듈로 그래디언트 부스트, XGBoost, LightGBM이 있습니다. 스태킹은 여러 가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델로 재학습시켜 결과를 예측하는 방법입니다.

 


보팅유형 - 하드 보팅(Hard Voting)과 소프트 보팅(Soft Voting)

하드보팅을 이용한 분류(Classification)는 다수결 원칙과 비슷합니다. 예측과 결괏값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정하는 것입니다. 소프트 보팅은 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정합니다. 일반적으로 소프트 보팅을 사용합니다.

 


보팅 분류기

import pandas as pd

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
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()
# print('cancer data set: ', cancer.data)
# print('cancer feature명: ', cancer.feature_names)
# print('cancer target명: ', cancer.target_names)
# print('cancer target값: ', cancer.target)
# print('cancer DESCRIPTION: ', cancer.DESCR)
# print('cancer frame: ', cancer.frame)
# keys = cancer.keys()
# print('cancer''s keys: ', cancer.keys())

data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
print(data_df.head())

lr_clf = LogisticRegression(solver='lbfgs',class_weight='balanced', max_iter=10000)
knn_clf = KNeighborsClassifier(n_neighbors=8)
rf_cf = RandomForestClassifier(random_state=0)

vo_clf = VotingClassifier(estimators=[('LR',lr_clf),('KNN',knn_clf),('RF',rf_cf)], 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 분류기 정확도", accuracy_score(y_test, pred))

classifiers = [lr_clf, knn_clf, rf_cf]
for classifier in classifiers:
    classifier.fit(X_train, y_train)
    pred = classifier.predict(X_test)
    class_name = classifier.__class__.__name__
    print('{0} 정확도: {1:.4f}'.format(class_name, accuracy_score(y_test,pred)))

 

Voting 분류기 정확도 0.9736842105263158
LogisticRegression 정확도: 0.9561
KNeighborsClassifier 정확도: 0.9386
RandomForestClassifier 정확도: 0.9561

보팅 분류기가 정확도가 조금 높게 나옵니다. 보팅으로 여러 개의 기반 분류기를 결합한다고 해서 무조건 기반 분류기보다 예측 성능이 향상되지는 않습니다. 데이터의 특성과 분포 등 다양한 요건에 따라 오히려 기반 분류기 중 가장 좋은 분류기의 성능이 보팅했을 때보다 나을 수도 있습니다.

 

그럼에도 불구하고 앙상블 방법은 전반적으로 다른 단일 ML 알고리즘보다 뛰어난 예측 성능을 가지는 경우가 많습니다. 보팅과 스태킹 등은 서로 다른 알고리즘을 기반으로 하고 있지만, 배깅과 부스팅은 대부분 결정 트리 알고리즘을 기반으로 합니다. 결정 트리 알고리즘은 쉽고 직관적인 분류 기준을 가지고 있지만 정확한 예측을 위해 학습 데이터의 예외 상황에 집착한 나머지 오히려 과적합이 발생해 실제 테스트 데이터에서 예측 성능이 떨어지는 현사이 발생하기 쉬운데요.

 

앙상블 학습에서는 이 같은 결정 트리 알고리즘의 단점을 다양한 분류기를 결합해 다양한 상황을 학습하게 함으로써 극복하고 있습니다. 결정 트리 알고리즘의 장점은 그대로 유지하면서 단점은 보완하면서 편향-트레이드오프의 효과를 극대화할 수 있다는 것입니다. 

반응형