안 쓰던 블로그

앙상블 개요, 보팅 본문

머신러닝/머신러닝

앙상블 개요, 보팅

proqk 2021. 2. 7. 14:22
반응형

앙상블 학습

-여러 개의 분류기Classifier를 생성, 그 예측을 결합하므로써 보다 정확한 최종 예측을 도출하는 기법(집단지성처럼)

-넓은 의미로는 서로 다른 모델을 결합한 것을 지칭

-단일 모델의 약점을 다수의 모델들을 결합하여 보안하기 때문에, 성능이 떨어지더라도 서로 다른 유형의 모델을 섞는 것이 전체 성능에 도움될 수 있음

 

-보팅(Voting), 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking) 등의 기법이 있음

-대표적인 배깅-랜덤 포레스트

-대표적인 부스팅-에이다 부스팅, 그래디언트 부스팅, XGBoost, LightGBM 등

 

-보팅, 배깅: 아래에 자세한 설명

-부스팅: 여러 개의 알고리즘이 순차적으로 학습을 하되, 앞에 학습한 알고리즘 예측이 틀린 데이터에 대해 그 다음번에는 올바르게 예측할 수 있도록 알고리즘에 가중치를 부여하여 학습과 예측을 진행하는 방식
-스태킹: 여러 가지 다른 모델의 예측 결과값을 다시 학습 데이터로 만들어 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방식

 

보팅과 배깅

여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식

보팅: 서로 다른 알고리즘을 가진 분류기를 결합, 각각의 결과에 대해 투표로 최종 결과 예측

배깅: 분류기의 알고리즘이 모두 같은 유형이지만 데이터 샘플링을 서로 다르게 학습하고 보팅을 수행

 

-보팅에는 하드 보팅과 소프트 보팅이 있으며, 일반적으로 소프트 보팅을 주로 사용한다. 사이킷런에서 VotingClassifier 클래스를 통해 보팅을 지원한다

하드 보팅: 다수결의 원칙

소프트 보팅: 각 알고리즘이 레이블값 결정 확률을 예측한 결과를 평균내어 확률이 가장 높은 레이블값을 최종 값으로 예측

-데이터 샘플은 중첩이 허용되므로 중복된 데이터가 있을 수 있다

 

보팅 분류기 Voting Classifier

사이킷런에서 제공하는 위스콘신 유방암 데이터 세트를 이용하여 보팅 방식의 앙상블을 적용한다

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)

# 개별 모델은 로지스틱 회귀와 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)))

# 개별 모델의 학습/예측/평가.
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)))

로지스틱 회귀와 KNN을 먼저 하는데, 아직 이 개념에 대해 다룬 적 없으므로 이렇게 한다고만 알고 넘어간다
estimators에 리스트로 값을 넣는데 lr_clf는 LR이라는 이름으로, knn_clf는 KNN라는 이름으로 하고, 보팅 방식은 soft로 지정한다

fit으로 학습을 하면 개별 모델을 학습한다

predict로 예측하고 값을 출력한다

 

보팅 모델 말고도 개별 모델을 학습/예측/평가한 값을 출력해 본다

여기서는 보팅 분류기의 정확도가 각 개별 모델의 정확도보다 좀 더 높게 나왔지만, 여러 알고리즘을 결합한다고 항상 성능이 향상되지는 않는다

 

반응형
Comments