[AI] Random Forest

LONGNEW·2023년 7월 27일
0

연구

목록 보기
5/10

컨셉

여러 Decision Tree를 앙상블한 것으로 Bagging-like method의 일종이다.
기존의 데이터 셋의 부분 집합을 통해 각 base learner가 되는 Tree를 제작한다.
이 때 base learner들은 사용하는 feature들을 다양화 하여 여러 view point를 가지게 된다.

구현

  • open source인 scikit-learn의 공식문서를 보며 어떤 구조로 만들어졌는지 확인.

구성 요소가 되는 각 tree들은 bootstrap sample (기존의 데이터 셋의 부분 집합)을 통하여 제작된다.

tree를 구성하는 node들을 구분하는 기준은 모든 input feature들을 다 생각하거나 클래스를 생성할 때 지정한 max_features 파라미터의 개수만큼을 생각하여 구분된다.

  • 왜 random forest를 하면 variance가 낮아지고 에러가 감소하는가?
    node를 구분하기 위한 기준이 되는 numbers of input features, max_features로 인해 각 Tree들은 독립적으로 행동을 하게 된다.
    해당 Tree들은 variance가 높고 Overfit하는 경향을 보인다.

이러한 Tree들의 평균을 구함으로 우리는 에러를 낮출 수 있다. 다양한 모델들이 모였기 때문에 서로 모델들의 차이점을 나타내는 variance 수치가 낮아지게 되고 그에 반해 얼마나 틀린 답을 주는지에 대한 bias 수치가 높아지게 된다.

  • 실제 논문과의 차이점.
  1. 구현물에서는 확률 예측값의 평균을 구하게 하였다. 실제 논문에서는 정답으로 예측한 클래스에 투표를 하는 방식을 사용하였다.
  2. Extremely Randomized Trees 버젼
    기존에는 Tree의 Node를 구분할 떄 가장 식별이 쉬운, 차이나는 feature를 골랐다.
    여기서는 랜덤으로 feature들을 선택해본 후 그 중 데이터의 성향을 가장 잘 나타내는 것을 사용한다.
    연산량과 bias는 증가하지만 variance를 좀 더 줄이는 효과가 있다고 한다.

파라미터

n_estimators : forest를 구성하는 Tree의 개수 [default == 100]

max_features : node 구분 시 랜덤 부분 집합의 feature 몇 개를 사용할 지, 크기를 결정
ex) max_features == 1.0 모든 feature를 다 사용하겠다. [default]
max_features == "sqrt" => sqrt(n_features)의 의미로 루트를 취한 만큼의 수를 사용하겠다.

  • 추천
    max_depth=None
    min_samples_split=2
    각 Tree에 대한 setting을 하는 것이기 때문에 fully overfit 하도록 하기 위한 설정인 것 같다.

n_jobs 파라미터를 통해 기기의 core를 병렬적으로 사용할 수도 있다. 물론 inter-communication 오버헤드로 인해 성능의 상향은 linear적이지 않을 수 있으니 주의.

논문

random selection of features 를 통해 node들을 분리 함으로 전체적인 결과의 오차가 더 줄었다. 이를 하는 이유는 different point of view를 얻기 위함이라고 보면 될 것 같다.

  • 영향을 준 연구 자료 : character recognition, Amit and Geman (1997)
    기하학적 feature들을 define한 후에 랜덤으로 뽑아서 node들을 분리하는 연구.

랜덤 포레스트 정의

k개의 독립적인 tree(분류기)를 가진 집합체이다.
모든 tree는 동일한 데이터 셋을 대상으로 한다.
각 tree들은 서로 독립적인 random vector(데이터 셋의 feature)를 가지고 생성되었다.
각 tree들의 투표를 통해 입력값에 대한 분류를 진행한다.

섹션 2 : 왜 overfit하는 것은 문제가 아닌가?

Strong Law of Large Numbers에 의해 random forest의 일반화 오류가 언제나 수렴하기에 그렇다.

섹션 6 : 몇 개의 feature 사용하는지가 중요.

정확도를 올리기 위해선, 상관관계는 줄이고 strength는 유지해야 한다.

Bagging을 사용하는 이유

  1. 정확도를 높일 수 있을 것 같아서. (random feature를 사용할 떄)
  2. 일반화된 오류를 추정할 수 있기에 (== 상관관계, strength를 계산할 수 있음과 동일)

=> 그러나 생각보다 feature의 수에 민감하지 않다.
대부분 2개 정도의 feature를 가져오는게 결과가 좋더라.

섹션 9 : feature들은 많지만 실제 데이터는 적은 경우에 대한 실험.

사용하는 feature가 1, 10, 25로 늘리는데 결과가 갈수록 좋아지긴 함

reference

0개의 댓글