Random Forests
04_4 : Ensemble Learning : Random-Forests
Random Forest는 이전 글에서 공부했던 Bagging 방법의 특수한 형태로써 Decision Tree를 Base Learner로 사용한다. Random하게 변수를 선택하여 여러개의 Decision Tree들(Forest)을 학습시키는 방법을 사용한다.
우선 Decision Tree에 대하여 알아보자.
Decision Tree
d개의 변수를 가지는 Data가 주어졌다고 가정하자. 이때 하나의 data point v는 아래와 같이 정의된다.
v = (x_1,x_2,\cdots ,x_d) \in \mathbb{R}^d
각 x_i는 변수 하나하나를 나타내는 스칼라 값이다. 변수가 매우 많은 경우, 앞서 배운 차원축소와 같은 방법을 사용하거나 이후에 다룰 Random Forest처럼 임의로 변수를 추출하여 사용한다. 변수의 추출은 \phi (v) 함수에 의해서 이루어진다.
\phi\;:\;\mathbb{R}^d \rightarrow \mathbb{R}^{d^\prime},\;\;\;\;d > d^\prime
- Training
S_i = S_i^L \cup S_i^R,\;\;S_i^L \cap S_i^R = \emptyset
(a) Draw a bootstrap sample Z^* of size N from the training data.이렇게 Data를 분할하는 Split function은 데이터를 정보 획득량(information gain : I)이 최대화 되도록 분리한다.
I = H(S) - \sum_{i\in\{L,R\}} \frac{|S^i|}{|S|} H(S^i),\;\;\;\;H(S) = -\sum_{c\in C}p\log (p(c))
|\cdot |은 각 집합에 속한 원소의 개수를, H는 섀넌 엔트로피(Shannon entropy)를 의미한다. 정보 획득량 I를 최대화 하기 위해서는 섀넌 엔트로피가 최소화 되어야 한다.
- Test
학습이 완료된 Decision Tree에 새로운 Data v가 주어지면, 이전에 학습된 Split function에 따라 v를 특정 end node로 보낸다. 그렇다면 해당 end node에 지정된 label y가 v에 대한 예측 결과이다.
Decision Tree는 Complexity가 높고, Overfitting의 위험 또한 높다. 이러한 단점을 보완하는 Random Forest 방법을 살펴보자.
Random Forest
Random forest 방법의 알고리즘을 살펴보자.
- Algorithm
1. For b = 1 to B :
(b) Grow a random-forest tree T_b to the bootstrapped data, by recursively repeating the following
steps for each terminal node of the tree, until the minimum node size n_{min} is reached.
i. Select m variables at random from the p variables.
ii. Pick the best variable/split-point among the m.
iii. Split the node into two child nodes.
2. Output the ensemble of trees \{T_b\}_1^B.
To make a prediction at a new point x:
Regression : \hat{f}_{rf}^B (x) = \frac{1}{B}\sum_{b=1}^B T_b(x).
Classification : Let \hat{C}_b(x) be the clas prediction of the bth random-forest tree.
Then \hat{C}_{rf}^B(x) = majority\;\,vote\;\{\hat{C}_b(x)\}_1^B.
위의 알고리즘이 어떤 뜻인지 한번 살펴보자.
1. 우선, B는 base learner T의 개수이다.
(a) 각 base learner가 사용할 bootstrap Z^*를 만들어준다. (Bagging)
(b) 아래 i, ii, iii의 순서에 따라 T_b를 학습시킨다. (Randomized node optimization)
i. p개의 변수 중 m개의 변수를 random하게 선택한다. (m<p)
ii. m개의 변수를 사용하여 최적의 split point(function)을 만든다.
iii. node를 2개의 child node로 split한다.
위 과정을 재귀적으로 minimum node size n_{min}에 도달할 때까지 반복한다.
2. 각각의 학습된 Tree를 합치는 과정은 아래와 같다.
Regression의 경우 평균을 사용하고, Classification의 경우 Majority voting을 사용한다. (물론 꼭 이 방법을 사용해야 하는 것은 아니다)
Random Forest의 특징은 Bagging 방법을 사용하여 Bootstrap을 구성하는 것에 추가적으로 Decision tree에 적용할 변수를 Random하게 선택한다는 점이다. 이를 통해 Tree들의 예측이 최대한 Decorrelation(비상관화) 되도록 하고, Generalization 성능을 향상시킨다.
Random Forest (Cont.)
- Generalization Error
Random Forest의 다른 특징 중 하나로, Generalization error의 Bound를 계산할 수 있다. (일반화 성능의 상한을 계산 가능하다)
Population size T가 충분히 크다면 아래의 식으로 나타난다.
Generalization\;\;Error\leq \frac{\bar{\rho} (1-s^2)}{s^2}
\hat{\rho} is the mean value of the correlation coefficients between individual trees.
\hat{\rho}은 개별 tree들의 상관관계의 평균이다. tree들 간의 correlation이 적을수록 \hat{\rho}은 작아지게 되고, 상한은 작아질 것이다.
s^2 is the margin function. (for binary classification, it is simply the average difference proportion between the correct and incorrect trees over all training data)
s^2는 정답과 오답 사이 차이의 평균이다. 알고리즘이 정확할수록 s^2은 1에 가까워지게 커지게 되고, 상한은 작아질 것이다.
- Variable Importance
Random Forest의 유용한 특징 중 하나로, model에서 변수의 중요도를 계산할 수 있다.
Step1. Compute the OOB error for the original dataset(e_i)
Step2. Compute the OOB error for the dataset which the variable x_i is permuted (p_i)
Step3. Compute the variable importance based on the mean and standard deviation of (p_i-e_i)
over all trees in the population.
Step1. 가장 먼저 Bootstrap을 사용해 학습한 Tree에 대하여 OOB error e_i를 계산한다.
Step2. 그리고 OOB data에 대하여 중요도를 알고싶은 변수 x_i에 해당하는 값을 무작위로 뒤섞는다.
뒤섞은 data에 대한 OOB error p_i를 계산한다.
Step3. 모든 Tree에 대하여 e_i와 p_i의 차이를 계산하고 평균과 분산을 구한다.
x_i가 split에 자주 사용된 중요한 변수라면, p_i 보다 e_i가 작고, 차이가 많이 날 것이고, 개별 tree마다 차이의 편차가 작을 것이다. 하지만 x_i가 split에 자주 사용되지 않은 별로 중요하지 않은 변수라면, p_i와 e_i의 차이가 크지 않을 것이다.
m번째 tree에서 변수 i에 대한 Random permutation 전후 OOB error의 차이, 평균, 분산, 중요도는 아래와 같이 정의된다.
차이 : d_i^m = p_i^m - e_i^m
평균 : \overline{d}_i = \frac{1}{m} \sum_{i=1}^m d_i^m
분산 : s_i^2 = \frac{1}{m-1} \sum_{i=1}^m (d_i^m-\overline{d}_i)^2
중요도 : v_i = \frac{\overline{d}_i}{s_i}
변수의 중요도가 높을수록 평균은 클 것이고, 분산은 작을 것이다.
여기서 주의할 점은 v_i의 값이 어느 정도로 중요한지를 표현할 뿐이지, 그 값이 어떤 의미를 가지지 않는다는 점이다.
※ 이 글은 고려대학교 산업경영공학과 강필성 교수님의 IME654 강의를 정리하고, 공부한 내용을 추가하여 작성되었습니다.
댓글
댓글 쓰기