본문 바로가기
머신러닝 with Python

[머신러닝 with Python] 앙상블(Ensemble) 학습 (1) / 보팅(Voting)

by CodeCrafter 2023. 9. 10.
반응형

 

이번에 알아볼 것은 앙상블(Ensemble) 학습이라는 기법입니다.

 

앙상블이라는 말 그대로, '한꺼번에, 협력하여'  결과를 도출하는 기법인데요

 

이번 포스팅에서는 분류(Classification) 문제에서, 앙상블 기법 중 보팅(Voting / 투표) 방식을 활용하는 방법을 알아보겠습니다.

 

1. 앙상블(Ensemble)이란

 - 앙상블의 뜻은 '함께, 협력하여, 동시에' 로,  말 그대로 여러 구성요소들이 서로 조화를 이루어 더 큰 무언가를 이루어내는 것을 말합니다.

 

- 분류(Classification) 문제에서도, 한 가지의 방법이 도출해내는 결과보다는 여러개의 결과를 비교하여 해당 클래스를 분류해낸다면 더 신뢰도가 높을 것으로 생각되는데요

 

 - 이러한 아이디어에서 착안한 머신러닝에서 앙상블 기법이란,  여러 개의 다른 학습 모델을 조합하여 높은 예측 성능을 달성하기 위한 기술을 말하며, 이를 사용하면 단일 모델보다 더 강력한 예측 성능을 얻을 수 있습니다.

 

 - 대표적인 앙상블 기법은 아래와 같습니다. 

 

 a) 보팅 (Voting): 보팅 앙상블은 여러 다른 기계 학습 모델의 예측 결과를 모아 다수결 또는 가중 평균 등의 방식으로 최종 예측을 결정합니다. 보팅은 다른 종류의 모델을 결합하여 다양한 관점에서 문제를 해결하는 데 사용됩니다.
 b) 배깅 (Bagging): 배깅은 동일한 알고리즘을 사용하는 여러 개의 모델을 병렬로 학습하고, 각 모델의 예측 결과를 평균화하여 최종 예측을 만듭니다. 랜덤 포레스트(Random Forest)가 배깅의 한 예입니다.
 c) 부스팅 (Boosting): 부스팅은 약한 학습기(weak learner)를 순차적으로 학습하고, 이전 모델이 실패한 샘플에 가중치를 부여하여 예측 성능을 개선하는 방법입니다. 대표적인 부스팅 알고리즘으로는 AdaBoost, Gradient Boosting, XGBoost, LightGBM 등이 있습니다.
 d) 스태킹 (Stacking): 스태킹은 여러 다른 모델을 사용하여 예측을 생성하고, 이러한 예측을 다시 하나의 모델(메타 모델)을 사용하여 최종 예측으로 결합합니다. 스태킹은 다양한 종류의 모델을 결합하여 더 강력한 모델을 만드는 데 사용됩니다.

 

이 중 이번 포스팅에서 알아볼 것은 보팅이라는 방법에 대해 알아보겠습니다.

 

2. Python 코딩을 통해 알아보는 보팅(Voting)

- 보팅이란, 말 그대로 투표를 하는 것입니다. 

 

- 이때, 배깅(Bagging)과 보팅(Voting)의 차이되는 점은

 a) 보팅의 경우, 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는 것을 말하며

 b) 배깅의 경우, 각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만, 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해 보팅을 하는 것을 말합니다.

 

- 보팅에는 하드 보팅(Hard Voting)과 소프트 보팅(Soft Voting)이 있습니다.

 a) 하드 보팅을 이용한 분류는 다수결의 원칙과 비슷합니다. 예측한 결괏값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정하는 것을 말합니다.

 b) 소프트 보팅은 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정합는 것을 말합니다.

 * 이 중 일반적으로 소프트 보팅이 사용됩니다.

 

- 그렇다면, 이러한 보팅에 대해서 파이썬 코드를 통해 직접 알아보도록 하겠습니다. 실습에 사용할 데이터는 사이킷런 라이브러리에 내장된 유방암 데이터(Breast Cancer Data)를 사용하겠습니다.

 

* 먼저, 사용할 라이브러리를 불러옵니다.

* 그리고, 분석에 사용할 유방암 데이터를 불러온 뒤, 데이터의 형태를 살펴봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
 
# 경고 메시지 무시
import warnings
warnings.filterwarnings('ignore')
 
cancer = load_breast_cancer()
 
data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
data_df.head()
cs

* 데이터는 총 30개의 변수로 구성됨을 알 수 있습니다.

 

* 보팅에 사용할 개별 분류 모델은 로지스틱회귀(Logistic Regression)와 KNN(K Nearest Neighbor)를 선택하였습니다.

* 먼저 알아볼 방법은 소프트 보팅 방식입니다.

   이를 통해, 보팅 vs 로지스틱회귀(단일모델) vs KNN(단일모델) 의 분류 성능을 비교해보았습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 개별 모델은 로지스틱 회귀와 KNN 임. 
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)
 
# VotingClassifier 학습/예측/평가. 
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)
    class_name= classifier.__class__.__name__
    print('{0} 정확도: {1:.4f}'.format(class_name, accuracy_score(y_test , pred)))
cs

* 결과는 Soft Voting 분류기가 단일 분류기들의 성과를 능가했습니다.

 

 

 

* 다음은 하드보팅 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 개별 모델을 하드 보팅 기반의 앙상블 모델로 구현한 분류기 
vo_clf = VotingClassifier( estimators=[('LR',lr_clf),('KNN',knn_clf)] , voting='hard' )
 
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, 
                                                    test_size=0.2 , random_state= 156)
 
# VotingClassifier 학습/예측/평가. 
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)
    class_name= classifier.__class__.__name__
    print('{0} 정확도: {1:.4f}'.format(class_name, accuracy_score(y_test , pred)))
cs

* 하드보팅 분류기는 단일 모델 분류기들의 정확도와 동일한 결과를 얻게 되었습니다.

 

 

 

이와같이 앙상블 기법 중 가장 기본이 되는 보팅에 대해서 이번 포스팅에서 알아보았습니다.

 

다음 포스팅에서는 이번에 다루지 못했던

 

배깅(Bagging)과 부스팅(Boosting), 그리고 스태킹(Stacking)에 대해서 알아보겠습니다.

반응형

댓글