이번 포스팅에서는 랜덤 포레스트(Random Forest)에 대해서 알아보고자 한다. 랜덤 포레스트(Random Forest)의 개념, 알고리즘, 여러 고려사항 및 장단점에 대해서 정리해보려고 한다.
- 목차 -
1. 랜덤 포레스트(Random Forest)란 무엇인가?
2. 랜덤 포레스트(Random Forest) 알고리즘
랜덤 포레스트(Random Forest)을 이해하려면 의사결정나무와 배깅의 대한 내용을 알아야 한다. 아래 포스팅에 정리해 두었으니 먼저 보면 좋다.
9. 의사결정나무(Decision Tree) 에 대해서 알아보자 with Python
본 포스팅에서는 수식을 포함하고 있습니다.
티스토리 피드에서는 수식이 제대로 표시되지 않을 수 있으니
PC 웹 브라우저 또는 모바일 웹 브라우저에서 보시기 바랍니다.
1. 랜덤 포레스트(Random Forest)란 무엇인가?
- 정의 -
랜덤 포레스트(Random Forest)는 (1) 기존 배깅의 이점을 살리고 (2) 변수를 랜덤으로 선택하는 과정을 추가함으로써 개별 나무들의 상관성을 줄여서 예측력을 향상한 앙상블 모형이다.
위 정의를 하나하나 살펴보자.
a. 랜덤 포레스트는 배깅을 사용하는 앙상블 모형이다.
랜덤 포레스트는 기본적으로 배깅을 사용한다. 따라서 배깅의 장점인 편의(Bias)를 유지하면서 분산을 낮추는 효과를 랜덤 포레스트 또한 그대로 이어받는다. 아래 그림은 랜덤 포레스트가 배깅을 사용하는 과정을 나타낸 것이다.
먼저 학습데이터 $L=(x_i, y_i), i=1, \ldots, n$이 있다. $x_i$는 설명변수이고 $y_i$는 반응 변수이다. 이때 $y_i$는 수치적인 의미를 갖거나 범주를 나타내는 숫자이다. 이제 $L$로부터 $B$개의 붓스트랩 샘플 데이터 셋 $L_1, \ldots, L_B$을 만들어낸다($L_b$도 $L$과 같이 $n$개의 데이터를 갖고 있다). 다음으로 각 붓스트랩 샘플 데이터 $L_b$를 이용하여 의사결정나무(개별 나무) $\phi(x, L_b)$를 학습시킨다. 마지막으로 주어진 입력데이터(설명변수) $x$를 $B$개의 개별 나무 $\phi(x, L_b)$에 넣어서 얻은 출력값들을 집계하여 예측값을 얻게 된다.
지금까지만 보면 랜덤 포레스트와 배깅이 다를 게 없어 보인다. 하지만 다음에서 소개할 내용이 랜덤 포레스트와 기존 배깅의 큰 차이점이며 이것이 바로 랜덤 포레스트의 진수라 할 수 있다.
b. 랜덤 포레스트는 변수를 랜덤으로 선택하는 과정을 통해 개별 나무들의 상관성을 줄여 예측력을 향상한다.
랜덤 포레스트는 붓스트랩 샘플 데이터 셋을 이용하여 여러 개의 개별 나무들을 만든다고 했다. Breiman은 그의 논문 "Random Forests"에서 개별 나무 간의 상관성이 작아지면 랜덤 포레스트의 일반화 오류(Generalized Error)가 작아진다는 것을 증명했다. 즉, 개별 나무들의 상관성을 줄이면 랜덤 포레스트의 예측력이 좋아진다는 뜻이다.
이제 개별 나무들의 상관성이 작아지면 예측력이 향상된다는 것을 알았다(위대한 통계학자 Breiman이 그렇다고 했으니 그냥 믿으면 된다).
그렇다면 개별 나무들의 상관성을 어떻게 낮출 수 있을까?
→ 개별 나무를 분리할 변수의 후보를 랜덤으로 선택하는 것이다.
여기서 헷갈리지 말아야 할 것은 각 분리마다 변수 후보를 랜덤하게 선택하는 것이다.
아래 그림은 전체 10개의 변수 중에서 분리할 때마다 2개씩 랜덤하게 변수를 선택하고 그중에서 최적 변수와 분리기준을 선택하는 과정이다. 이것이 랜덤 포레스트에서 개별 나무의 성장 과정이다.
변수 후보를 한 번만 랜덤하게 선택해 놓고 그 변수들만 가지고 분리를 하는 것이 아니라는 것을 알아야 한다(이거 은근히 헷갈리는 분들이 많다고 한다).
즉, 아래와 같은 과정과 헷갈리지 않도록 하자.
이제 랜덤 포레스트에서 개별 트리에서 분리 때마다 변수 후보를 랜덤하게 선택한다는 것을 이해했다. 이러한 과정이 개별 나무 간의 상관성을 어떻게 줄여준다는 것일까?
→ 아래 그림 속에 답이 있다.
아래 그림은 2개의 나무로 이루어진 랜덤 포레스트 모형을 나타낸 것이다. 개별 나무 내에서 분리할 때마다 랜덤으로 변수 후보를 선택한다면 개별 나무들끼리 같아질 가능성이 거의 없어진다. 이는 곧 개별 나무간 상관성이 작아짐을 뜻한다.
종합하면...
랜덤 포레스트는 개별 나무를 성장할 때 분리마다 랜덤으로 변수 후보를 선택하고 이를 통해 2) 개별 나무 간 상관성을 줄여준다. 그리고 Breiman은 개별 나무간 상관성이 작은 경우 랜덤 포레스트의 예측력이 올라간다는 것을 수식으로 증명한 것이다.
2. 랜덤 포레스트(Random Forest) 알고리즘
랜덤 포레스트 모형 학습 알고리즘은 다음과 같다.
Algorithm
1. 학습 데이터 $L$, 붓스트랩 샘플들의 개수 $B$, 랜덤으로 뽑을 변수의 수 $F$를 설정한다.
(참고로 총 변수 개수를 $p$라 할 때 $F=p$이면 랜덤 포레스트는 배깅과 같아진다.)
2. $b=1, \ldots, B$에 대하여 (a)~(c)를 반복한다.
(a) 붓스트랩 샘플 $L_b$를 생성한다. 그리고 OOB 데이터 $O_b = L-L_b$를 보관해둔다.
(b) $L_b$를 이용하여 의사결정나무 $\phi(x, L_b)$를 성장시킨다. 이때 매 분리마다 $F$개의 랜덤 변수를 선택한다.
-> 물론 이 과정에서 $\phi$의 최대 깊이, 끝마디 수, 끝마디 샘플 수 등을 설정해야 할 것이다.
(c) $O_b$를 이용하여 성능 지표 $e_b$를 계산한다.
3. 집계(Aggregation)하여 최종 랜덤 포레스트 모형 $\phi(x)$를 만든다. 회귀 문제인 경우
$$\phi(x) = \frac{1}{B}\sum_{b=1}^B\phi(x, L_b)$$
분류 문제인 경우
$$ \phi_B(x) = \text{Mode}\;\; \phi(x, L_b)$$
가 된다. 그리고 랜덤 포레스트 모형의 성능 지표
$$\bar{e} = \frac{1}{B}\sum_{b=1}^Be_b$$
를 계산한다.
3. 장단점 및 고려사항
- 장점 -
a. 출력 변수와 입력 변수간 복잡한 관계를 모델링할 수 있다.
b. 예측력이 좋다.
개별 나무 간 상관성이 적다면 우수한 예측력을 가진 랜덤 포레스트를 만들 수 있다.
c. 이상치에 강하다(Robust).
랜덤 포레스트는 이상치에 강하다. 왜냐하면 랜덤 포레스트도 결국 의사결정나무로 이루어져있고 의사결정나무 자체가 입력 변수 이상치에 영향을 덜 받기 때문이다.
- 단점 -
a. 모형의 해석이 어렵다.
랜덤 포레스트도 앙상블 기법으로써 앙상블의 고질적인 문제는 모형의 해석이라는 것이다. 즉, 입력 변수에 따른 출력 변수 변화를 해석하기가 어렵다. Breiman은 이러한 점을 해결하기 위해 출력 변수의 예측에 영향을 주는 입력 변수들의 중요도를 랜덤 포레스트를 통해 계산하는 방법을 제안하기도 했다.
b. 다른 앙상블처럼 유연하지 않다.
다른 앙상블 기법(예: 부스팅, 배깅 등)에서는 기본 학습기(Base Learner)를 의사결정나무뿐 아니라 다른 여러 가지 모형도 적용할 수 있지만 랜덤 포레스트는 의사결정나무를 겨냥해 만든 것이므로 나무 외에 다른 예측 모형을 적용할 수 없다.
c. 계산량이 많고 학습에 소요되는 시간이 하나의 의사결정나무에 비해 많다.
- 고려 사항-
랜덤 포레스트에서는 붓스트랩 샘플 수 $B$, 랜덤으로 선택할 변수 개수 $F$를 고려해야 한다. 총변수의 개수를 $p$라 하자. 경험상으로 $B = 10p$로 시작하는 것이 좋은 시작점이 될 수 있다고 한다. 또한 회귀 문제인 경우 $F\approx p/3$, 분류 문제인 경우 $F\approx \sqrt{p}$를 기본 설정값으로 권장하고 있다. 하지만 $B$와 $F$ 모두 교차검증을 통한 조절(Tuning) 작업으로 최적값을 계산할 수도 있을 것이다.
- 참고자료 -
Hands on Machine Learning with R - Chapter 11. Random Forest
김용대 외 4명 - R을 이용한 데이터마이닝
'통계 > 머신러닝' 카테고리의 다른 글
26. 변수 중요도(Variable Importance) with Python (0) | 2022.08.27 |
---|---|
25. Shapley Value와 SHAP에 대해서 알아보자 with Python (15) | 2022.08.25 |
23. 배깅(Bagging)에 대해서 알아보자 (0) | 2022.07.20 |
22. 로지스틱 회귀(Logistic Regression)에 대해서 알아보자. (364) | 2022.07.03 |
21. XGBoost에 대해서 알아보자 (402) | 2022.06.26 |
댓글