본문 바로가기
개발 Tools/파이썬_Deep learning & ML

머신러닝 앙상블 보팅(Voting)

by 전컴반 2021. 8. 6.
반응형

앙상블 학습은 보팅, 배깅, 부스팅 등 여러 기법이 있다. 그중에 보팅 기준으로 공부해보겠다.

보팅은 기본적으로 여러 개의 분류기를 사용하여 각각의 분류기 결과를 투표하여 예측을 한다.

 

보팅(Voting)

 

보팅이랑, 서로 다른 알고리즘을 가진 분류기의 조합이다. 무슨 말이냐, 여기서 알고리즘이란 우리가 흔히 알고 있는 결정 트리나, knn, 로지스틱 같은 걸 의미한다. 이렇게 다른 알고리즘을 사용하여 분류기를 조합한다.

 

머신러닝 완벽가이드 (저작권 침해 의사 없음)

 

보팅에는 하드 보팅과 소프트 보팅이 있다.

 

하드 보팅이란, 각각 분류기의 결괏값 중 가장 많은 걸 따른다. 즉, 다수결의 원칙을 따른다. 예를 들어 5개의 분류기 중에 3개가 "사람"이라 판단했고 2개가 "원숭이"이라고 판단했다면 최종 결론은 "사람"으로 내린다.

 

소프트 보팅이란, 분류기의 확률을 더하고 각각 평균을 내서 확률이 제일 높은 값으로 결괏값을 선정한다.

예를 들면 "사람", "원숭이" 두 개를 구분하는데 총 3개의 분류기가 있다 하자. 첫 번째 분류기는 [0.7, 0.3]의 확률을 냈고( 사람일 확률이 0.7, 원숭이일 확률이 0.3) 두 번째 분류기는 [0.5, 0.5]의 확률을 냈다 가정하면, "사람"일 확률은 0.7+0.5이고 "원숭이" 일 확률은 0.3+0.5이다.

평균을 구하면 "사람"일 확률은 0.6이고 "원숭이"일 확률은 0.4이다 따라서 확률이 더 높은 "사람"으로 판단하는 게 소프트 보팅 방식이다.  

 

예제

 

예제는 KNN, 과 로지스틱 회귀로 보팅을 만들어 비교해보겠다. 유방암 데이터로 구현한다.

 

라이브러리

 

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

 

모델 생성

 

cancer = load_breast_cancer()

df = pd.DataFrame(cancer.data, columns=cancer.feature_names)

lr_clf = LogisticRegression(solver="liblinear")
knn_clf = KNeighborsClassifier(n_neighbors=8)
vo_clf = VotingClassifier(estimators=[("LR", lr_clf), ("KNN", knn_clf)], voting="soft")

 

먼저 로지스틱 회귀 모델을 만들고 KNN모델을 만들고 두 모델로 보팅 모델을 만든다.

이때 estimators는 리스트 안에 꼭 튜플 형식으로 집어넣어 줘야 한다. voting 방식은 하드가 아니라 소프트로 지정해준다. 기본값은 하드다.

 

바로 데이터를 분리하고 성능을 보겠다.

 

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.2, random_state=999)

classifiers = [vo_clf, lr_clf, knn_clf]
for classifier in classifiers:
    classifier.fit(X_train, y_train)
    pred = classifier.predict(X_test)
    name = classifier.__class__.__name__
    print(f"{name} 정확도 : {accuracy_score(y_test, pred)}")
    
출력
VotingClassifier 정확도 : 0.9385964912280702
LogisticRegression 정확도 : 0.9210526315789473
KNeighborsClassifier 정확도 : 0.9122807017543859

 

 

반복하여 정확도를 보면 각각의 알고리즘일 때 보다 보팅 형식으로 묶어 사용했을 때 정확도가 더 높은 걸 볼 수 있다.

 

 

반응형

댓글