본문 바로가기
Machine Learning

앙!상블

by rubyda 2020. 4. 21.
728x90

앙상블 학습이란?


앙상블학습(Ensemble Learning)은 여러 개의 분류기(Classifier)를 생성하고 계측을 결합하면서 최종적으로 보다 정확한 예측을 도출하는 기법을 말합니다. 대표적인 예시로는 랜덤 포레스트, 그래디언트 부스팅 알고리즘이 있습니다.

 

앙상블 학습의 목표는 다양한 분류기의 예측 결과를 결합하면서 단일 분류기보다 신뢰성이 높은 예측값을 얻는 것입니다.

 

앙상블 학습의 유형


앙상블 학습은 보팅(Voting), 배깅(Bagging), 부스팅(Boosting) 세가지도 나눌 수 있습니다.

보팅과 배깅은 여러개의 분류기로 투표를 통해서 최종 예측 결과를 결정하는 방식입니다. 그렇다면 두개의 차이점은 무엇일까요?? 

 

바로! 보팅은 서로 다른 알고리즘을 가진 분류기를 결합하고, 배깅은 각가의 분류기가 모두 같은 유형의 알고리즘 이지만 데이터 샘플링을 다르게 하면서 학습을 수행한다는 것입니다. 그림으로 쉽게 정리를 해보겠습니다.

 

보팅은 여러개의 다른 알고리즘으로 같은 데이터 세트에 대해서 학습을 하고 예측한 결과를 가지고 보팅을 통해서 최종적으로 예측 결과를 선정하게 됩니다.

 

배깅인 단일 알고리즘으로 여러 분류기가 학습으로 개별 예측을 하게 됩니다. 개별 분류기에 할당되는 학습 데이터는 원본 학습 데이터를 샘플링해서 추추을 하게 되는데 이렇게 개별 Classifier에게 데이터를 샘플링해서 추출하는 방식을 부트스트래핑(Bootstrapping)분할 방식이라고 합니다.  배깅은 중첩을 허용합니다. 따라서 개별 분류기간 중복되는 데이터가 존재할 수 있습니다. 

 

부스팅은 여러개의 분류기가 순차적으로 학습을 수행하는데 앞에서 학습한 분류기에서 틀린 예측을 한 경우 올바르게 예측을 할 수 있도록 다음 분류기에 가중치(Weight)를 부여하면서 학습과 예측을 진행합니다. 대표적인 부스티 모듈에는 그래디언트 부스트, XGBoost, LightGBM등이 있습니다.

 

하드보팅(Hard Voting) & 소프트 보팅(Soft Voting)


하드 보팅

하드 보팅은 다수결 원칙과 비슷하다고 할 수 있습니다. 즉 예측한 결과값들 중에서 다수의 분류기가 결정한 예측값을 최종 보팅 결과값으로 선정하는 방식입니다.

 

소프트 보팅

소프트 보팅은 분류기들의 레이블 값 결정 확률들을 모두 더한 후 이를 평균을 취해서 확률이 가장 높은 레이블 값을 최종 보팅 결과값으로 선정하는 방식입니다.

 

일반적으로는 소프트 보팅으로 적용이 된다고 합니다.

 

하드 보팅과 소프트 보팅도 그림으로 표현해서 보도록 하겠습니다.

 

 

왼쪽 그림 하드 보팅은 분류기 1번, 3번, 4번이 1로 레이블 값을 예측하고 분류기 2번이 2로 레이블 값을 예측했기 때문에 다수결 원칙에 의해서 최종 예측은 레이블 값 1로 결정이 됩니다.

 

오른쪽 그림 소프트 보팅은 레이블 값 1의 평균 예측 확률은 (0.7 + 0.2 + 0.8 + 0.9) / 4 = 0.65가 됩니다. 레이블 값 2의 평균 예측 확률은 (0.3 + 0.8 + 0.2 + 0.1) / 4 = 0.35가 됩니다. 따라서 최종 레이블 값은 평균값이 더 큰 1로 결정이 되는 것입니다. 

 

Voting Classifier


사이킷런에서는 보팅 방식의 앙상블로 VotingClassifier 클래스를 제공합니다.

위스콘신 유방암 데이터 세트를 사용해서 앙상블을 연습해 보도록 하겠습니다.

 

위스콘신 유방암 데이터는 유방암의 악성종양, 양성종양 여부를 결정하는 이진 분류 데이터 세트로 종양의 크기, 모양 등의 피처들을 가지고 있습니다. 

 

  • 로지스틱 회귀와 KNN을 기반으로 보팅 분류기를 만들어 보도록 하겠습니다.

 

In

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

필요한 모듈을 불러와 줍니다.

 

In

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

데이터를 한번 살펴보도록 하겠습니다.

 

Out

로지스틱 회귀와 KNN을 기반으로 보팅 분류기를 만들어 보도록 하겠습니다.

사이킷런에서는 VotingClassifier 클래스를 사용하여 보팅 분류기를 생성할 수 있습니다.

 

In

Log_clf = LogisticRegression()
Knn_clf = KNeighborsClassifier(n_neighbors=8)

# 소프트 보팅 방식을 적용하겠습니다.
vo_clf = VotingClassifier(estimators = [('LR', Log_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)

 VotingClassifier 클래스는 주요 생성 인자로 estimators와 voting 값을 입력 받습니다. 

 

vo_clf.fit(x_train, y_train)
pred = vo_clf.predict(x_test)
print('분류기 정확도:{0:.4f}'
      .format(accuracy_score(y_test,pred)))

classifiers = [Log_clf, Knn_clf]
for cf in classifiers:
    cf.fit(x_train, y_train)
    pred = cf.predict(x_test)
    class_name = cf.__class__.__name__
    print('{0} 정확도: {1:.4f}'.format(class_name, accuracy_score(y_test,pred)))

 VotingClassifier 로 학습&예측&평가를 해보겠습니다.

 

Out

보팅 분류기의 정확도가 조금 높게 나타났습니다. 하지만 항상 보팅 방식이 예측 성능이 높게 나오지는 않습니다. 데이터의 분포 등 다양한 요건에 따라서 오히려 기반 분류기의 성능이 보팅했을 때 보다 나은 결과가 나올 수도 있습니다.

 

 

 

 

Reference


파이썬 머신러닝 완벽가이드