Ensemble Learning (앙상블 학습)
앙상블 학습을 통한 분류는 여러 개의 분류기를 생성하고 그 예측을 도출하는 기법을 말한다. 이렇게 하는 이유는 각각의 장단점을 지닌 다양한 분류기의 예측 결과를 결합함으로써 단일 분류기보다 신뢰성이 높은 예측값을 얻기 위함이다.
앙상블 학습의 유형은 전통적으로 보팅(Voting), 배깅(Bagging), 부스팅(Boosting)의 세 가지로 나눌 수 있으며, 이외에도 스태깅을 포함한 다양한 앙상블 방법이 있다. 보팅과 배깅은 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식이다. 보팅과 배깅의 다른 점은 보팅의 경우 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는 것이고, 배깅의 경우 각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만, 데이터 샘플링을 다르게 가져가면서 학습을 수행해 보팅을 수행하는 것이다. 대표적인 배깅 방식이 Random Forest 방식이다.
배깅 방식에서 개별 분류기에 할당된 샘플 데이터는 원본 학습 데이터에서 샘플링해 추출하는데 이러한 방식을 Bootstrapping 분할 방식이라고 한다. 이때 교차 검증에서 데이터 세트간의 중첩을 허용하지 않는 반면에 배깅 방식은 중첩을 허용한다.
부스팅은 여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에게는 Weight(가중치)를 부여하면서 학습과 예측을 진행하는 것이다.
스태킹은 여러 가지 다른 모델의 예측 결과값을 다시 학습 데이터로 만들어서 다른 모델로 재학습시켜 결과를 예측하는 방법이다.
보팅 유형 - Hard Voting, Soft Voting
보팅 방법에는 두 가지가 있다. 먼저 하드 보팅을 이용한 분류는 다수결 원칙과 비슷하다. 즉, 에측한 결과값들중 다수의 분류기가 결정한 예측값을 최종 보팅 결과값으로 선정하는 것이다. 소프트 보팅은 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결과값으로 선정한다.

일반적으로 하드 보팅보다는 소프트 보팅이 예측 성능이 좋아서 더 많이 사용된다.
Voting Classifier (보팅 분류기)
사이킷런에서는 이러한 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스를 제공하고 있다. 아래는 위스콘신 유방암 데이터 세트, 로지스틱 회귀와 KNN을 기반으로 보팅 분류기를 만드는 과정이다.
Voting classifier 클래스는 주요 생성 인자로 estimator와 voting 값을 입력 받는다.
estimator는 리스트 값으로 보팅에 사용될 여러 개의 Classifier 객체들을 튜플 형식으로 입력 받으며 voting은 'hard'시 하드 보팅, 'soft'시 소프트 보팅 방식을 적용하라는 의미 (default는 hard)


보팅 분류기의 성능이 일반 로지스틱으로 할때보다 낮게 나왔는데 보팅으로 여러 개의 기반 분류기를 결합한다고 해서 무조건 기반 분류기보다 예측 성능이 향상되는 것은 아니다. 데이터의 특성과 분포 등 다양한 요건에 따라 오히려 기반 분류기 중 가장 좋은 분류기의 성능이 보팅했을 때보다 나을 수 있다. 그럼에도 불구하고 앙상블 방법은 전반적으로 다른 단일 ML알고리즘보다 뛰어난 예측 성능을 가지는 경우가 많다. 고정된 데이터 세트에서 단일 ML 알고리즘이 뛰어난 성능을 발휘하더라도 현실 세계에서는 다양한 변수와 예측이 어려운 규칙으로 구성돼있다. 다양한 관점을 가진 알고리즘이 서로 결합해 더 나은 성능을 실제 환경에서 끌어낼 수 있다.
랜덤 포레스트
배깅의 대표적인 알고리즘은 바로 랜덤 포레스트이다. 랜덤 포레스는 다재 다능한 알고리즘이다. 앙상블 알고리즘 중 비교적 빠른 수행 속도를 가지고 있으며, 다양한 영역에서 높은 예측 성능을 보이고 있다. 랜덤 포레스트는 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤 최종적으로 모든 분류기가 보팅을 통해 예측 결정을 하게 된다.
랜덤 포레스트는 개별적인 분류기의 기반 알고리즘은 결정 트리이지만 앞서 말했듯이 트리가 학습하는 데이터 세트는 전체 데이터에서 일부가 중첩되게 샘플링된 데이터 세트이다. 이렇게 여러 개의 데이터 세트를 중첩되게 분리하는 것을 부트스트래핑 분할 방식이라고 한다. 즉, 랜덤 포레스트의 서브세트의 데이터 건수는 전체 데이터 건수와 동일하지만 개별 데이터가 중첩되어 만들어진다. 서브세트의 데이터 건수는 전체 데이터 건수와 동일하지만, 개별 데이터가 중첩되어 만들어짐 원본 데이터 건수가 10개인 학습 데이터 세트에 랜덤 포레스트를 3개의 결정 트리 기반으로 학습하려고 n_estimator=3으로 하이퍼 파라미터를 부여하면 아래와 같은 형태로 서브 세트가 나누어진다.

사이킷런은 RandomForestClassifier 클래스를 통해 랜덤 포레스트 기반의 분류를 지원한다.

트리 기반의 앙상블 알고리즘의 단점은 뽑으면 파라미터가 너무 많고 그로 인해서 튜닝을 위한 시간이 많이 소모된다는 것이다. 더구나 많은 시간을 소모했음에도 튜닝 후 예측 성능이 크게 향상되는 경우가 많지 않는 경우가 많다.
n_estimator : 랜덤 포레스트에서 결정 트리의 개수를 지정. 디폴트는 10. 많이 설정할수록 좋은 성능을 기대할 수 있지만 무조건적으로 좋아지는 것은 X, 늘릴수록 학습시간 증가
max_features : 결정 트리에 사용된 max_feature 파라미터와 같다.하지만 RandomForestClassifier의 기본 max_features는 'None'이 아니라 'auto', 즉 'sqrt'와 같다.
max_depth, min_samples_leaf와 같이 결정 트리에서 과적합을 개선하기 위해 사용되는 파라미터가 랜덤 포레스트에도 똑같이 적용가능하다.
'Machine Learning' 카테고리의 다른 글
| [파이썬 머신러닝 완벽가이드(위키북스)] : 분류 part4 캐글 신용카드 사기 검출 실습 (0) | 2021.11.21 |
|---|---|
| [파이썬 머신러닝 완벽가이드(위키북스)] : 분류 part3 (GBM, XGBoost, LightGBM) (0) | 2021.11.21 |
| [파이썬 머신러닝 완벽가이드(위키북스)] : 분류 part1 (0) | 2021.11.19 |
| [파이썬 머신러닝 완벽가이드(위키북스)] : 평가 (0) | 2021.11.11 |
| [파이썬 머신러닝 완벽가이드(위키북스)] : 사이킷런 (0) | 2021.11.08 |
댓글