머신러닝 앙상블 학습(Ensemble Learning) - 보팅(Voting)

1 minute read

앙상블 학습(Ensemble Learning) 중 보팅(Voting)은 투표를 통해 최종 예측 결과를 결정하는 방식이며, 서로 다른 유형의 알고리즘을 가진 분류기가 같은 데이터셋을 학습하여 도출한 결과들을 결합한다는 점에서 배깅(Bagging)과 구분된다.

1. 보팅(Voting)의 유형

  • 하드 보팅(Hard Voting)
    • 예측한 결과값들 중 다수의 분류기가 결정한 예측 결과값을 최종 보팅 결과값으로 선정
  • 소프트 보팅(Soft Voting)
    • 각 분류기별 레이블 값 결정 확률을 평균 낸 확률이 가장 높은 레이블 값을 최종 보팅 결과값으로 선정
    • 일반적으로 이 방식이 성능이 더 좋아 자주 사용한다.

2. 사이킷런에서 구현하기

사이킷런은 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스를 제공한다.

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()

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

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.2)
 
# 개별 모델
lr_clf = LogisticRegression()
knn_clf = KNeighborsClassifier(n_neighbors=8)

# 개별 모델을 소프트 보팅 기반의 앙상블 모델로 구현한 분류기 
vo_clf = VotingClassifier(estimators=[('LR', lr_clf), ('KNN', knn_clf)], voting='soft')

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)))
Voting 분류기 정확도: 0.9211
LogisticRegression 정확도: 0.9123
KNeighborsClassifier 정확도: 0.8947

위 예시에서는 Voting의 성능이 기반 분류기들의 성능보다 높게 나왔지만, 반드시 항상 그렇다고는 할 수 없다. 실제로 random_state를 지정하지 않은 상태에서 위의 코드를 여러 번 실행해보면 Voting 분류기의 성능이 더 높을 때도, 낮을 때도 있는 것을 확인할 수 있다.

Leave a comment