IT 프로그래밍/PYTHON

4.3앙상블 학습

mjmjpp 2024. 3. 3. 08:14

1. 앙상블 학습의 개념

앙상블 학습(ensemble learning)을 통한 분류

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

-대표적인 앙상블 알고리즘은 랜덤 포레스트 그래디언트 부스팅

->부스팅 계열의 알고리즘의 개발이 가속화되어 매력적인 솔루션으로 불리는 XGBoost

->XGBoost와 유사한 성능을 보이며서 훨씬 빠른 수행속도를 지닌 LightGB

->여러가지 모델의 결과를 기반으로 메타모델을 수립하는 스태킹(stacking)을 포함하여 다양한 유형의 알고리즘이 머신러닝의 선도 알고리즘으로 인기

 

전통적인 앙상블 학습의 유형

1.보팅(voting) 2. 배깅(bagging) 3.부스팅(boosting),,+스태킹

 

*보팅과 배깅의 유사점

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

1. 보팅: 서로다른 알고리즘의 분류기가 전체 dataset을 공유하며 결합하는 것

2. 배깅: 같은 유형의 알고리즘을 가진 분류기가 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해 보팅을 수행하는 것

->대표적으로 랜덤포레스트알고리즘

 

부스트래핑(boostrapping)분할 방식 - 배깅방식에서 사용된 방식과 같이 개별 classifier에게 데이터를 샘플링해서 추출하는 방식

배깅앙상블 방식 - 개별 분류기가 부스트래핑방식으로 샘플링된 데이터셋에 대해 학습 후 개별적인 예측을 수행한 결과를 보팅을 통해 최종 예측 결과를 선정하는 방식

*교차 검증이 dataset간의 중첩을 허용하지 않는 것과 달리 배깅방식은 중첩을허용

 

3. 부스팅- 여러개의 분류기가 순차적으로 학습을 수행하되 앞에서 학습한 분류기가 예측이 틀린데이터에 대해서 올바르게 예측할 수 있도록 다음 분류기에게는 가중치를 부여하면서 학습과 예측을 진행함

예측 성능이 뛰어나 앙상블 학습을 주도하며 대표적인 부스팅 모둘(그래디언트 부스트, XGBoost,lightGBM)이 있다

4. 스태킹- 여러가지 다른 모델의 예측 결과값을 다시 학습데이터로 만들어서 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방법

 

2. 보팅 유형-하드 보팅(hard voting)과 소프트보팅(softvoting)

보팅(하드보팅, 소프트 보팅)

하드보팅 - 하드 보팅을 이용한 분류는 다수결 원칙과 비슷 

예측 결과들 중 다수의 분류기가 결정한 예측 값을 최종 보팅값으로 선정하는 것

소프트 보팅- 분류기들의 label 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 label값을 최종 보팅 결과값으로 선정

*일반적으로 하드 보팅보다는 소프트 보팅이 예측 성능이 더 좋아 많이 사용됨

 

 

3. 보팅 분류기(voting classifier)

사이킷런은 보팅 방식의 앙상블을 구현한 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
import warnings 
warnings.filterwarnings('ignore')

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

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

votingclassifier클래스는 주요 인자로 estimator와 voting값을 입력받는다.

estimators는 리스트 값으로 보팅에 사용될 여러개의 classifier 객체들을 튜플 형식으로 입력

voting의 defalut는 hard로 되어있어 소프트 보팅방식을 적용하기위해'soft'를 입력

 

결과는 보팅 분류기가 조금 높게 나왔지만 보팅으로 여러 분류기를 결합한다고 해서 무조건 성능이 향상되는 것은 아님

고정된 dataset에서 단일 ML알고리즘이 뛰어난 성능을 발휘하더라도 현실의 다른데이터들은 다양한 변수와 예측이 어려운 규칙으로 구성되어 있어 실제 환경에서는 성능을 이끌어내지 못할 수도 있음.

따라서 ML모델이 어떻게 높은 유연성을 가지고 현실에 대처할 수 있는가가 중요한 ML의 평가요소

이러한 관점에서 bias-variance trade -off는 ML모델이 극복해야할 중요과제

 

결정트리 알고리즘은 쉽게 과적합이 발생할 수 있지만 앙상블 학습에서는 이단점을 매우 많은 분류기를 결합하여 다양한 상황을 학습하게함으로써 극복. 결정 트리알고리즘의 장점은 취하고 단점은 보완하면서 bias-variance-off의 효과 극대화