AI & Data/Machine Learning

[머신러닝] 앙상블 (Ensemble)

테드리 2024. 4. 29. 19:40

앙상블이란?

앙상블 기법이란 여러 개의 분류기를 생성하고 그 예측을 결합함으로써 보다 더 좋은 최종 예측을 도출하는 기법을 말한다. 앙상블 학습의 목표는 다양한 분류기의 예측 결과를 결합함으로써 단일 분류기보다 예측 신뢰성을 높이는 것이다. 

 

1. Voting

앙상블 기법에는 여러 가지 알고리즘이 있는데, 우선 보팅(Voting) 알고리즘부터 살펴보자. 보팅이란 서로 다른 알고리즘을 가진 분류기가 동일한 데이터셋을 가지고 각자 예측을 수행하여 최종 결과를 결정하는 방식이다. 이때, 각 분류기가 예측한 결과를 가지고 '투표' 방식으로 최종 결과를 결정하기 때문에 Voting이라고 불린다.

 

이 투표 방식에는 두 가지 방식이 있는데, Hard Voting과 Soft Voting이 있다.

1.1. Hard Voting

Hard Voting이란 다수의 분류기가 예측한 결과값 자체를 최종 결과값으로 설정하는 방식이다. 예를 들어, 4개의 분류기가 예측을 수행하여, 3개의 분류기가 '0'으로, 1개의 분류기가 '1'로 예측을 했으면 최종 예측 결과는 '0'이 된다. 

1.2. Soft Voting

Soft Voting은 분류기들의 레이블 값 결정 확률을 모두 더하여 평균을 내고, 그 값이 더 높은 쪽의 클래스를 최종 예측 결과로 선정하는 방식이다.

 

위의 그림을 보면, 클래스 1에 대한 예측 확률의 평균은 0.8, 클래스 2에 대한 예측 결과의 평균은 0.2이기 때문에 평균 확률이 더 높은 클래스 1이 최종 예측 결과가 된다. 소프트 보팅은 하드 보팅과 달리 확률을 기반으로 하기 때문에 비교적 더 많이 쓰인다.

 

동일한 데이터에 대해 하드보팅의 결과와 소프트보팅의 결과가 항상 같은 것은 아니다. 예를 들어, 클래스 1에 대한 예측 확률이 각각 (0.9, 0.4, 0.4, 0.4)이고 클래스 2에 대한 예측 확률이 각각 (0.1, 0.6, 0.6, 0.6)이라고 하자. 만약 하드 보팅을 수행한다면, 클래스 1이 1개, 클래스 2가 3개 이므로 클래스 2로 최종 결과가 나올 것이다. 그러나 실제 확률의 평균의 구해보면 클래스 1의 평균 확률이 0.525로 더 높다. 따라서 소프트 보팅을 수행하면 클래스 1이 최종 결과가 된다. 

 

<보팅 분류기 소스 코드>

from sklearn.model_selection import VotingClassifier

#Logistic Regression과 KNN을 이용한 보팅
lr_clf = LogisticRegression(solver = 'liblinear')
knn_clf = KNeighborsClassifier(n_neighbors = 8)

vo_clf = VotingClassifier(estimators = [('LR', lr_clf), ('KNN', knn_clf)], voting = 'soft')

 

2. Bagging

배깅 (Bootstrap Aggregating)이란 서로 같은 알고리즘을 가진 분류기가 서로 다른 데이터 샘플링을 이용해 최종 결과를 도출하는 방식이다.

 

from sklearn.svm import SVC
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import make_classification

X,y = make_classification(n_samples = 100, n_features = 4, n_informative = 2, n_redundant = 0, random_state = 0, shuffle = False)

clf = BaggingClassifier(estimator = SVC(), n_estimators = 10, random_state = 0).fit(X,y)
clf.predict([0,0,0,0])

 

2.1. Random Forest

랜덤 포레스트 (Random Forest)는 대표적인 배깅 알고리즘 중 하나로, 분류기로 결정 트리 모델(Decision Tree)을 기반으로 한다. 즉, 여러 개의 결정 트리 모델이 모여서 랜덤하게 샘플된 데이터를 통해 반복 학습하여 마치 숲을 이룬다는 의미로 랜덤 포레스트라고 부른다.

2.2. OOB(Out of Bag) Score

Out of Bag 인스턴스는 각 모델에 대해 훈련에 사용되지 않은 일부 데이터를 의미하는데, 훈련에 사용되지 않았기 때문에 테스트 셋의 역할을 할 수 있다. 따라서 학습 데이터로 나온 예측값과 OOB 샘플로 테스트한 결과값의 오차를 기반으로 정확도를 계산할 수 있다. 이를 OOB score이라고 하고, 이를 기반으로 머신 러닝의 성능 평가를 할 수 있다. 

 

3. Boosting

Boosting이란 여러 개의 약한 모델을 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치를 부여해 오류를 개선해 나아가는 방식이다.

 

3.1. AdaBoost

 

1. 첫번째 약한 학습기가 첫번째 분류기준(D1)으로 분류

2. 잘못 분류된 것들에 대해 가중치 부여

3. 두번째 약한 학습기가 두번째 분류기준(D2)으로 분류

4. 잘못 분류된 것들에 다시 가중치 부여

 

이 과정을 n번 반복하고 더 이상 가중치가 갱신이 안 될 때 까지 학습

 

[예제 코드]

from sklearn.ensemble import AdaBoostClasifier
from sklearn.datasets import make_classification

X, y = make_classifications(n_samples = 1000, n_features = 4, n_informative = 2, n_redundant = 0, random_state = 11, shuffle = False)
clf = AdaBoostClassifier(n_estimators = 100, algorithm = 'SAMME', random_state = 11)
clf.fit(X,y)

clf.score(X,y)

 

3.2. GBM (Gradient Boosting Machine)

GBM도 Boosting 알고리즘 중 하나로써 가중치를 갱신하는 방식인데, GBM은 경사하강법이라는 기법을 사용한다. 

 

경사하강법" target="_blank" rel="noopener" data-mce-href="http://경사하강법">http://경사하강법

 

[기계학습] Gradient Descent (경사하강법)

1. ML as an Optimization Problem 기계학습이 해야 할 일을 식으로 정의하면, 주어진 cost function $J(\theta)$에 대해, $J(\theta)$를 최소로 하는 $\hat{\theta}$를 찾는 것. $$ \hat{\theta} = argmin_{\theta}J(\theta)$$ 2. Iterativ

taekyounglee1224.tistory.com

 

- GBM의 하이퍼 파라미터 튜닝

  • loss : 비용함수를 지정. 기본값인 ‘deviance’를 적용하기
  • learning rate : 학습률. 0~1사이의 값을 지정할 수 있으며 기본값은 0.1 가장 중요한 파라미터
  • n_estimators : weak learner의 개수. 개수가 많을수록 수행시간 오래 걸림
  • subsample : 학습에 사용하는 데이터 샘플링의 비율. 기본값은 1이며, 이 의미는 전체 학습 데이터를 기반으로 학습한다는 의미. 0.5면 학습 데이터의 50%를 가지고 학습한다.

[예제 코드]

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=11)

# 과대적합을 막기 위해 max_depth 줄이기
gbrt = GradientBoostingClassifier(random_state=11, max_depth=2)
gbrt.fit(X_train, y_train)

gbrt.predict(X_test)

gbrt.score(X_train, y_train)
gbrt.score(X_test, y_test)

 

 

3.3. XGBoost

XGBoost는 Decision Tree Model을 이용하여 Gradient Boosting과 같이 잔차를 이용하여 이전 모형의 약점을 보완하는 방식으로 학습한다. XGBoost는 병렬학습이 지원되도록 구현한 라이브러리이다. 부스팅 과정의 각 반복에서 교차 검증을 수행할 수 있는 내장 기능을 가지고 있어 모델의 성능과 견고함을 최대화할 수 있다.

 

[예제 코드]

from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier
   
xgb = XGBClassifier(n_estimators=400, learning_rate=0.05, max_depth=3, eval_metric='logloss')
xgb.fit(X_train, y_train, verbose=True)
pred = xgb.predict(X_test)
print('xgb accuracy: {:.2f}'.format(accuracy_score(y_test, pred)))

 

참고문헌

파이썬 머신러닝 완벽 가이드" target="_blank" rel="noopener" data-mce-href="http://파이썬 머신러닝 완벽 가이드">http://파이썬 머신러닝 완벽 가이드

 

파이썬 머신러닝 완벽 가이드 - 예스24

자세한 이론 설명과 파이썬 실습을 통해 머신러닝을 완벽하게 배울 수 있다!『파이썬 머신러닝 완벽 가이드』는 이론 위주의 머신러닝 책에서 탈피해, 다양한 실전 예제를 직접 구현해 보면서

www.yes24.com

 

[앙상블 실습 코드]

앙상블" target="_blank" rel="noopener" data-mce-href="http://앙상블">http://앙상블

 

GitHub - taekyounglee1224/Bitamin: 빅데이터 연합동아리 Bitamin에서 진행한 실습 및 프로젝트

빅데이터 연합동아리 Bitamin에서 진행한 실습 및 프로젝트. Contribute to taekyounglee1224/Bitamin development by creating an account on GitHub.

github.com

(ML Session -> Ensemble.ipynb)