Thief of Wealth

(파이썬 머신러닝 완벽가이드 발췌)


- 개요

앙상블 학습을 통한 분류는 여러개의 분류기를 생성하고 그 예측을 결합함으로써 보다 정확한 최종예측을 도출하는 기법을 말합니다.

어려운 문제의 결론을 내기위해 여러명의 전문가로 위원회를 구성해 다양한 의견을 수렴하고 결정하듯이 앙상블 학습의 목표는 다양한 분류기의 예측결과를 결합함으로써,

단일 분류기보다 신뢰성이 높은 예측값을 얻는 것입니다.


이미지, 영상, 음성 등의 비정형 데이터의 분류는 딥러닝이 뛰어난 성능을 보이고 있지만, 대부분의 정형데이터 분류시에는 앙상블이 뛰어난 성능을 나타내고 있습니다.

앙상블 알고리즘의 대표격인 랜덤포레스트와 그래디언트 앙상블이 뛰어난 성능을 나타내고 있습니다.

앙상블 알고리즘의 대표적인 랜덤포레스트와 그래디언트 부스팅 알고리즘은 뛰어난 성능과 쉬운 사용, 다양한 활용도로 인해 그간 분석가 및 데이터 과학자들 사이에서 많이 애용되어 왔습니다.

부스팅 계영의 앙상블 알고리즘의 인기와 강세가 계속 이어져 기존의 그래디언트 부스팅을 뛰어넘는 새로운 알고리즘의 개발이 가속화되었습니다.

데이터과학자들이 기량을 겨루는 캐글에서 매력적인 솔류션으로 불리는 XGBoost, LightGBM, Stacking을 포함해서 다양한 유형의 앙상블 알고리즘이 머신러닝 선도 알고리즘으로 인기를 모으고 있습니다.


XGBoost, LightGBM같은 최신 앙상블모댈 한두개만 알고있어도, 정형데이터의 분류나 회귀분야에서 예측성능이 매우 뛰어난 모델을 쉽게 만들 수 있습니다



그만큼 쉽고 편하면서도 강력한 성능을 보유하고 있는것이 바로 앙상블 학습의 특징입니다.



- 유형

앙상블 학습의 유형으로는 보팅, 배깅, 부스팅 의 세가지로 나눌 수 있으며, 이외에도 스태킹을 포함한 다양한 앙상블 방법이 있습니다.

보팅과 배깅의 다른점은

보팅의 경우, 일반적으로 서로다른 알고리즘을 가진 분류기를 결합하는 것이고,


배깅의 경우, 각각의 분류기가 모두 같은 유형의 알고리즘을 기반으로 하지만, 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행(부트스트래핑)해 보팅을 수행하는 것입니다.

여기에 대표적인 방식이 바로, 랜덤포레스트 방식입니다.


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

예측성능이 뛰어나서 앙상블학습을 주도하고 있으며, 대표적인 부스팅모댈로 XGBoost, LightGBM등이 있습니다.


스태킹은 여러가지 다른 모델의 예측 결괏값을 다시 학습데이터로 만들어서 다른 모델로 재학습시켜 결과를 예측하는 방법입니다.



- 랜덤포레스트


배깅은 앞서 소개한 보팅과는 다르기, 같은 알고리즘으로 여러개의 분류기를 만들어서 보팅으로 촤종결정하는 알고리즘입니다.

배깅의 대표적인 알고리즘은 랜덤포레스트입니다.


랜덤포레스트는 다재다능한 알고리즘입니다. 앙상블 알고리즘 중 비교적 빠른 수행 속도를 가지고 있으며, 다양한 영역에서 높은 예측성능을 보이고 있습니다.

랜덤 포레스트의 기반 알고리즘은 결정트리로써 결정트리의 쉽고 직관적인 장점을 그대로 가지고 있습니다. ( 랜덤포레스트뿐만 아니라 부스팅기반의 다양항 앙상블 알고리즘역시 대부분 결정트리 알고리즘을 기반으로 채택하고 있습니다. )


랜덤 포레스트는 여러개의 결정트리분류기전체데이터에서 배깅방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한뒤, 

최종적으로 모든 분류기가 보팅을 통해 예측 결정을 하게됩니다.


- GBM, AdaBoost

부스팅 알고리즘은 여러개의 약한 학습기 (weak learner)를 순차적으로 학습-예측하면서 잘못예측한 데이터에 대해 가중치를 부여해서 오류를 개선해 나가면서 학습하는 방식이다,

부스팅의 대표적인 구현은 AdaBoost와 GradientBoost가 있다.


AdaBoost는 예측후 틀린것들에 대해서 가중치를 부여해서 오류조절

GBM은 AdaBoost에서 가중치 업데이트를 경사하강법을 이용해서 하는것.


- XGBoost

XGBoost는 GBM에 기반하고 있지만, GBM의 단점인 느린 수행시간 및 과적합 규제 부재 등의 문제를 해결해서 매우 각광받고있습니다.


1) 일반적으로 분류와 회귀영역에서 뛰어난 예측성능을 발휘합니다.

2) 일반적인 GBM은 순차적으로 Weak learner가 가중치를 증감하는 방법으로 학습하기 때문에, 전반적으로 속도가 느립니다.

하지만 XGBoost는 병렬 수행 및 다양한 기능으로 GBM에 비해 빠른 수행성능을 보장합니다.


아쉽게도, XGBoost가 일반적인 GBM에 비해 수행시간이 빠르다는 것이지, 다른 머신러닝알고리즘보다 빠르다는 얘기는 아닙니다.

3) 과적합규제.

표준 GBM의 경우 과적합 규제 기능이 없으나 XGBoost는 자체에 과적합 규제 기능으로 과적합에 좀 더 강한 내구성을 가질 수 있습니다.


4) Tree Prunning   

일반적으로 GBM은 분할 시 부정 손실이 발생하면, 분할을 더 이상 수행하지 않지만, 이러한 방식도 자칫 지나치게 많은 분할을 발생할 수 있습니다.

다른 GBM과 마찬가지로, XGBoost도 max_depth파라미터로 분할깊이를 조정하기도 하지만, tree prunning으로 더 이상 긍정이득이 없는 분할을 가지치기 해서,

분할 수를 더 줄이는 추가적인 장점을 가지고 있습니다.


5) 자체 내장된 교차검증

XGBoost는 반복수행시마다 내부적으로 학습데이터 세트와 평가 데이터 세트에 대한 교차검증을 수행해 최적화된 반복수행횟수를 가질 수 있습니다.

지정된 반복횟수가 아니라 교차검증을 통해 평가 데이터 세트의 평가값이 최적화돠면 반복을 중간에 멈출수있는 조기 중단 기능이 있습니다.


6) 결손값 자체처리.

XGBoost는 결손값을 자체 처리할 수 있는 기능을 가지고 있습니다.



-LightGBM

XGBoost는 매우 뛰어난 부스팅 알고리즘이지만, 여전히 학습시간이 오래걸립니다.

XGBoost에서 GridSearchCV로 하이퍼 파라미터 튜닝을 수행하다보면, 수행시간이 너무 오래걸려서 많은 파라미터를 튜닝하기에 어려움을 겪을 수 밖에 없습니다ㅣ

물론 GBM보다 빠르겠지만, 대용량 데이터의 경우 만족할 만한 학습성능을 기대하려면 많은 CPU코어를 가진 시스템에서 높은 병렬도로 학습을 진행해야합니다.

그렇지 않은 HW로 학습을 하면, 당연히 더 많은 시간이 필요하기에 불편함이 커질 수 밖에 없습니다.


LightGBM의 가장 큰 장점은 XGBoost보다 학습에 걸리는 시간이 훨씬 적다는 점입니다.

또한 메모리 사용량도 상대적으로 적습니다. 


사실 LightGBM과 XGBoost의 예측성능은 별다른 차이가 없습니다.

그러나 기능상의 다양성은 LightGBM이 더 많습니다. 더 최신것이기 때문이죠.


단점으로 알려진것중 하나는 데이터의 수가 적으면 과적합이 발생하기 쉽다는 것입니다. (공식문서에서 10000개 이하.)


LightGBM은 일반 GBM계열의 트리 분할방법과 다르게 리프중심트리분할 (leaf wise)방식을 사용합니다.


기존의 대부분 트리 기반 알고리즘은 트리의 깊이를 효과적으로 줄이기 위한 균형 트리 분한 방식을 사용합니다.

즉, 최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 깊이가 최소화 될 수 밖에 없습니다.

이렇게 균형잡힌 트리를 생성하는 이유는 오버피팅에 보다 더 강한 구조를 가질 수 있다고 알려져있기 때문입니다.

반대로, 균형을 맞추기위한 시간이 필요하다는 상대적인 단점이 있습니다.


하지만 LightGBM의 리프 중심 트리분할 방식은 트리의 균형을 맞추지 않고, 최대손실 값을 가지는 리프노드를 지속적으로 분할하면서,

트리의 깊이가 깊어지고, 비대칭적인 규칙트리가 생성됩니다.


하지만 이렇게 최대 손실값을 가지는 리프노드를 지속적으로 분할해 생성된 규칙트리는 학습을 반복할 수록, 

결국은 균형트리분할방식보다 예측오류 손실을 최소화할 수 있다는 것이 LightGBM의 구현 사상입니다.


장점: 

더 빠른 학습과 예측 수행시간.

더 작은 메모리 사용량

카테고리형 피처의 자동변환과, 최적분할(원핫인코딩안하고도 카테고리형 피처로 만듬.)



- 스태킹 앙상블


스태킹은 개별적인 여러 알고리즘을 서로 결합해 예측결과를 도출한다는 점에서 앞에 소개한 배깅, 및 부스팅과 공통점을 가지고 있습니다.

하지만 가장 큰 차이점은 개별알고리즘으로 예측한 데이터를 기반으로 다시 예측을 수행한다는 점입니다.


즉, 개별 알고리즘ㅇ의 예측결과, 데이터 세트를 최종적인 메타 데이터 세트로 만들어 별도의 ML알고리즘으로 최종학습을 수행하고 

테스트 데이터를 기반으로 다시 최종예측을 수행하는 방식입니다.


스태킹모델은 두 종류의 모델이 필요합니다.

첫 번째는 개별적인 기반 모델이고

두 번째는 이 개별 기반모델의 예측데이터를 학습 데이터로 만들어서 학습하는 최종 메타 모델입니다.

스태킹 모델의 핵심은 여러 개별 모델의 예측 데이터를 각각 스태킹 형태로 결합해 최종 메타 모델의 학습용 피처 데이터 세트와 테스트용 피처 데이터 세트를 만드는 것입니다.


스태킹을 현실 모델에 적용하는 경우는 그렇게 많지 않습니다만,

 캐글과 같은 대회에서 높은 순위를 차지하기 위해 조금이라도 성능수치를 높여야 하는 경우 사용됩니다.


스태킹을 적용할때는 많은 개별 모델이 필요합니다.

2~3개의 개별 모델만을 결합해서는 쉽게 예측 성능을 향상시킬 수 없고, 스태킹을 사용한다고 해서 반드시 성능이 향상 되리라는 보장도 없습니다.

일반적으로 성능이 비슷한 모델을 결합해서 좀더 나은 성능 향상을 도출하기 위해 적용됩니다.























'개발 > ML+ Data Science' 카테고리의 다른 글

머신러닝 요약집  (0) 2019.07.28
최신 머신러닝 논문 보기  (0) 2019.07.28
DecisionTree (결정트리)란? (필사)  (0) 2019.07.26
KFold 교차검증과 Stratified KFold 차이점.  (0) 2019.07.26
Mac에서 Graphviz 설치?  (0) 2019.07.23
profile on loading

Loading...