JY Tech

Voting 본문

Programming/Study

Voting

J.Dragon 2023. 2. 22. 15:40

인공지능의 성능을 끌어올리기 위해 시도 해 볼만한 것 중 Ensemble 기법이 있다.

 

Ensemble는 여러가지 모델을 합쳐서 사용하는 것인데 그 중 voting에 대해 알아보자

 

Voting은 쉽게 말해 다수결의 원칙을 따르는 것이다.

출처: https://towardsdatascience.com/ensemble-learning-stacking-blending-voting-b37737c4f483

여러가지 학습기가 학습을 하고 결과를 도출하면 그 결과물들 중에서 최종 선택을 하는 것이다

 

보팅은 하드보팅(hard vote)소프트보팅 (soft vote)2가지로 나뉘는데

 

사실 하드보팅이 앞서말한 다수결의 원칙과 제일 유사하다.

 

하드보팅은 분류기가 예측한 값들 중 가장 많이 예측한 값으로 최종결정을 내린다

                    예를들어 특정문제에 대해 a 모델은 1, b 모델은 0, c 모델은 1로 예측을 했다면 최종 예측은 1이 되는 것이다

 

 

소프트보팅은 확률의 평균을 구하고 확률이 높은것으로 최종결정을 내린다

                    예를들어 class1이 나올 확률이 a b c모델 각각 0.2, 0.5, 0.6이고 

                     class2가 나올 확률이 a b c 모델 각각 0.1, 0.7, 0.4 라면

                     class1의 확률은 0.433333....이고 

                     class2의 확률은 0.4다

                     확률의 평균이 class1이 더 높기 때문에 class1로 최종결정을 내리는 것이다.

 

참고로 하드보팅보다는 소프트보팅이 더 성능이 좋아 소프트보팅을 많이 쓴다고 한다.

 

보팅을 쓰는법은 간단하다. 사이킷런에서 xgb와 random forest, catboost로 보팅을 한다고 가정해보자

from sklearn.ensemble import VotingClassifier #보팅을 쓰기 위해 import
from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb
from xgboost import XGBClassifier
from catboost import CatBoostClassifier  #코랩을 사용한다면 !pip install catboost를 이용해 설치를 해줘야 import가 가능
 
 
xgb=XGBClassifier(이곳에 파라미터 입력)
rf=RandomForestClassifier(이곳에 파라미터 입력)
cb = CatBoostClassifier(이곳에 파라미터 입력)
VO=VotingClassifier(estimators=[('XGB',xgb),('RF',rf),('CB',cb)],voting='soft') # voting='soft'를 넣어줘야 soft vote가 됨VO.fit(train_x,train_y)
 
 
 
 
참고로 같은 모델의 파라미터 값을 바꿔보팅도 가능하다.
코드는 위와 유사하다
 

xgb=XGBClassifier(이곳에 파라미터 입력)

xgb2=XGBClassifier(이곳에 파라미터 입력)

xgb3=XGBClassifier(이곳에 파라미터 입력)

VO=VotingClassifier(estimators=[('XGB',xgb),('XGB2',xgb2),('XGB3',xgb3)],voting='soft')

VO.fit(train_x,train_y)

 

 

필자의 경우 lg aimers에서 xgb 단독으로도 제출해보고 xgb끼리 파라미터 값을 바꿔 voting을 적용하여 제출한 결과 점수가 상승했다

xgb 단독사용

 

 

3개의 xgb를 사용하고 softvote 적용

 

0.7152에서 0.7254 정도로 상승한 것을 확인할 수 있다.