상세 컨텐츠

본문 제목

[파이썬 머신러닝 완벽 가이드] 04 분류 (5) 앙상블

학습기록

by green010809 2024. 5. 28. 17:38

본문

앙상블 학습 개요

: 여러 개의 분류기(Classifier)를 생성하고, 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법

 

  • 이미지, 영상, 음성과 같은 비정형 데이터의 분류 = 딥러닝
  • 정형 데이터의 분류 = 앙상블

앙상블의 대표 

1. 랜덤포레스트

2. 그래디언트 부스팅

 

++부스팅 알고리즘

1. XGBoost

2. LightGBM

3. 스태킹(Stacking)

출처:Ensemble Learning : Voting and Bagging (velog.io)

앙상블 학습의 유형

1. 보팅(Voting)

: 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합

  • 보팅 유형
    • 하드 보팅 : 다수결 원칙과 비슷 / 예측한 결괏값들 중 다수의 분류기가 결정한 예측값을 선정
    • 소프트 보팅 : 분류기들의 레이블 값 결정 확률을 모두 더한 평균 중 확률이 가장 높은 레이블 값을 선정
    • 일반적으로 소프트 보팅이 적용됨
  • 보팅 분류기
    • 사이킷런은 보팅방식의 앙상블을 구현한 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)
data_df.head(3)
# 개별 모델은 로지스틱 회귀와 KNN 임. 
lr_clf = LogisticRegression(solver='liblinear')
knn_clf = KNeighborsClassifier(n_neighbors=8)

# 개별 모델을 소프트 보팅 기반의 앙상블 모델로 구현한 분류기 
vo_clf = VotingClassifier( estimators=[('LR',lr_clf),('KNN',knn_clf)] , voting='soft' )
# estimators는 리스트 값으로 보팅에 사용될 여러 개의 Classifier 객체들을 튜플 형식으로 입력받음
# voting은 'hard'시 하드 보팅, 'soft'시 소프트 보팅 방식을 적용(기본은 'hard')

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

 

Voting 분류기 정확도: 0.9561
LogisticRegression 정확도: 0.9474
KNeighborsClassifier 정확도: 0.9386

 

보팅 분류기의 정확도가 높다

But, 여러 개의 분류기를 결합한다고 해서 무조건 예측 성능이 향상되는 것은 아니다.

 

2. 배깅(Bagging)

: 각각의 분류기가 모두 같은 유형의 알고리즘 기반, 데이터 샘플링을 서로 다르게 학습 + 랜덤포레스트

[부트스트래핑(Bootstrapping) : 데이터를 샘플링 해서 추출하는 분할 방식]

교차 검증이 데이터 세트 간 중첩을 허용하지 않는 것과 다르게 배깅 방식은 중첩을 허용한다.

 

3. 부스팅(Boosting)

: 여러 개의 분류기가 순차적으로 학습, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서 올바르게 예측할 수 있도록 다음 분류기에게는 가중치(weight)를 부여하면서 학습과 예측을 진행 + 그래디언트 부스트, XGBoost, LightGBM

 

앙상블 방법

1. 스태킹

 

 

보팅과 스태킹은 서로 다른 알고리즘 기반 / 배깅과 부스팅은 결정 트리 알고리즘 기반

 

앙상블 학습에서는 학습 데이터의 예외 상황에 집착한 나머지 과적합이 발생해 실제 테스트 데이터에서 예측 성능이 떨어질 수 있다는 단점을 매우 많은 분류기를 결합하여 극복하고 있다. == 결정 트리 알고리즘의 장점은 그대로 취하고 단점은 보완하는 편향-분산 트레이트오프 효과를 극대화할 수 있다는 것이다.

관련글 더보기