愛林

[Python/MachineLearning] 앙상블 알고리즘 (Ensemble Algorithms) : 보팅 (Votting) 본문

Data Science/Machine Learning

[Python/MachineLearning] 앙상블 알고리즘 (Ensemble Algorithms) : 보팅 (Votting)

愛林 2022. 8. 22. 14:53
반응형

https://wndofla123.tistory.com/67

 

[Python/MachineLearning] 앙상블 알고리즘 (Ensemble Algorithms) : 배깅 (Bagging)

이전에는 의사결정나무에 대해 알아보았다. 이번엔 앙상블 알고리즘에 대해 알아보자. 앙상블 알고리즘 (Ensemble Algorithms) 앙상블 알고리즘이란, 일련의 분류 기준을 구성한 후 예측 가중치 투표

wndofla123.tistory.com

앙상블 알고리즘에 대한 지난 글.

 

지난 시간에는 여러 앙상블 알고리즘에 대해서 알아보고,

배깅을 실제로 실습해보았다.

 

앙상블 알고리즘이란, 

일련의 분류 기준을 구성한 후, 예측 가중치 투표를 통해 새로운 데이터를 분류하는 방식이다.

주어진 데이터로부터 여러 개의 모델을 학습시킨 다음, 예측 시에 여러 모델의 예측 결과들을

종합해서 정확도를 높인다.

강력한 하나의 모델보다 약한 여러개의 모델을 조합시켜 더 정확한 예측을 할 수 있도록

하는 모델이다.

 

배깅 (Bagging) 은 훈련용 데이터로부터 여러 개의 표본을 추출하여 분류기를 생성한 다음,

앙상블 시키는 모델이었다. 대표적인 배깅 알고리즘으로는 랜덤 포레스트가 있다.

 

 


보팅 (Votting)

 

보팅에 대해 자세히 알아보자.

보팅은 Hard Votting 과 Soft Voting 이 있다.

 

Hard Votting 은 다수결의 원칙과 유사하다. 각 분류기의 예측을 모아서

가장 많이 선택된 (투표된) 결과를 채택하는 것이다.

 

Soft Votting 은 분류기들의 레이블 값의 결정 확률의 평균값을 구한 뒤, 확률이 가장

높은 레이블 값을 최종적으로 선택한다. (개별 분류기의 예측을 평균)

평균적으로는 Soft Votting 이 성능이 좋아서 더 많이 사용된다.

 

 

 


Voting 보팅 실습

 

 

# 패키지 임포트 
import os 
import warnings
# FutureWarning 제거
warnings.simplefilter(action='ignore', category=FutureWarning) 

import pandas as pd # pandas package
import numpy as np  # numpy package  
from scipy import stats  # Scipy Package 

from sklearn.model_selection import train_test_split #데이터셋 분리 
from sklearn.preprocessing import StandardScaler

# 시각화 패키지 
import matplotlib.pyplot as plt #  matplotlib 시각화 패키지 
import seaborn as sns
%matplotlib inline

# os에 따른 Font 깨짐 제거를 위해 Font 지정 
import os 
if os.name == 'nt' :  # Windows OS 
    font_family = "Malgun Gothic"
else: # MAC OS 
    font_family = "AppleGothic"
    
# - 값이 깨지는 문제 해결을 위해 파라미터 값 설정 
sns.set(font=font_family, rc ={"axes.unicode_minus" : False})

 

 

 


Hard Voting

 

하드보팅은 말 그대로 다수결의 원칙이라고 했다.

 

import warnings
warnings.filterwarnings(action='ignore', category=DeprecationWarning)

from sklearn.ensemble import VotingClassifier # voting 
from sklearn.ensemble import RandomForestClassifier # 랜덤포레스트
from sklearn.linear_model import LogisticRegression #로지스틱 회귀
from sklearn.svm import SVC # 서포트벡터머신
from sklearn.model_selection import train_test_split


## 각 분류기 정의 
log_clf = LogisticRegression(random_state=20)
rnd_clf = RandomForestClassifier(random_state=20)
svm_clf = SVC(random_state=20,probability=True)

# 하드 보팅 
voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('rf', rnd_clf), 
                                          ('svc', svm_clf)], voting='hard') # 하드 보팅 

voting_clf.fit(X_train, y_train)

로지스틱 회귀, 랜덤포레스트, 서포트 벡터 머신을 분류기로 넣어준다.

이 세 머신을 돌려서 가장 많은 투표를 넣은 결과가 Hard Voting 의 결과가 될 것이다.

 

## 학습 및 성능 평가
from sklearn.metrics import accuracy_score

for clf in (log_clf, rnd_clf, svm_clf, voting_clf) :
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    print(y_pred[:15])
LogisticRegression 0.82
[1 0 0 1 0 0 0 0 0 0 0 0 0 1 0]
RandomForestClassifier 0.93
[1 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
SVC 0.94
[1 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
VotingClassifier 0.93
[1 0 0 1 0 0 0 0 0 0 0 0 0 0 0]

각자의 결과와 Voting 의 정확도와 결과를 보여줄 clf 함수를 정의한다.

X_train 과 y_train 을 학습시켜주고,

결과물을 print 시켜준다.

 

로지스틱회귀는 0.82의 정확도, 랜덤포레스트는 0.93의 정확도, 그리고 SVC 는 0.94의 정확도를 보였다.

각자의 결과 중에서 가장 많은 결과가 나온 [ 1 0 0 1 0 0 0 0 0 .... ] 이 Voting 의 결과로 도출되었고,

VotingClassifier 의 정확도눈 0.93이 나왔다.

 

 


Soft Voting

 

소프트 보팅은 각자의 분류기가 클래스의 확률을 예측할 수 있을 때, 개별 분류기의

예측을 평균하는 것이다.

 

## 각 분류기 정의 
log_clf = LogisticRegression(random_state=20)
rnd_clf = RandomForestClassifier(random_state=20)
svm_clf = SVC(random_state=20,probability=True)

# 소프트 보팅 
voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('rf', rnd_clf), 
                                          ('svc', svm_clf)], voting='soft') # 소프트 보팅 

voting_clf.fit(X_train, y_train)

 

VotingClassifier 의 voting = 'soft' 로 설정해주었다.

 

## 성능 및 평가

for clf in (log_clf, rnd_clf, svm_clf, voting_clf) :
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    
    # 2개의 값에 대한 결과 예측 확률
    y_pred_proba = clf.predict_proba(X_test)
    print("2개 값 예측")
    print(y_pred[:2])
    print(y_pred_proba[:2])

soft voting 은 확률을 계산하기 때문에 predict_proba 라는 함수를 쓴다.

로지스틱 회귀는 정확도 0.82

랜덤포레스트는 0.93 정확도, 서포트벡터머신은 0.94의 정확도를 보여주었다.

 

VotngClassifier 는 정확도가 위와 같은 0.92 가 나왔다.

[[0.11961143 0.88038857]
 [0.88911154 0.11088846]]

2개의 값을 예측했으니, 

처음은 0으로 에측한 확률 0.12, 1로 예측한 확률 0.88 이다.

두번째는 0으로 예측한 확률 0.89, 1로 에측한 확률이 0.11이다.

그래서 값을 예측한 결과가 [ 1 0 ] 이 나온 것이다.

Comments