본문 바로가기
Machine Learning

Ensemble Model (, Voting)

by Nowkeeh Ahc

 앙상블 모형 (Ensemble Model)은 정확하게는 앙상블 학습 (Ensemble Learning) 방식에 의한 머신러닝 기법을 의미한다. 앙상블 학습은 하나의 모형이 아닌 여러 개의 모형을 학습시키고, 그 예측을 결합함으로써 보다 정확한 예측을 도출하는 일련의 머신러닝 기법을 의미한다. 이미지, 영상, 음성 등 비정형 데이터를 처리하는 문제에서는 딥러닝이 뛰어난 성능을 보이지만, 정형 데이터를 통한 분류 예측 문제는 대부분의 경우 앙상블 모형이 더 뛰어난 성능을 보이는 것으로 알려져 있다.

 앙상블 학습은 다양한 방법이 있으나, 일반적으로 크게 보팅 (Voting), 배깅 (Bagging), 부스팅 (Boosting) 방식에 의한 앙상블 모형으로 구분할 수 있다. 보팅과 배깅은 다수 모형의 예측값을 종합하여 최종 예측 결과를 결정하는 반면, 부스팅 방식은 단일 모형을 사용하되 학습을 진행해가면서 순차적으로 모형의 오류를 줄여나가 최종 단계에서 단계별 모형들을 결합하여 최종 예측 결과를 결정하는 방식이다. 사용하는 기초 모형들의 유형 관점에서 보자면, 보팅 방식의 앙상블 학습은 일반적으로 서로 다른 유형의 모형을 결합하는 것에 비해 배깅과 부스팅 방식의 앙상블 학습은 주로 의사결정 나무 모형과 같은 단일 모형을 기반으로 반복 학습하게 된다. 

 

[그림 1] 앙상블 학습의 유형 

 

 

 일반적으로 앙상블 모형은 집단지성 (Collective Intelligence)에 의한 의사결정 방식처럼 개별 모형의 답을 수집하여 하나의 신뢰성 높은 예측값을 얻게 된다. 하지만, 앙상블 모형이 항상 좋은 성능을 보장하는 것을 아니며, 때로는 단일 모형이 앙상블 모형의 성능을 능가하는 경우도 있다. 앙상블 모형의 장단점은 다음과 같다. 

[표 1] 앙상블 모형의 장단점

장점 일반적으로 단일 모형보다 정확한 예측을 한다.
단일 모형보다 데이터의 노이즈에 민감하지 않다.
데이터의 선형 관계뿐 아니라 비선형 관계에도 잘 맞는다. 
단점 앙상블 모형은 예측 결과에 대해서 설명하기가 어렵다.
인자 튜닝이 까다롭다.

 

 

 보팅 앙상블

 보팅 앙상블 모형은 분류 예측의 경우 보팅 분류기 (Voting Classifier)라는 특별한 앙상블 결합 기능에 의해 작동하는데, 여기에서 보팅 분류기는 서로 다른 모형들이 예측한 결과를 투표로 간주하고 이를 결합하여 예측값을 도출하는 기능을 담당한다. 보팅 분류기는 다수의 모형이 동일한 데이터 세트에 대해 학습하며, 크게 하드 보팅과 소프트 보팅 방식으로 나누어진다. 

 

• 하드 보팅과 소프트 보팅

하드 보팅 (Hard Voting)은 각 모형이 예측한 클래스를 다수결로 결정하는 방식이다. 따라서, 하드 보팅 방식에 의해 예측된 결과값은 예측 클래스의 분포 중 최빈값에 해당한다. 

[그림 2] 하드 보팅

 위 그림에서 로지스틱 회귀분석, K-최근접 이웃, 서포트 벡터 머신 모형이 각각 예측한 클래스가 0, 0, 1이라 할 때, 하드 보팅은 다수결에 의하여 최종 예측값을 0으로 결정하게 된다.

 소프트 보팅 (Soft Voting)은 개별 알고리즘이 각 클래스에 속할 확률을 산출해주면, 이를 기반으로 중요도에 의해 가중합산 되어 최종 분류 클래스를 결정하게 된다. 

[그림 3] 소프트 보팅 

 위 예시에서 각 모형이 클래스 0으로 예측할 확률은 0.7, 0.8, 0.6, 클래스 1로 예측할 확률은 0.3, 0.2, 0.4이므로 단순 평균을 적용한다고 가정할 경우 각 클래스에 속할 평균 확률은 0.7과 0.3이다. 따라서, 소프트 보팅에 의한 최종 예측값은 클래스 0으로 결정된다.

 보팅 앙상블에서 수치 예측의 경우에는 보팅 앙상블 모형에 포함된 개별 알고리즘들의 목표 예측값을 평균함으로써 최종 수치 예측값을 산출하게 된다.

 

실습으로는 이항 변수를 사용하여 분류 예측을 해보겠다.

 

연습

 

1) 변수 지정 및 전처리

 

#1. 모듈 및 함수 불러오기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
from imblearn.over_sampling import SMOTE

#2. 데이터 불러오기 
df = pd.read_csv('Data.csv', encoding = 'cp949')

#3. 변수 지정(독립변수/종속변수)
X = df[['a', 'b', 'c', 'd', 'e', 'f', 'g']]
Y = df['S']

#4. 데이터 세트 분할(독립변수/종속변수)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

#5. 전처리(표준화, 원핫인코딩)
ct = ColumnTransformer([("scaling", StandardScaler(), ['a', 'b', 'c', 'd', 'e', 'f']), ("onehot", OneHotEncoder(sparse=False, handle_unknown='ignore'), ['g'])])
ct.fit(X_train)
X_train=ct.transform(X_train)
X_test=ct.transform(X_test)

#6. 오버샘플링
smote = SMOTE(random_state=0)
X_train, Y_train = smote.fit_sample(X_train, Y_train)

 

2) 모형 학습 및 예측

#1. 모듈 및 함수 불러오기
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier

#2. 단일 모형 객체 생성(K-NN 모형, 의사결정나무 모형)
knn = KNeighborsClassifier()
dtree = DecisionTreeClassifier(random_state=0) 

#3. 소프트 보팅 기반의 앙상블 모형 생성
model = VotingClassifier(estimators=[('K-NN', knn), ('Dtree', dtree)], voting ='soft')

#4. 모형 학습 및 예측
model.fit(X_train, Y_train)
Y_pred = model.predict(X_test)
print('평가용 데이터 세트에 대한 예측값\n', Y_pred)

▶ 1. 보팅 분류 모형이 구축되어 있는 sklearn.ensemble 모듈의 VotingClassifier( ) 함수를 임포트한다.

▶ 2. 보팅 모형에 사용할 단일 모형으로 K-NN과 Decision Tree 을 생성한다.

▶ 3. VotingClassifier( ) 함수의 estimators 인자에는 앞서 생성한 단일 모형의 객체와 이름을 리스트 안에 튜플 형태로 지정하고, voting 인자에는 soft를 지정함으로써 소프트 보팅 방식으로 보팅 앙상블 학습이 되도록 설정하였다(hard로 지정하면 하드 보팅 방식으로 변경).

VotingClassifier( ) 함수에 대한 자세한 설명은 아래 URL에서 확인할 수 있다.

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.VotingClassifier.html

 

sklearn.ensemble.VotingClassifier

Examples using sklearn.ensemble.VotingClassifier: Plot class probabilities calculated by the VotingClassifier Plot class probabilities calculated by the VotingClassifier Plot the decision boundarie...

scikit-learn.org

 

3) 모형 평가

 

• 정확도 평가

#1. 보팅 모형의 정확도 
print('Voting 분류기 정확도: {0:.3f}'.format(model.score(X_test, Y_test)))

#2. 개별 모형의 정확도
classifiers = [knn, dtree]
for classifier in classifiers:
    classifier.fit(X_train, Y_train)
    class_name= classifier.__class__.__name__
    print('{0} 정확도: {1:.3f}'.format(class_name, classifier.score(X_test, Y_test)))

 

• 정밀도, 재현율, F1 스코어 평가

from sklearn.metrics import classification_report  
print(classification_report(Y_test, Y_pred))

 


This post was written based on what I read and studied the book below.

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747

댓글