ML

3. Random Forest

수보리조쉬 2021. 5. 9. 13:54

나무가 모이면 숲이 된다.

 

1. 개념

랜덤 포레스트는 decision tree를 기반으로 고도화가 진행된 모델입니다. 이름에서 알 수 있듯 나무들이 모여서 숲이 되는 것처럼 수많은 decision tree들이 한데 모여 만들어졌다고 생각하시면 됩니다. 이 decision tree들을 한데 모아 ensemble을 사용하여 최종 결정을 내리게 되는데, 여기서 ensemble이란 투표 방식 즉 bagging이라고 보시면 됩니다.

 

모두 같은 표를 던지지는 않는다.

 

랜덤포레스트가 얼핏 보기엔 '트리 모형에 투표만 추가해서 너무 간단한 거 아니야?'라고 생각하실 수도 있지만, 집단 지성이 추가된다는 점을 간과하면 안 됩니다. 각각의 트리가 독립적인 변수를 사용하여 구성이 되었기 때문에 전체에서 나온 결과는 하나의 트리에서 나온 결과보다 전체적으로 봤을 때 좀 더 general하다고 볼 수 있습니다.


2. 알고리즘 구성

Bagging이란 bootstrap aggregating의 약자로 부트스트랩(bootstrap)을 통해 조금씩 다른 훈련 데이터에 대해 훈련된 기초 분류기(base learner)들을 결합(aggregating)시키는 방법이다. 부트스트랩이란, 주어진 훈련 데이터에서 중복을 허용하여 원 데이터셋과 같은 크기의 데이터셋을 만드는 과정을 말한다

6 : 3의 비율로 '1'의 승리!

 

랜덤포레스트의 단계

  1. 구성할 트리의 개수가 정해지면 전체 변수들 중 랜덤 하게 선택하여 각각의 트리에게 부여한다.
  2. Bootstrapping을 하여 n개의 트리를 생성 후 훈련시킨다.
  3. 트리들을 하나의 랜덤포레스트로 결합시킨다(평균 또는 과반수 투표 방식 이용).

 

트리 모형은 자체적으로 편향과 분산을 가지고 있습니다. 또한 트리 모형은 깊이가 학습할수록 과적합 된다는 단점이 존재합니다. 부트스트랩은 트리의 분산을 줄여주는 효과가 있기 때문에 각 트리마다 일관성이 유지되도록 도와주는 역할을 합니다. 여기에서 키 포인트는 각 트리 간의 낮은 상호관계입니다. 비슷한 펙터들을 관찰하면 비슷한 결과물이 나오는 게 당연하지만, 서로 연관이 없는 펙터들을 관찰하였는데도 비슷한 결과물이 나오게 된다면 유의미하다고 볼 수 있기 때문입니다. 각각의 트리는 스스로 오류를 최대한 줄이는 방향으로 학습이 진행되지만 가끔 학습이 이상하게 되는 트리가 있을 수도 있습니다. 하지만 투표에 의한 결과 도출 방법은 이상치를 줄이는 방향으로 결과가 나오게 됩니다. 

앙상블 모델

랜덤포레스트 내부의 트리들은 독립적으로 훈련이 진행됩니다. 각각의 트리는 사용될 데이터를 동시에 입력받아서 최종 노드에 도달하게 되는데 이 과정은 병렬적으로 진행될 수 있기 때문에 GPU를 사용하여 높은 학습 효율성을 얻을 수 있습니다. 

 

중요 매개변수

  1. n_estimators
    • 포레스트 내부 트리의 수
  2. max_depth
    • 트리 별 최대 허용 깊이
  3. criterion
    • 트리 별 노드 분화 기준
    • Gini 계수는 순도 기준으로 노드 선별
    • Entropy는 informaiton gain 기준으로 노드 선별

3. 활용 방안

랜덤포레스트는 python 사용 시 sklearn library에서 구현이 잘되어 있으므로 바로 사용이 가능합니다. Decision tree와 동일하게  classification과 regression에서 모두 사용이 가능합니다.

 

pip install sklearn # 패키지 다운로드

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification

train_X, train_y = make_classification(n_samples=1000, n_features=4,
                           n_informative=2, n_redundant=0,
                           random_state=0, shuffle=False)
clf = RandomForestClassifier(max_depth=2, random_state=0)
clf.fit(X, y)

clf.predict(test_X)       # test_y 예측치
clf.predict_proba(test_X) # test_y 예측확률

 

랜덤 포레스트는 최종 모델로 사용하기엔 적합하지 않은 듯 하나, 기초적인 탐색 모델링의 경우에 사용할 수 있는 간단한 모델로 자주 사용하고 있습니다. 보통 전처리의 모델 향상치 검증 또는 데이터 자체의 베이스 예측 성능을 확인하는 용도로 사용이 됩니다. 추후에는 tree model 중 좀 더 발전된 형태인 boosting method로 찾아뵙겠습니다~:)

참고자료

 

sklearn.ensemble.RandomForestClassifier — scikit-learn 0.24.2 documentation

 

scikit-learn.org

 

랜덤 포레스트 - 위키백과, 우리 모두의 백과사전

랜덤 결정 트리 학습 TreeNode LearnDT(S) repeat featureTests times let f = RndFeature(); let r = EvaluateFeatureResponses(S, f); repeat threshTests times let t = RndThreshold(r); let (S_l, S_r) = Split(S, r, t); let gain = InfoGain(S_l, S_r); if gai

ko.m.wikipedia.org

 

Understanding Random Forest

How the Algorithm Works and Why it Is So Effective

towardsdatascience.com