AI/Machine Learning

[Machine Learning] 보팅 (Voting)

byunghyun23 2023. 5. 31. 00:40

보팅(voting)은 앙상블 학습(ensemble learning) 방법 중 하나입니다.

앙상블 학습은 같은 데이터를 기반으로 학습한 여러 모델을 비교 및 결합하여 개별적인 모델보다 성능이 더 나은 최종 모델을 만드는 것입니다.

 

보팅은 말 그대로 같은 데이터를 기반으로 개별 모델들의 결과를 투표를 통해 최종 목표 모델을 결정하는 방법입니다.

여기서 투표 방식은 두 가지가 있습니다.

 

1. 하드 보팅 (hard voting)

하드 보팅은 분류 문제에서 개별 모델들이 가장 많이 분류한 클래스로 최종 결과를 내는 방법입니다.

아래 그림에서 3개의 모델 중 2개의 모델이 0으로 분류했기 때문에 최종 예측은 0입니다.

 

2. 소프트 보팅 (soft voting)

소프트 보팅은 분류 문제에서 개별 모델들이 예측 확률을 결과로 낸다고 했을 때, 각 모델 예측값의 평균을 최종 결과로 내는 방법입니다.

아래 그림에서 5개의 모델 중 class3에 대한 예측 확률 평균이 가장 높기 때문에 최종 예측은 class3 입니다.

 

실습은 sklearn LR, SV, NB 각 모델을 VotingClassifier를 이용하여 꽃 데이터를 분류해 보겠습니다.

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression
from sklearn import svm
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import VotingClassifier

from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

# 데이터 불러오기
raw_iris = datasets.load_iris()

# 피쳐, 타겟 데이터 지정
X = raw_iris.data
y = raw_iris.target

# 트레이닝/테스트 데이터 분할
X_tn, X_te, y_tn, y_te=train_test_split(X,y,random_state=0)

# 데이터 표준화
std_scale = StandardScaler()
std_scale.fit(X_tn)
X_tn_std = std_scale.transform(X_tn)
X_te_std = std_scale.transform(X_te)

# 보팅 학습
clf1 = LogisticRegression(multi_class='multinomial',
                          random_state=1)
clf2 = svm.SVC(kernel='linear',
               random_state=1)
clf3 = GaussianNB()

clf_voting = VotingClassifier(
                estimators=[
                    ('lr', clf1),
                    ('svm', clf2),
                    ('gnb', clf3)
                ],
                voting='hard',
                weights=[1,1,1])
clf_voting.fit(X_tn_std, y_tn)

# 예측
pred_voting = clf_voting.predict(X_te_std)
print(pred_voting)

# 정확도
accuracy = accuracy_score(y_te, pred_voting)
print(accuracy)

# confusion matrix 확인
conf_matrix = confusion_matrix(y_te, pred_voting)
print(conf_matrix)

# 분류 레포트 확인
class_report = classification_report(y_te, pred_voting)
print(class_report)