ML 🐼/머신러닝 💕

[핸즈온머신러닝] 앙상블(Ensemble) 학습 (1) [보팅 ~ 랜덤 포레스트]

Dobby98 2022. 11. 29. 20:22

목차 

  1. 앙상블 기법이란?
  2. 앙상블 기법의 종류
    1. 보팅
    2. 배깅, 페이스팅
    3. 랜덤 포레스트
    4. 부스팅
    5. 스태킹

1. 앙상블 기법이란?

여러개의 학습 모델(분류, 회귀 ...) 을 학습하여 학습된 각 모델에서 예측을 만들어 낸 후

그 예측들을 결합하여 보다 정확도가 높은 예측을 만들어 내는 기법이다

 

이러한 앙상블기법에는 보팅 (하드, 소프트), 배깅, 페이스팅, 부스팅 등 다양한 기법들이 존재하고 있


2. 앙상블 기법의 종류


 2.1 Voting 보팅 (투표 기반 분류기)

 

보팅

 

보팅은 말 그대로 같은 데이터셋을 통해서 각 모델들을 학습시키고 이들의 예측을 투표를 통해서 최적의 예측으로 만들어 내는 방법으로 하드 보팅소프트 보팅이 있다.

 

 

2.1.1 하드 보팅(Hard voting)과 소프트 보팅(Soft voting)

 

하드 보팅  Hard Voting : 각 모델 예측 결과를 단순 다수결로 결정하여 최적의 예측을 만드는 앙상블 기법
소프트 보팅 Soft Voting : 각 모델의 예측 확률을 평균하여 최적의 예측을 만드는 앙상블 기법

쉽게 설명하자면 하드 보팅은 단순 다수결로 결과를 결정하고 소프트 보팅은 각 모델의 확률을 평균하여 결과를 결정한다

  *일반적으로 소프트보팅이 하드 보팅보다 조금 더 높은 정확성을 내는 반면 학습 시간이 조금 더 걸린다

 

2.1.2 코드

import pandas as pd

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier

#각 모델들 정의
lr_clf = LogisticRegression(solver='liblinear')
knn_clf = KNeighborsClassifier(n_neighbors=8)

#VotingClassifier정의 및 사용할 모델과 voting 방법 입력
v_clf = VotingClassifier(estimators = [('LR', lr_clf), ('KNN', knn_clf)], voting = 'soft')

#학습
v_clf.fit(X_train, y_train)

#예측
pred = v_clf.predict(X_test)

보팅은 sklearn의 VotingClassifier를 사용하면 되고 

하드보팅과 소프트보팅은 파라미터에 voting ='soft' or ' hard'로 설정해주면 된다

 


 2.2 배깅(Bagging)과 페이스팅(Pasting)

배깅

앞에서 살펴본 보팅은 똑같은 데이터셋을 활용하여 각 모델들을 학습시켰다. 

그러나 이는 모델의 과적합을 만들어 낼 가능성을 높인다

따라서 Bootstrap Aggregating의 약자인 배깅은 각 모델마다 다른 데이터 셋을 활용하여 학습을 하는데 

이때 훈련 데이터 셋에서 샘플링을 하여 각 데이터셋을 구성해준다 

여기서 각 샘플링에 중복을 허용하면 배깅 (복원추출이다)이고 각 샘플링에 중복을 허용하지 않으면 페이스팅이다

 

배깅은 '분류'일 때 통계적 최빈값(가장 많이 예측한 결과)을 활용하여 최종 결과를 만들어 내고 

'회귀'일 경우 평균을 계산하여 최종 결과를 만들어낸다

 

2.2.1 oob 평가

배깅을 활용하면 어떤 샘플은 한 모델에서 여러 번 사용될 수 있고 어떤 것은 전혀 선택되지 않을 수 있다

즉, 선택받지 못하는 훈련 데이터들이 존재하게 되는데 이를 oob (out-of-bag)샘플이라고 한다

 

이들을 활용하지 않는다면 오히려 데이터적으로 손해이다

또한 이들을 활용할 수 있다면 굳이 별도의 validation 데이터 셋을 구성할 필요가 없다 

따라서 배깅에서 평가할 때 oob 샘플을 활용하는 것이 좋다 

oob 평가는 각 모델의 평균으로 만들어 진다

 

2.2.2 코드

import pandas as pd

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier



#BaggingClassifier정의 및 사용할 모델과 oob평가 설정
b_clf = BaggingClassifier(
	DecisionTreeClassifier(), n_estimators = 500, 
    	boostrap =True, n_jobs = -1, oob_score=True)

#학습
b_clf.fit(X_train, y_train)

#예측
pred = v_clf.predict(X_test)

배깅은 sklearn의 BaggingClassifier를 활용하면된다

여기서 중복 추출을 허용할 거면 boostrap = True로 하고 (배깅) 허용하지 않을 거면 False(페이스팅)로 하면된다

똫나 oob평가 활용 여부는 'oob_score' 파라미터로 설정하면 된다

 


 2.3 랜덤 포레스트(Random Forest)

배깅의 일종으로 사실 배깅안에 포함되는 모델

배깅과 랜덤 포레스트의 차이점은 ? : 랜덤 포레스트는 데이터 셋 뿐만 아니라 '설명 변수'도 무작위로 뽑아서 학습

 

높은 성능을 내는 모델로 많이 사용되고 있다

 

장점 :

랜덤 포레스트는 설명변수를 무작위로 추출하여 사용하기 때문에 각 모델의 상관관계를 줄 일 수 있다

즉, 모델의 과적합을 방지할 수 있음

또한 모델의 학습속도가 빠르고 높은 정확성을 낼 수 있다

 

단점 :

하지만 전형적인 '블랙박스'모델 이기 때문에 해석이 불가능함 즉, 결과의 도달 방법을 해석하기 매우 어려움

 

2.3.1  코드

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

#모델정의
rfc = RandomForestClassifier(random_state=0)

#학습
rfc.fit(X_train, y_train)

#예측
y_pred = rfc.predict(X_test)

랜덤 포레스트는 sklearn의 RandomForestClassifier를 이용하면 된다