Broccoli's House

#2-(6) 지도학습 알고리즘 : 결정 트리 앙상블 본문

공부/머신러닝

#2-(6) 지도학습 알고리즘 : 결정 트리 앙상블

김콜리 2018. 2. 1. 18:15

※ 이 글의 내용은 O'REILLY의 <파이썬 라이브러리를 활용한 머신러닝> 책을 기반으로 한다.




지도 학습 알고리즘 : 결정 트리 앙상블




  • 앙상블
 - 앙상블(Ensemble) : 앙상블은 여러 머신러닝 모델을 연결하여 더 강력한 모델을 만드는 기법이다. 큰 데이터 세트가 있을 때, 데이터 세트를 나누어 독립적으로 운영되는 각각의 머신러닝을 통해 학습시킨 뒤 모델을 합쳐 전체 데이터의 결과를 산출하는 방법이다. 단일 머신러닝 모델로 학습하였을 때 보다 2%에서 5%정도 상승된 결과를 얻을 수 있다.

 - 머신러닝에는 여러 종류의 앙상블 모델이 많지만, 그 중에서 모델을 구성하는 기본 요소로 결정 트리를 사용하는 랜덤 포레스트(Random Forest)그래디언트 부스팅(Gradient Boosting) 이 두 앙상블 모델이 분류와 회귀 문제의 다양한 데이터 세트에서 효과적이라고 입증되었다.




  • 랜덤 포레스트

 - 랜덤 포레스트(Random Forest) : 랜덤 포레스트는 기본적으로 조금씩 다른 여러 결정 트리의 묶음으로, 훈련 과정에서 구성한 다수의 결정 트리로부터 분류 또는 회귀 분석 결과를 출력함으로써 동작한다. 랜덤 포레스트를 사용하면 훈련 데이터에 과대적합되는 경향이 있는 단일 결정 트리 학습의 단점을 회피할 수 있다. 

 - 랜덤 포레스트의 아이디어는 각각의 단일 결정 트리는 비교적 예측은 잘 하지만, 데이터 일부에 과대적합(Overfitting)되는 경향을 가진다는데 기초한다. 즉, 작동 자체는 잘하므로 서로 다른 방향으로 과대적합된 트리를 많이 만들고 앙상블시켜 그 결과르 평균낸다면 과대적합된 양을 줄일 수 있다는 것이다. 이렇게 하면 트리 모델의 예측 성능은 유지되면서 과대적합이 줄어들 수 있다는 것이 증명되었다. 



  • 랜덤 포레스트 구축
 - 랜덤 포레스트를 구현하려면 일단 결정 트리를 많이 만들어야 한다. 각각의 트리는 타겟에 대한 예측을 잘 수행해야 하고, 다른 트리와는 구별되어야 한다. 랜덤 포레스트라는 이름에서 알 수 있듯이 구현할 때 트리들이 달라지도록 트리 생성 시에 무작위성을 주입한다. 랜덤 포레스트에서 트리를 랜덤하게 만드는 방법은 두 가지이다. 하나는 트리를 만들 때 사용하는 데이터 포인트를 무작위로 선택하는 방법이고, 다른 하나는 노드가 분기하는 테스트(질문)에서 사용하는 특성을 무작위로 선택하는 방법이다. 

 - 랜덤 포레스트 모델을 만들려면 생성할 트리의 개수를 정해야 한다. 트리들은 완전히 독립적으로 만들어져야 하므로 알고리즘은 각 트리가 고유하게 만들어지도록 무작위한 선택을 한다. 따라서 트리를 만들기 전에 데이터의 부트스트랩 샘플(Bootstrap Sample), 전체 데이터 포인트 중에서 무작위로 데이터를 전체 데이터의 개수만큼 중복 및 반복 추출하여 만든 샘플을 만든다. 부트스트랩 샘플은 원래 데이터 세트와 크기는 같지만, 어떤 데이터 포인트는 누락될 수 있고, 어떤 데이터 포인트는 중복될 수도 있다. 이 샘플 데이터를 토대로 결정 트리를 만든다.

 - 기존의 단일 결정 트리 알고리즘과는 조금 다르게 랜덤 포레스트 결정 트리 알고리즘을 만든다. 기존의 결정 트리는 각 노드에서 전체 특성을 대상으로 최선의 테스트(질문)를 찾는 것인데, 랜덤 포레스트에서는 알고리즘이 각 노드에서 후보 특성을 무작위로 선택한 후에 그 후보들 중에서 최선의 테스트를 찾는 것이다. 이러한 후보 특성을 고르는 것은 매 노드마다 반복되므로 트리의 각 노드는 다른 후보 특성들을 사용하여 테스트를 만들게 된다.  결정 트리를 만들기 전에 데이터 세트 자체도 무작위로 추출해놓고, 그것을 토대로 결정 트리를 만들 때에도 노드가 분기하는(영역을 분할하는) 테스트(질문)의 후보들도 무작위로 추출하는 것이다. 이 두 매커니즘이 합쳐져서 랜덤 포레스트의 모든 트리가 서로 달라지도록 만든다.

 - 이러한 방식에서 핵심적인 매개변수는 후보 특성의 최대 추출 개수(Max feature)이다. 후보 특성의 최대 추출 개수를 전체 특성 개수로 설정하면 트리의 각 분기에서 결국 모든 특성을 고려하므로 특성 선택에 있어서 무작위성이 들어가지 않는다. 만약 후보 특성의 최대 추출 개수를 1로 둔다면 트리의 분기는 테스트(질문)할 특성을 고를 필요 없이 그냥 무작위로 선택한 특성의 임계치를 찾기만 하면된다. 결국 후보 특성 최대 추출 개수를 크게하면 랜덤 포레스트의 각 트리들은 서로 비슷해지고, 가장 두드러진 특성을 이용하여 데이터에 잘 맞춰질 것이다. 반대로 최대 추출 개수를 작게 하면  랜덤 포레스트의 각 트리들은 많이 달라지고, 데이터에 맞추기 위해 깊이가 깊어지게 된다.
 - 랜덤 포레스트로 예측을 할 때는 먼저 알고리즘이 모델에 있는 모든 트리의 예측을 만든다. 회귀의 경우에는 이 예측들의 평균으로 최종 예측을 만든다. 분류의 경우는 먼저 랜덤 포레스트를 구성하는 각각의 트리 알고리즘이 가능성 있는 출력 레이블의 확률을 제공함으로써 간접적인 예측을 한다. 각 트리들이 예측한 확률을 클래스 별로 평균내어 가장 높은 확률을 가진 클래스가 예측값이 된다.




  • 랜덤 포레스트 분석


 - 다섯 개의 트리가 만든 결정 경계가 서로 확연하게 다르다. 부트스트랩 샘플로 인해 한쪽 트리에서 나타나는 훈련 데이터가 다른 트리에는 포함되지 않을 수 있기 때문에, 각 트리는 불완전하다. 다섯개의 트리가 합쳐져 생성된 최종적인 랜덤 포레스트 모델은 개개의 트리보다는 덜 과대적합(Overfitting)되고 훨씬 좋은 결정 경계를 만들어준다. 실제 사용의 경우 수백, 수천 개의 매우 많은 트리를 사용하기 때문에 더 부드러운 결정 경계가 만들어진다. 


 - 기본적으로 랜덤 포레스트는 아무런 매개변수 튜닝 없이도 선형 모델이나 단일 결정 트리보다 높은 정확도를 보인다. 단일 결정 트리에서 한 것 처럼 매개변수를 조정하거나 사전 가지치기를 할 수도 있으나, 랜덤 포레스트는 기본 설정만으로도 좋은 결과를 만들어줄 때가 많다. 결정 트리처럼 랜덤 포레스트 또한 특성 중요도를 제공하는데, 각 트리의 특성 중요도를 취합하여 계산한 것이다. 일반적으로 랜덤 포레스트에서 제공하는 특성 중요도가 하나의 트리에서 제공하는 것보다 더 신뢰할 만하다. 랜덤 포레스트를 만드는 무작위성은 알고리즘이 가능성 있는 많은 경우를 고려할 수 있도록 하므로, 그 결과로 랜덤 포레스트가 단일 트리보다 더 넓은 시각으로 데이터를 바라볼 수 있기 때문이다.




  • 랜덤 포레스트 평가

 - 장점 : 랜덤 포레스트는 회귀와 분류에 있어서 현재 가장 널리 사용되는 머신러닝 알고리즘이다. 기본적으로 랜덤 포레스트는 단일 트리의 단점을 보완하고, 장점을 그대로 가지고 있다. 성능이 매우 뛰어나 매개변수 튜닝을 많이 하지 않아도 잘 작동하며 데이터의 스케일을 맞출 필요도 없다.

 - 단점 : 수십, 수백 개의 트리를 가지고 있는 랜덤 포레스트는 자세히 분석하기 어렵고, 특성의 일부만을 사용하므로 단일 결정 트리보다 더 깊어지는 경향 또한 존재한다. 따라서 비전문가에게 예측 과정을 시각적으로 보여주기 어려운 것이 단점이다. 또한 랜덤 포레스트는 텍스트 데이터 같은 차원이 높고 희소한 데이터에는 잘 작동하지 않는다. 대량의 데이터 세트에서 잘 작동하나 랜덤 포레스트 모델을 생성하기에 선형 모델보다 많은 메모리를 사용하며 훈련과 예측이 느려 시간이 다소 오래 걸린다. 게다가 항상 무작위적이기 때문에 특정 변수(Random state)를 지정해주지 않으면 항상 조금씩 다른 결과를 만들어낸다. 트리가 많아질수록 변동은 적어진다. 




  • 그래디언트 부스팅

 - 그래디언트 부스팅 회귀 트리(Gradient Boosting Regression Tree) : 그래디언트 부스팅 회귀 트리는 여러 개의 결정 트리를 묶어 강력한 모델을 만드는 또 다른 앙상블 방법이다. 선형 분류 모델의 한 종류인 로지스틱 회귀(Logistic Regression)와 마찬가지로 이름에 회귀가 들어가지만 이 모델은 회귀와 분류 모두에 사용할 수 있다. 무작위의 데이터로 한꺼번에 다른 트리들을 만들어 결합하는 랜덤 포레스트와는 달리, 그래디언트 부스팅은 이전 트리의 오차를 보완하는 방식으로 작동하기에 결정 트리를 순차적으로 만들어나간다. 이전에 만든 트리의 예측과 타겟 값 사이의 오차를 줄이는 방향으로 새로운 트리를 추가하는 알고리즘이다. 이를 위해 손실 함수(Cost Function)를 정의하고 경사 하강법(Gradient Descent)을 사용하여 다음에 추가될 트리가 예측해야 할 값을 보정해나간다.


 - 기본적으로, 그래디언트 부스팅 회귀 트리에는 무작위성이 없다. 대신 사전 가지치기가 매우 강력하게 사용된다. 즉, 그래디언트 부스팅 트리는 얕은 트리같은 간단한 모델(약한 학습기 : Weak Learner)들을 많이 연결하여 하나의 앙상블 모델을 만든 것이다. 그래디언트 부스팅 트리에는 보통 1에서 5정도의 깊지 않은 트리들을 사용하여 메모리를 적게 사용하고 예측도 빠르다. 각 트리의 깊이가 깊지 않아 각각의 트리는 데이터의 일부에 대해서만 예측을 잘 수행할 수 있기 때문에 트리가 많이 추가될수록 성능이 좋아진다.


 - 그래디언트 부스팅 트리는 랜덤 포레스트보다는 매개변수 설정에 조금 더 민감하지만 잘 조정만 한다면 더 높은 정확도를 제공해준다. 앙상블 방식에 있는 사전 가지치기나 트리의 개수 외에도 그래디언트 부스팅에서 중요한 매개변수는 이전 트리의 오차를 얼마나 강하게 보정할 것인지를 제어하는 학습률(Learning Rate)이다. 학습률이 크면 트리는 보정을 강하게 하기 때문에 복잡한 모델을 만든다. 또한 앙상블에 트리의 개수를 많이 추가하면 모델의 복잡도가 커지고 훈련 세트에서의 실수를 바로잡을 기회가 더 많아진다.(일반화 성능은 떨어진다)


 - 그래디언트 부스팅 트리 또한 다른 결정 트리 기반의 모델처럼 특성 중요도가 존재한다. 다만 그래디언트 부스팅 트리는 일부 특성을 완전히 무시한다는 점에서 전체적인 특성을 대부분 사용하는 랜덤 포레스트 방식과는 차이를 보인다. 따라서 비슷한 종류의 데이터라면 그래디언트 부스팅과 랜덤 포레스트 모두 잘 작동하지만, 일반적으로 더 안정적인 랜덤 포레스트를 먼저 적용한다. 랜덤 포레스트가 잘 작동한다 하더라도 예측 시간이 중요하거나 머신러닝 모델에서 마지막 성능까지 필요할 때 그래디언트 부스팅을 사용하면 도움이 된다. 또한 랜덤 포레스트는 과대적합된 모델들을 이용하기 때문에 트리의 개수가 많을 수록 좋지만, 그래디언트 부스팅은 트리의 개수가 많아지면 과대적합되기 때문에 적절한 변수 조정이 필요하다.




  • 그래디언트 부스팅 트리 평가

 - 장점 : 그래디언트 부스팅 결정 트리는 다른 트리 기반 모델처럼 특성의 스케일을 조정하지 않아도 되고, 이진 특성이 연속적인 특성에서도 잘 동작한다.

 - 단점 : 가장 큰 단점은 매개변수를 잘 조정해야 한다는 것과 훈련 시간이 길다는 것이다. 또한 트리 기반 모델의 특성상 희소한 고차원 데이터에는 잘 작동하지 않는 다는 것이 단점이다.


Comments