위키북스의 파이썬 머신러닝 완벽 가이드 책을 토대로 공부한 내용입니다.
앙상블 학습(Ensemble Learning)을 통한 분류는 여러 개의 분류기(Classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법을 말한다. 대표적인 앙상블 알고리즘은 랜덤 포레스트와 그래디언트 부스팅은 뛰어난 성능과 쉬운 사용, 다양한 활용도로 많이 애용도어왔다. 특히, 부스팅 계열의 알고리즘의 개발이 가속화되어 '매력적인 솔루션'으로 불리는 XGBoost, XGBoost와 유사한 성능을 보이면서 훨씬 빠른 수행 속도를 가진 LightGBM, 여러 가지 모델의 결과를 기반으로 메타 모델을 수립하는 스태킹(Stacking)을 포함하여 다양한 유형의 앙상블 알고리즘이 머신러닝의 선도 알고리즘으로 인기를 모으고 있다.
전통적인 앙상블 학습의 유형으로는 보팅(Voting), 배깅(Bagging), 부스팅(Boosting) 3가지로 나눌 수 있고, 이외에 스태킹 등 다양한 앙상블 방법이 있다. 보팅과 배깅은 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식이며, 다른 점은 보팅의 경우엔 일반적으로 서로 다른 알고리즘의 분류기가 공통적으로 전체 dataset을 공유하며 결합하는 것이고, 배깅은 같은 유형의 알고리즘을 가진 분류기가 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해 보팅을 수행하는 것이다. 대표적인 배깅 방식이 랜덤 포레스트 알고리즘이다. 아래 그림과 같이 수행되며 아래 오른쪽 배깅 방식에서 사용된 방식과 같이 개별 Classifier에게 데이터를 샘플링해서 추출하는 방식을 부트스트래핑(Bootstrapping) 분할 방식이라고 부르고, 개별 분류기가 부트스트래핑 방식으로 샘플링된 dataset에 대해서 학습을 한 후 개별적인 예측을 수행한 결과를 보팅을 통해 최종 예측 결과를 선정하는 방식을 배깅 앙상블 방식이라고 부른다. 그리고 교차 검증이 datset간의 중첩을 허용하지 않는 것과는 다르게 배깅 방식은 중첩을 허용한다.
부스팅은 여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서 올바르게 예측할 수 있도록 다음 분류기에게는 가중치(weight)를 부여하면서 학습과 예측을 진행하는 것이다. 예측 성능이 뛰어나 앙상블 학습을 주도하고 있으며, 대표적인 부스팅 모듈로 그래디언트 부스트, XGBoost(eXtra Gradient Boost), LightGBM(Light Gradient Boost)가 있다.
스태킹은 여러 가지 다른 모델의 예측 결과값을 다시 학습 데이터로 만들어서 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방법이다.
보팅에는 하드 보팅과 소프트 보팅이 있다. 하드 보팅을 이용한 분류는 다수결 원칙과 비슷하다. 예측 결과들중 다수의 분류기가 결정한 예측 값을 최종 보팅 결과값으로 선정하는 것이다. 소프트 보팅은 분류기들의 label 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 label 값을 최종 보팅 결과값으로 선정한다. 일반적으로 하드 보팅보다는 소프트 보팅이 예측 성능이 좋아서 더 많이 사용된다.
사이킷런은 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스를 제공한다. 이를 이용해 위스콘신 유방암 dataset을 예측 분석해보겠다. 위스콘신 유방암 dataset은 유방암의 악성종양, 양성종양 여부를 결정하는 이진 분류 dataset이다. 로지스틱 회귀와 KNN(K Nearest Neighbor)을 기반으로 보팅 분류기를 만들어 볼 것이다.
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() # 개별 모델은 로지스틱 회귀와 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)))
[output] VotingClassifier 클래스는 주요 인자로 estimator와 voting 값을 입력 받는다. estimators는 리스트 값으로 보팅에 사용될 여러 개의 Classifier 객체들을 튜플 형식으로 입력 받고, voting은 defalut는 'hard'로 되어 있어 소프트 보팅 방식을 적용하려면 'soft'를 입력해주면 된다.
결과를 보면 보팅 분류기가 조금 높게 나왔는데, 보팅으로 여러 분류기를 결합한다고 해서 무조건 성능이 향상되는 것은 아니다. 고정된 dataset에서 단일 ML 알고리즘이 뛰어난 성능을 발휘하더라도 현실의 다른 데이터들은 다양한 변수와 예측이 어려운 규칙으로 구성되어 있어 실제 환경에서는 성능을 이끌어 내지 못할 수 있다. 따라서 ML 모델이 어떻게 높은 유연성을 가지고 현실에 대처할 수 있는가가 중요한 ML의 평가 요소이며, 이런 관점에서 bias-variance trade-off는 ML 모델이 극복해야 할 중요한 과제이다. 결정 트리 알고리즘은 쉽게 과적합이 발생할 수 있지만 앙상블 학습에서는 이 단점을 매우 많은 분류기를 결합하여 다양한 상황을 학습하게 함으로써 극복하고 있다. 결정 트리 알고리즘의 장점은 그래도 취하고 단점은 보완하면서 bias-variance trade-off의 효과를 극대화할 수 있다는 것이다.