Random Forests


Tree Based Model


1. Random Forest

Q . 랜덤 포레스트란?
A . 결정트리를 기본모델로 사용하는 앙상블 방법이다.

  • 앙상블( Ensemble ) 방법이란?
    • 한 종류의 데이터로 여러 머신러닝 학습모델( weak base learner, 기본모델 )을 만들어 그 모델들의 예측결과를 다수결이나 평균을 내어 예측하는 방법이다.
  • 결정트리들은 독립적으로 만들어지며 각각 랜덤으로 예측하는 성능보다 좋을 경우, 랜덤포레스트는 결정트리보다 성능이 좋다.
  • Weak base인 이유는? 오류를 줄여나가기 위함이다.
  • RandomForestClassifier(n_jobs=-1, random_state=10, oob_score=True)

2. Bagging

Q . Bagging이란?
A . Bootstrap Aggregating으로, 각 bootstrap sample들을 트리 모델로 학습시켜 예측한 값들을 합친 결과를 말한다.

  • Bagging = Bootstrap Aggregating

2.1 Bootstrap Sampling

Q . Bootstrap Sampling 방법은?
A . 앙상블에 사용하는 작은 모델들은 부트스트래핑( Bootstrapping )이라는 sampling과정으로 얻은 부트스트랩세트를 사용해 학습을 한다. 즉, 원본 데이터에서 sampling, 랜덤으로 복원추출을 한다. 이때 뽑히지 않은 샘플을 oob( out-of-bag )라 한다.

  • 복원추출 : Sample을 뽑아 값을 기록하고 제자리에 돌려놓는 것을 말한다.

부트스트랩세트의 크기가 n이라 할 때 한 번의 추출과정에서 어떤 한 샘플이 추출 되지 않을 확률은 다음과 같다.

n1n\displaystyle \frac {n-1}{n}

n회 복원추출을 진행했을 때 그 샘플이 추출되지 않았을 확률은 다음과 같다.

(n1n)n\displaystyle \left({\frac {n-1}{n}}\right)^{n}

n을 무한히 크게 했을 때 이 식은 다음과 같다.

limn(11n)n=e1=0.368\displaystyle \lim _{{n\to \infty }}\left({1 - \frac {1}{n}}\right)^{n} = e^{-1} = 0.368

참고 : e=limn(1+1n)n\displaystyle e = \lim _{{n\to \infty }}\left(1+{\frac {1}{n}}\right)^{n}

따라서, 데이터가 충분히 크다고 가정했을 때 한 부트스트랩세트는 표본의 63.2% 에 해당하는 샘플을 가진다.

-> 여기서 추출되지 않은 36.8%의 샘플이 Out-of-Bag 샘플이며, 이것을 사용해 모델을 검증할 수 있다.

pipe.named_steps['randomforestclassifier'].oob_score_

Q . 기본모델( weak learner, 작은모델들 )은 어떻게 합치나요?
A . Aggregation, 부트스트랩세트로 만들어진 기본모델들을 합치는 과정을 말한다.

  • 회귀문제 : 기본모델 결과들의 평균으로 결과를 낸다.
  • 분류문제 : 다수결로 가장 많은 모델들이 선택한 범주로 예측한다.
  • 랜덤포레스트는 기본모델들의 트리를 만들 때 무작위로 선택한 특성세트를 사용한다.
  • 기본모델 트리를 만드는 방법은 일반 결정트리 알고리즘과 한 가지 다른 점이 있다.
    • 결정트리에서 분할을 위한 특성을 선택할 때, 모든 특성( n개 )을 고려하여 최적의 특성을 고르고 분할했다. 하지만, 랜덤포레스트에서는 특성 n개 중 일부분 k개의 특성을 선택( sampling )하고 이 k개에서 최적의 특성을 찾아내어 분할한다. 이때, k개는 일반적으로 log2nlog_2 n을 사용한다.

3. Ordinal Encoder

Q . 순서형 인코딩이란?
A . 순서형 인코딩은 범주에 숫자를 맵핑한다. ['a', 'b', 'c'] 세 범주가 있다면 이것을 -> [1, 2, 3] 이렇게 숫자로 인코딩한다.

Q . 트리구조 학습에서는 원핫인코딩을 사용해도 될까?
A . 아니요. 트리구조에서 원핫인코딩을 사용하면 문제가 생긴다.
트리구조에서는 중요한 특성이 상위노드에서 먼저 분할이 일어난다.
그래서 범주 종류가 많은( high cardinality ) 특성은 원핫인코딩으로 인해 상위노드에서 선택될 기회가 적어진다.
따라서, 원핫인코딩 영향을 안 받는 수치형 특성이 상위노드를 차지할 기회가 높아지고 전체적인 성능 저하가 생길 수 있다.

3.1 특성중요도 onehot vs ordinal

랜덤포레스트에서는 학습 후에 특성들의 중요도 정보( Gini importance )를 기본으로 제공한다. 중요도는 노드들의 지니불순도( Gini impurity )를 가지고 계산하는데,

노드가 중요할수록 불순도가 크게 감소한다는 사실을 이용한다.

노드는 한 특성의 값을 기준으로 분리가 되기 때문에 불순도를 크게 감소하는데 많이 사용된 특성이 중요도가 올라갈 것이다.

3.2 순서형인코더 주의사항

순서형인코딩은 주의해야 할 것이 있다. 범주들을 순서가 있는 숫자형으로 바꾸면 원래 그 범주에 없던 순서정보가 생겨버린다.

예를 들어, food 특성에 ('짜장면', '짬뽕') 이라는 두 범주가 있을 때 순서형 인코딩을 하면 ('1','2') 이렇게 인코딩이 된다. 원하지 않게 짜장면은 1, 짬뽕은 2라는 순위를 매길수 있는 정보가 생겼다.

순서형 인코딩은 범주들 간에 분명한 순위가 있을때 그 연관성에 맞게 숫자를 정해주는 것이 좋다. 예를 들어, 영화 평점과 같은 특성은 분명히 순서형 인코딩이 적절하다.

지금까지는 OrdinalEncoder를 사용해 무작위로 수치를 인코딩 하였지만, 정확한 범주의 순위를 알고 있다면 mapping 파라미터를 사용해 지정해줄 수 있다. 딕셔너리 형태의 정보를 mapping 파라미터로 지정해 줄 수 있다.

Q . 트리 앙상블 모델이 결정트리모델보다 상대적으로 과적합을 피할 수 있는 이유는?
A . 결정트리는 데이터 일부에 과적합하는 경향이 있다.
그래서 다르게 샘플링된 데이터로 과적합된 트리를 많이 만들고 그 결과를 평균내 사용하는 모델이 랜덤포레스트이다.
이렇게 하면 과적합이 줄고 성능이 유지 된다.
랜덤포레스트에서 트리를 랜덤하게 만드는 방법은 두 가지가 있다.

  • 랜덤포레스트에서 학습되는 트리들은 배깅을 통해 만들어진다.
    bootstrap = true 이때 각 기본트리에 사용되는 데이터가 랜덤으로 선택된다.
  • 각각 트리는 무작위로 선택된 특성들을 가지고 분기를 수행한다.
    max_features = auto

Pseudo Code

  • 랜덤포레스트의 의사코드( Pseudo Code )



👉 과정 한눈에 보기

profile
기록하지 않으면 기록되지 않는다.

0개의 댓글