머신러닝과 딥러닝/머신러닝

RandomForest-랜덤포레스트

Stat_in_KNU 2021. 2. 15. 16:31

도입

제가 아는 한에서 RandomForest는 가장 가성비 좋은(?) ML 알고리즘입니다. 그렇게 복잡하지 않으면서 준수한 성능을낼 수 있고 이해하는데에도 큰 어려움이 없으면서 다른 복잡한 모델에 비해 Explainable합니다. 

RandomForest에 대해서 간단하게 알아보도록 하겠습니다.


앙상블

앙상블은 다른 모델들을 조합해 예측력을 향상시키는 것을 말합니다. 그리고 랜덤포레스트는 배깅 앙상블 기법입니다.

 

배깅

학교에서 데이터 마이닝을 수강하면서 Boostrap과 bagging을 접해 이해에 큰 어려움이 없었습니다.  

Bagging은 Boostrap Aggregating의 준말로 쉽게 말해 복원추출 기반의 Sampling 기법이라고 생각하면 됩니다.

위 이미지를 기반으로 설명해보자면, 

1. D라는 전체 데이터가 있습니다.

2. D와 같은 갯수의 데이터를 전체데이터에서 복원추출하고 이 데이터셋을 D1이라고 합니다.

3. D1 데이터를 통해 트리를 만듭니다.

4. 위 방법과 마찬가지로 M개의 또다른 Dm과 각각의 트리를 만듭니다. 각각의 트리들은 크기도 크고 Pruning을 거치지 않은 것입니다.

5. m개 트리의 평균을 통해 예측을 합니다. 분류 트리라면 평균이 아닌 Voting방식으로 예측하면 됩니다.

 

이러한 방법이 어떤 장점이 있을까요?

원래 데이터셋 Train - Test 과정에서 TrainSet 변동 문제가 생깁니다. Boostrap 검증은 Train set 변동성을 해결하고 예측력도 유지할 수 있습니다. (Cross validation과는 구분되는 방법입니다)

Boostrap 검증은 자연스럽게 Out-of-bag를 검정셋으로 사용해서 검증오차 검증도 할 수 있습니다.

 

랜덤포레스트

랜덤 포레스트는 쉬운 비유로 문제를 풀때 한명의 똑똑한 사람보다 100명의 평범한 사람이 더 잘푸는 원리입니다(Voting)

 

출처: 텐서 플로우 블로그

 

 

랜덤 포레스트는 전반적으로 배깅과 같습니다. 차이점은 데이터 샘플을 복원추출할 때 모든 설명변수를 사용하는 배깅과 달리 소수개의 설명변수만 고려하여 분할을 고려합니다. (보통 sqrt(p)개) 

일반적으로 렌덤포레스트는 배깅보다 나은 성능을 가지는데 변수간 상관성이 높은 변수가 섞을 확률이 높은 배깅과 달리 랜덤 포레스트는 그 가능성을 없애기 떄문입니다. (랜덤 포레스트의 각 트리들의 예측이 비상관화(decorrelation)되게합니다)

CART의 큰 문제점중 하나였던 오버피팅 또한 여러개의 결정 트리를 통해 랜덤 포레스트를 만들면 해결할 수 있습니다.

 

파라미터

 

n_estimators : 랜덤 포레스트 안의 결정 트리 갯수를 의미합니다.

클수록 좋지만 그만큼 메모리와 훈련 시간이 증가합니다. 적정 수준을 찾아주는것이 중요해보입니다.

 

max_features : 무작위로 선택할 feature의 개수를 의미합니다. max_features의 값이 n_features와 가까울수록 오버피팅 가능성이 높아지고, 작으면 랜덤 포레스트의 트리들이 비상관화(decorrelation)되어 오버피팅이 줄어들 것입니다. 일반적으로 Default값을 쓰며, Default는 sqrt(p)입니다. 이는 경험적으로 가장 좋은 성능이 나온다고 알려져 있습니다. 

 

 

추가 - ExtraTrees

RandomForest와 형제 격인 extremely randomized trees(ExtraTrees)라는 방법이 있습니다. RandomForest의 변종으로 랜덤 포레스트의 무작위성을 더욱 증가 시켜준 방법입니다.

 

ExtraTrees는 트리 분기 시 cut-point를 찾을때 랜덤하게 결정합니다. 논문에 따르면 랜덤 포레스트보다 미세하게 성능이 좋고, 노이즈 데이터에 대해서는 랜덤포레스트와 비슷한 결과를 냈다고합니다. 물론 Random한 성질때문에 RandomForest보다 훈련속도는 빠릅니다.(약 3배정도라고하네요)

 

즉 정리하자면 RandomForest는 특성 선택시 개별 모델에 대한 차원을 줄입니다. 반면, ExtraTrees는 각 노드에서도 랜덤하게 독립변수를 선택합니다.

 


마무리

랜덤 포레스트는 CART기반의 voting으로 결과를 도출하는 간단한 알고리즘입니다. 하지만 굉장히 좋은 성능을 내고 있으며, Overfitting도 잘 일어니지 않고 새로운 데이터에 잘 일반화 됩니다. 

속도 또한 빠르기 때문에 많은 경우에 RandomForest를 기본 척도로 모델링을 수행하는 경우도 많습니다. 

 

다만, 메모리를 많이 먹고 Training data의 양이 증가해도 성능의 급격한 증가는 잘 일어나지 않는 다는 단점을 가지고 있어 현재 나온 부스팅 알고리즘에 비해서는 성능이 약간 뒤쳐지는 경향이 있습니다.

 

다음에는 좀 더 고도화된 Boosting 알고리즘 들에 대해 알아보도록 하겠습니다!