하드 보팅(Hard voting)과 소프트 보팅(Soft voting)
보팅 방법에는 두 가지 유형이 있다.
1.
하드 보팅
2.
소프트 보팅
1.
하드 보팅
다수결 원칙과 비슷하다. 예측 결과값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결과값으로 선정하는 것이다. →voting=’hard’
2.
소프트 보팅
분류기들의 레이블 값 결정 확률(predict_proba())을 평균내서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결과값으로 선정하는 것이다. → voting=’soft’
일반적으로, 소프트 보팅 방법이 예측 성능이 더 좋아서 자주 사용된다.
보팅 분류기
사이킷런에서는 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스를 제공한다.
위스콘신 유방암 데이터 세트를 예측 분석해보자. 이 데이터 세트는 악성종양, 양성종양 여부를 결정하는 이진 분류 데이터 세트다.
사이킷런의 load_breast_cancer() 함수를 통해 자체에서 데이터 세트를 생성할 수 있다.
먼저, 로지스틱 회귀와 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()
data_df = pd.DataFrame(cancer.data,columns=cancer.feature_names)
data_df.head(3)
Python
복사
VotingClassifier은 인자로 estimators 과 voting 값을 받는다.
•
estimators : 리스트로 보팅에 사용될 여러 개의 분류기 객체들을 튜플 형식으로 입력 받는다.
→ estimators=[(’LR’,lr_clf),(’KNN’,knn_clf)]
•
voting : ‘hard’ 는 하드보팅, ‘soft’는 소프트 보팅 방식을 적용한다. default는 hard이다.
# 개별 모델은 로지스틱 회귀와 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)))
'''
Voting 분류기 정확도 : 0.9474
'''
# 개별 모델의 학습/예측/평가
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)))
'''
LogisticRegression 정확도 : 0.9386
KNeighborsClassifier 정확도 : 0.9386
'''
Python
복사
여기서 classifier.__class__.__name__ 은 사용한 분류기 이름을 반환해준다.
결과에서 알 수 있듯이 보팅 분류기가 좀 더 정확도가 높게 나왔다.
하지만, 항상 앙상블 모델이 개별 분류기보다 정확도가 높게 나오는 것은 아니다.
보팅과 스태킹은 서로 다른 알고리즘을 기반으로 하고 있지만, 배깅과 부스팅은 대부분 결정 트리 알고리즘을 기반으로 하고 있다.
VotingClassifier의 voting=’soft’ 를 사용하려면 각 분류기들이 예측 확률을 계산할 수 있어야 한다. 예를 들어 SVC 같은 경우, 기본값으로는 확률값을 계산할 수 없으므로 probability=True 로 지정하여 predict_proba() 메서드를 사용할 수 있게 된다.