랜덤 포레스트

편집 역사 토론
통계 수치해석 마지막 수정: 2026-08-18 04:27:18

1. 개요[편집]

랜덤 포레스트
Random Forest
제안L. Breiman (2001, Machine Learning 45:5–32)
두 겹의 무작위화부트스트랩 표본 + 분할마다 특징 부분표집(mtry)
겨냥하는 것분산 — 편향은 거의 안 건드린다
핵심 항등식$\rho\sigma^2 + \frac{1-\rho}{B}\sigma^2$
공짜 검증OOB 오차 (표본당 약 36.8%의 트리)
일반화 상계$PE^*\le \bar\rho\,(1-s^2)/s^2$
못 하는 것외삽 — 훈련 범위 밖에서 그냥 평평해진다

랜덤 포레스트(random forest)는 가지치기하지 않고 깊게 키운 결정 트리 수백 그루를, 부트스트랩 재표본과 분할마다의 특징 부분표집이라는 두 겹의 무작위화로 서로 다르게 만든 뒤 평균(또는 다수결)내는 앙상블 방법이다. 브레이만이 2001년 논문에서 이름과 형태를 확정했다.

한 문장으로 요약하면 이렇다. 개별 트리는 편향이 작고 분산이 크므로, 편향을 건드리지 않은 채 분산만 평균으로 깎아 낸다. 트리 하나가 데이터에 과하게 반응해 이리저리 흔들리는 것을 그대로 두되, 흔들리는 방향이 서로 다르게 만들어 상쇄시키는 전략이다. 그래서 이 문서의 절반은 “어떻게 서로 다르게 만드는가”, 즉 트리 사이 상관을 낮추는 이야기가 된다.

실무적 위상도 분명하다. 랜덤 포레스트는 하이퍼파라미터를 거의 안 만져도 어지간히 잘 나오는 기본값이다. 그래디언트 부스팅이 잘 튜닝되면 대체로 더 좋은 점수를 내지만 튜닝을 요구하는 반면, 랜덤 포레스트는 트리 수만 충분히 크게 두면 나머지는 방치해도 된다. “일단 RF 돌려서 기준선 잡고 시작한다”가 정형 데이터 실무의 국룰이 된 이유다.

2. 두 겹의 무작위화[편집]

1층: 배깅. 브레이만(1996)의 부트스트랩 집계(bootstrap aggregating)가 출발점이다. 크기 nn 의 훈련집합에서 크기 nn 의 복원추출 표본 BB 개를 뽑아 각각에 모형을 적합시키고 평균 낸다. 부트스트랩 표본 하나에는 원 관측의 약 1e163.2%1-e^{-1}\approx 63.2\% 만 서로 다르게 들어가므로 트리들이 조금씩 달라진다.

2층: 분할마다의 특징 부분표집. 배깅만으로는 부족하다는 게 랜덤 포레스트의 출발점이다. 아주 강한 예측변수가 하나 있으면 부트스트랩 표본이 뭐가 되든 거의 모든 트리가 그 변수를 뿌리에서 고른다. 트리들의 위쪽 구조가 죄다 닮아 버리니 평균을 내도 분산이 잘 안 깎인다. 그래서 랜덤 포레스트는 각 노드에서 분할을 찾을 때마다 전체 pp 개 특징 중 mtrym_{\text{try}} 개를 무작위로 뽑아 그 안에서만 최적 분할을 찾는다. 강한 변수가 후보에서 빠진 노드에서는 다른 변수가 강제로 기회를 얻고, 그렇게 트리들이 구조적으로 갈라진다.

관례적 기본값은 분류에서 mtry=pm_{\text{try}}=\lfloor\sqrt{p}\rfloor, 회귀에서 p/3\lfloor p/3\rfloor 이며 잎 최소 크기는 각각 1과 5다.1 트리는 가지치기하지 않는다 — 개별 트리의 과적합은 의도된 것이고, 그 대가인 분산은 평균이 처리한다.

이 두 겹이 서로 다른 일을 한다는 점이 중요하다. 배깅은 관측을 흔들고, mtrym_{\text{try}} 는 특징 선택을 흔든다. 실제로 상관 감소에 더 크게 기여하는 것은 두 번째 쪽이며, 부트스트랩을 아예 빼고 전체 데이터를 쓰되 mtrym_{\text{try}} 만 유지해도 성능이 크게 안 떨어진다는 보고가 많다. 무작위화를 극단까지 밀면 죄르츠·에른스트·베헨켈(2006)의 극단 랜덤 트리(Extremely Randomized Trees) 가 된다 — 후보 특징마다 최적 분할점을 찾는 대신 분할점도 무작위로 하나 뽑고 그중 최선을 고르며, 부트스트랩도 안 쓴다. 개별 트리는 더 나빠지지만 상관이 더 떨어져 총합은 비슷하거나 낫고, 정렬이 사라지니 학습이 훨씬 빠르다.

3. 왜 상관을 낮추면 분산이 줄어드는가[편집]

이 절이 랜덤 포레스트의 전부다. 각 트리의 예측을 Tb(x)T_b(x), 분산을 σ2\sigma^2, 서로 다른 두 트리 예측 사이의 상관을 ρ\rho 라 하자. 앙상블 예측 f^(x)=1BbTb(x)\hat f(x)=\frac1B\sum_b T_b(x) 의 분산은

Var[f^(x)]=1B2(Bσ2+B(B1)ρσ2)=ρσ2+1ρBσ2\mathrm{Var}\bigl[\hat f(x)\bigr] = \frac{1}{B^2}\Bigl(B\sigma^2 + B(B-1)\rho\sigma^2\Bigr) = \rho\,\sigma^2 + \frac{1-\rho}{B}\,\sigma^2

이다. 여기서 읽어야 할 것 셋.

  • 두 번째 항은 BB\to\infty 에서 0으로 간다. 트리를 더 심는 것으로 없앨 수 있는 몫이다. 그래서 랜덤 포레스트는 트리를 늘려도 과적합하지 않는다 — 늘릴수록 분산이 단조로 줄어 극한값에 수렴할 뿐이다.2 BB 는 튜닝 대상이 아니라 계산 예산의 문제다.
  • 첫 번째 항 ρσ2\rho\sigma^2 는 트리를 아무리 많이 심어도 남는다. 이것이 앙상블 분산의 바닥이다. 이 바닥을 낮추는 유일한 방법은 ρ\rho 를 낮추는 것이고, 그 도구가 mtrym_{\text{try}} 다.
  • mtrym_{\text{try}} 는 정확히 이 지점에서 절충한다. mtrym_{\text{try}} 를 줄이면 트리들이 서로 다른 변수를 보게 되어 ρ\rho 가 내려가지만, 좋은 변수를 못 보는 노드가 늘어 개별 트리가 나빠지므로 σ2\sigma^2 와 편향이 올라간다. 곱 ρσ2\rho\sigma^2 를 최소화하는 지점이 어딘가에 있고, p\sqrt pp/3p/3 이니 하는 기본값은 그 지점의 경험적 추정치다. 랜덤 포레스트에서 튜닝할 게 하나뿐이라면 그건 mtrym_{\text{try}} 다.

편향 쪽도 정직하게 짚자. 평균은 편향을 줄이지 않으므로 앙상블의 편향은 개별 (무작위화된) 트리의 편향과 같다. 그리고 mtrym_{\text{try}} 를 줄이면 그 편향이 조금 커진다. 즉 랜덤 포레스트는 편향을 조금 사서 분산을 크게 파는 거래이며, 이 구도는 편향-분산 분해 문서에서 축소 추정량·정규화와 같은 줄에 놓인다. 배깅이 분산을 겨냥하고 부스팅이 편향을 겨냥한다는 대비의 실질적 내용이 이 항등식이다.

4. OOB 오차 — 진짜 공짜인가[편집]

부트스트랩 표본 하나에 어떤 관측 ii한 번도 안 뽑힐 확률은 (11/n)ne10.368(1-1/n)^n \to e^{-1} \approx 0.368 이다. 따라서 관측 ii 는 전체 BB 그루 중 약 36.8%에게 본 적 없는 데이터다. 그 트리들만 골라 ii 를 예측하고 집계한 것이 OOB(out-of-bag) 예측이고, 전체 관측에 대해 이걸 채점한 것이 OOB 오차다.

이게 매력적인 이유는 계산 구조에 있다. 교차검증KK 겹이면 학습을 KK 번 반복해야 하지만, OOB는 어차피 심어야 할 트리에서 부산물로 떨어진다. 트리를 늘려 가며 OOB 오차 곡선이 평평해지는 지점을 보고 BB 를 정하거나, mtrym_{\text{try}} 를 몇 개 값으로 훑는 데 그대로 쓸 수 있다.

다만 “공짜 교차검증”이라는 표현은 절반만 맞다. 짚을 것 셋 — 상세한 논의는 부트스트랩 문서에 있고 여기서는 요점만.

  • OOB 예측은 BB 그루가 아니라 약 B/eB/e 그루의 집계다. 최종 모형보다 작은 앙상블을 채점하는 셈이라 비관적으로 치우친다. BB 가 크면 무시할 만하지만 BB 가 100 언저리면 눈에 띈다.
  • 관측이 그룹으로 묶여 있으면 무너진다. 같은 환자·같은 배치·시계열 이웃처럼 상관된 관측이 있으면 형제가 in-bag에 남아 정보를 흘린다. 이건 CV의 그룹 폴드 문제와 정확히 같은 병이며, 부트스트랩은 재표본 단위가 관측이라 자동으로 걸린다.
  • mtrym_{\text{try}} 를 OOB로 고르고 그 OOB를 성능으로 보고하면 그건 이미 선택 편향이다. 모형 선택에 쓴 추정치를 최종 성능으로 재사용하는 고전적 사고다. 숫자에 책임이 걸리는 자리에서는 봉인된 홀드아웃이 여전히 정답이다.

5. 브레이만의 일반화 오차 상계[편집]

2001년 논문의 이론적 골자는 두 가지다.

(1) 트리를 늘려도 발산하지 않는다. 트리 수 BB\to\infty 에서 앙상블의 일반화 오차 PEPE^*거의 확실하게 어떤 극한값으로 수렴한다. 대수의 강법칙에서 바로 나오는 결과인데, 실무적 함의가 크다 — “트리를 몇 그루 심을지”는 과적합 문제가 아니라 계산 예산 문제임을 이 정리가 보증한다.

(2) 극한값의 상계. 이진 분류에서 마진을 mr(X,Y)=PΘ(h(X,Θ)=Y)maxjYPΘ(h(X,Θ)=j)mr(X,Y) = P_\Theta(h(X,\Theta)=Y) - \max_{j\neq Y}P_\Theta(h(X,\Theta)=j) 로 정의하고, 그 기댓값을 강도(strength) s=E[mr(X,Y)]s = \mathbb{E}[mr(X,Y)], 서로 다른 두 트리의 원시 마진 함수 사이 평균 상관을 ρˉ\bar\rho 라 하면

PE    ρˉ(1s2)s2PE^* \;\le\; \frac{\bar\rho\,(1-s^2)}{s^2}

가 성립한다. 해석은 명쾌하다. 좋은 랜덤 포레스트는 강하고(개별 트리가 정확하고) 상관이 낮은(서로 다른) 트리들의 모임이다. 앞 절의 분산 항등식이 회귀에서 말한 것을 분류에서 되풀이한 것이며, mtrym_{\text{try}} 조절이 정확히 ρˉ\bar\rhoss 를 반대 방향으로 밀기 때문에 이 두 양의 곱·비가 튜닝의 목적함수가 된다.

정직하게 덧붙이면 — 이 상계는 실용적으로 매우 느슨하다. ss 가 작으면 우변이 1을 훌쩍 넘어 아무 정보를 주지 않고, ρˉ\bar\rhoss 를 실제로 추정해 예측오차를 예측하는 용도로는 아무도 쓰지 않는다. 이 부등식의 가치는 수치가 아니라 “강도 대 상관”이라는 설계 언어를 준 것에 있다. 랜덤 포레스트가 왜 되는지에 대한 만족스러운 이론은 그 뒤로도 오래 걸렸고, 일치성(consistency) 증명은 실제 알고리즘 대신 단순화된 변종에 대해서만 나와 있는 상태가 길었다.3

6. 특징 중요도와 그 편향[편집]

랜덤 포레스트가 인기를 끈 이유 중 하나가 “변수 중요도를 공짜로 준다”는 점인데, 여기가 이 방법에서 가장 오해가 많은 부분이다. 표준 지표는 둘이고 성질이 완전히 다르다.

MDI — 평균 불순도 감소(mean decrease impurity, 지니 중요도). 특징 jj 로 이루어진 모든 분할의 불순도 감소량을 노드 표본 수로 가중해 전 트리에 걸쳐 합산한다. 학습 중에 이미 계산되는 양이라 추가 비용이 0이다. 그리고 그 대가로 두 가지 편향을 짊어진다.

  • 카디널리티 편향. 결정 트리 문서에서 본 후보 분할점 개수 문제가 그대로 상속된다. 연속 변수와 범주가 많은 명목형이 이진 변수보다 체계적으로 높은 중요도를 받는다 — 예측력이 0인 순수 잡음 변수라도 그렇다. 슈트로블 외(2007)가 이걸 실험적으로 못 박았다.
  • 인-샘플 편향. MDI는 훈련 데이터에서 잰 불순도 감소이므로 과적합된 분할의 이득까지 그대로 센다. 완전히 무작위한 변수에 무작위 라벨을 붙여 넣어도 0이 아닌 중요도가 나온다.

순열 중요도(permutation importance, MDA). OOB 표본에서 특징 jj 의 값만 무작위로 섞어 예측 성능이 얼마나 나빠지는지 잰다. 모형을 다시 학습하지 않으므로 여전히 싸고, 홀드아웃에서 재기 때문에 인-샘플 편향이 없다. 사실상 “이 변수와 반응의 관계를 끊으면 얼마나 손해인가”를 직접 측정하는 것이며, 이 정의는 랜덤 포레스트에 국한되지 않고 아무 모형에나 쓸 수 있다.

순열 중요도도 만병통치는 아니다. 상관된 특징이 있으면 두 지표 모두 무너진다. 거의 같은 정보를 가진 A와 B가 있으면, A를 섞어도 B가 정보를 대신 제공해 성능이 거의 안 떨어지므로 둘 다 중요하지 않은 것처럼 보인다(중요도의 희석). 반대로 MDI 쪽에서는 분할 기회가 A·B에 무작위로 나뉘어 각자 절반씩 받는다. 게다가 순열은 특징들의 결합분포를 깨므로 훈련 데이터에 존재하지 않는 비현실적 조합(키 190cm, 몸무게 40kg)에서 모형을 평가하게 되는 근본적 문제도 있다. 슈트로블 외(2008)의 조건부 순열 중요도는 다른 특징들의 값으로 층화한 뒤 그 안에서만 섞어 이걸 완화하려 하고, 무작위 잡음 변수를 일부러 집어넣어 그보다 못한 변수를 탈락시키는 Boruta 같은 절차적 처방도 널리 쓰인다.

가장 중요한 경고는 따로 있다. 어느 중요도든 인과가 아니다. “중요도가 높다”는 것은 “이 모형이 이 변수에 의존한다”는 뜻이지 “이 변수를 바꾸면 결과가 바뀐다”가 아니다. 관측 데이터에서 학습한 모형의 변수 중요도를 정책 결정의 근거로 삼는 것은 설명 가능한 인공지능 도구 전반이 공유하는 함정이며, 랜덤 포레스트가 이걸 유난히 쉽게 뽑아 준다는 사실이 오히려 사고를 늘렸다.

7. 외삽을 못 한다[편집]

랜덤 포레스트의 예측은 조각별 상수 함수들의 평균이므로 여전히 조각별 상수다. 훈련 데이터의 xjx_j 범위 밖으로 나가면 모든 트리가 가장 바깥 잎에 도달하고, 그 뒤로는 아무리 멀리 가도 값이 변하지 않는다. 예측이 훈련 반응값들의 볼록결합 안에 갇힌다y^\hat y 는 결코 maxiyi\max_i y_i 를 넘지 못하고 miniyi\min_i y_i 아래로 내려가지 못한다.

y=2xy = 2x 라는 데이터를 x[0,1]x\in[0,1] 에서 학습시키고 x=5x=5 를 물어보면 답은 10이 아니라 2 근처의 평평한 값이다. 선형회귀라면 아무 문제 없이 맞혔을 것을.

공학 쪽에서 이건 사소한 흠이 아니라 설계 선택의 기준이다. 대리 모델로 랜덤 포레스트를 쓰면 설계 공간 탐색이 훈련 표본이 있는 영역 밖으로 나가는 순간 목적함수가 평지가 되어 최적화가 그 자리에 주저앉는다. 응답면이 매끄럽고 외삽이 필요한 문제라면 베이지안 최적화가 쓰는 가우스 과정 회귀나 다항식 기반 대리 모델 쪽이 맞고, 랜덤 포레스트는 응답면이 불연속·계단형이고 표본이 설계 공간을 충분히 덮은 경우에 쓴다. 부분적 대응으로는 잎에 상수 대신 선형모형을 얹는 모델 트리 계열이 있지만, 그 순간 전처리 불요·단조 불변이라는 트리의 미덕은 반납해야 한다.

대신 랜덤 포레스트가 잘하는 것은 “모른다”고 말하는 것에 가깝다. 마이엔하우젠(2006)의 분위수 회귀 포레스트는 잎에 평균 대신 도달한 훈련 반응값들의 가중 경험분포 전체를 저장해, 조건부 분위수와 예측구간을 준다. 트리 앙상블을 ”xx 에 적응적으로 이웃 가중치를 만드는 기계”로 재해석한 것이며 — 실제로 랜덤 포레스트 예측은 f^(x)=iwi(x)yi\hat f(x)=\sum_i w_i(x)\,y_i 형태의 가중평균으로 정확히 쓸 수 있고, 이 관점이 트리 앙상블과 커널 회귀·근접도 기반 군집화·이상탐지(Isolation Forest)를 잇는 다리다.

8. 실무 감각[편집]

  • 트리 수 BB. 많을수록 좋고 상한은 지갑이 정한다. 500~1000이 관례. 중요도나 예측구간처럼 분산이 큰 부산물을 쓸 거면 더 늘린다.
  • 완전 병렬. 트리끼리 의존이 전혀 없어서 코어 수만큼 선형으로 빨라진다. 그래디언트 부스팅이 순차적이라 트리 수준 병렬화가 불가능한 것과 정확히 대비되며, 이게 랜덤 포레스트가 여전히 살아 있는 실용적 이유 중 하나다.
  • 클래스 불균형. 소수 클래스가 부트스트랩에서 더 희박해지므로 그대로 두면 다수 클래스로 쏠린다. 클래스별 가중치, 또는 트리마다 클래스 균형이 맞도록 층화 표집(balanced RF)을 쓴다.
  • 과적합은 한다. “랜덤 포레스트는 과적합하지 않는다”는 흔한 오독이다. 정확한 진술은 BB 를 늘리는 것으로는 과적합하지 않는다” 이며, 잡음이 심한 데이터에서 트리를 완전히 키우면 개별 트리가 잡음을 외우고 그 편향이 평균에도 남는다. 잎 최소 크기를 올리는 것이 이때의 처방이다.
  • 드롭아웃과의 닮은꼴. 신경망에서 뉴런을 무작위로 꺼서 학습하는 드롭아웃은 지수적으로 많은 부분신경망의 암묵적 앙상블로 해석되며, “무작위로 일부를 가려 공적응을 막는다”는 발상이 mtrym_{\text{try}} 와 사실상 같다. 다만 랜덤 포레스트는 앙상블 멤버를 실제로 저장하고 드롭아웃은 가중치 공유로 흉내 낸다는 차이가 있다.
  • 언제 부스팅에 진다. 신호 대 잡음비가 높고 튜닝 예산이 있으면 대체로 그래디언트 부스팅이 이긴다. 잡음이 크거나, 튜닝할 시간이 없거나, 재현성·병렬성이 중요하면 랜덤 포레스트가 남는다. 그리고 서포트 벡터 머신처럼 스케일링과 커널 선택을 요구하는 방법들이 정형 데이터에서 밀려난 자리를 실질적으로 채운 것이 이 두 트리 앙상블이다.

9. 관련 문서[편집]

10. Footnotes[편집]

  1. 이 값들은 브레이만의 원래 권장이자 R randomForest 패키지의 기본값이다. 라이브러리마다 다르니 실제로 확인하고 쓰는 게 좋다 — 특히 회귀에서 기본값이 “전체 특징”으로 잡혀 있으면 그건 랜덤 포레스트가 아니라 그냥 배깅이고, 강한 변수가 하나 있는 데이터에서 성능 차이가 눈에 띄게 난다.

  2. 이 문장은 매년 면접에서 확인 사살당하는 항목이다. “트리를 많이 심으면 과적합되나요”에 “네”라고 답하면 그 자리에서 끝난다. 물론 트리를 많이 심으면 추론 시간은 정직하게 선형으로 늘어나므로, 서비스에 올릴 때는 다른 의미로 후회하게 된다.

  3. 초기 결과들은 분할점을 데이터와 무관하게 고르는 “순수 랜덤 포레스트” 같은 단순화된 변종을 대상으로 했고, 브레이만이 실제로 제안한 알고리즘의 일치성이 (가법 회귀 모형이라는 조건 아래) 증명된 것은 스코르네·비오·베르(2015)에 와서다. 2001년에 만들어져 세계에서 가장 널리 쓰인 방법이 왜 되는지를 십수 년째 캐고 있었다는 사실은, 이 바닥에서 “일단 돌려”가 이론보다 앞선다는 것을 가장 잘 보여 주는 사례다.