[이론] 랜덤 포레스트의 작동 원리 (1)
데이터를 이용해 미래를 예측한다고 생각해보자. 은행은 대출 신청자가 돈을 갚을지 판단하고, 병원은 환자가 특정 질병에 걸릴 가능성을 추정한다. 투자자는 내일 주가가 상승할지 하락할지 알고 싶어 한다.
수백 그루의 서툰 나무가 한 그루의 똑똑한 나무를 이기는 법
랜덤 포레스트의 작동 원리
데이터를 이용해 미래를 예측한다고 생각해보자. 은행은 대출 신청자가 돈을 갚을지 판단하고, 병원은 환자가 특정 질병에 걸릴 가능성을 추정한다. 투자자는 내일 주가가 상승할지 하락할지 알고 싶어 한다.
이런 판단을 내리는 가장 직관적인 알고리즘 가운데 하나가 의사결정나무(Decision Tree)다.
의사결정나무는 사람처럼 질문을 던진다.
- 최근 거래량이 증가했는가?
- 지난 5일 수익률이 양수인가?
- 시장 전체가 상승하고 있는가?
- 기업의 매출이 증가하고 있는가?
질문에 대한 답에 따라 데이터를 계속 나누고, 마지막에 상승 또는 하락을 판단한다. 문제는 한 그루의 나무가 자신이 본 데이터에 지나치게 민감하다는 것이다. 훈련 데이터가 조금만 달라져도 첫 번째 질문과 나무 전체의 구조가 바뀔 수 있다.
랜덤 포레스트(Random Forest)는 이 약점을 독특한 방법으로 해결한다. 완벽한 나무 한 그루를 만들려고 하지 않고, 서로 조금씩 다른 나무를 많이 만든 다음 다수의 판단을 모으는 것이다.
1. 하나의 데이터에서 여러 세계를 만드는 부트스트랩
100명의 환자 데이터가 있다고 가정해보자. 랜덤 포레스트는 모든 나무에 똑같은 100명을 보여주지 않는다. 원래 데이터에서 무작위로 100명을 다시 뽑아 각각의 나무에 제공한다.
여기서 중요한 점은 한 번 뽑힌 사람도 다시 뽑힐 수 있다는 것이다. 이것을 통계학에서 복원추출이라고 한다.
어떤 표본에는 7번 환자가 세 번 포함될 수 있고, 23번 환자는 한 번도 포함되지 않을 수 있다. 이렇게 원래 데이터에서 복원추출로 새로운 표본을 만드는 방법이 부트스트랩(Bootstrap)이다.
예를 들어 원래 데이터가 다음과 같다고 하자.
부트스트랩으로 다섯 개를 다시 뽑으면 다음과 같은 표본이 만들어질 수 있다.
다른 나무에는 다음 표본이 주어질 수 있다.
모든 나무는 같은 원본 데이터에서 출발하지만, 각자 조금씩 다른 세상을 경험한다. 그 결과 나무마다 서로 다른 질문과 판단 규칙을 배우게 된다.
2. 여러 나무의 판단을 합치는 배깅
부트스트랩 표본으로 여러 모델을 만든 뒤 그 결과를 합치는 방법을 배깅(Bagging)이라고 한다. 배깅은 Bootstrap Aggregating을 줄인 말이다.
상승과 하락을 예측하는 분류 문제라면 여러 나무가 투표한다.
- 상승을 선택한 나무: 73그루
- 하락을 선택한 나무: 27그루
랜덤 포레스트는 최종적으로 상승을 선택한다. 나무 100그루 중 73그루가 상승을 선택했다면 이를 상승에 대한 원시 확률처럼 사용할 수도 있다.
주가나 매출처럼 연속적인 숫자를 예측하는 회귀 문제에서는 투표 대신 여러 나무의 예측값을 평균한다.
여기서 는 나무의 수이고, 는 번째 나무의 예측이다.
배깅의 핵심은 단순하다. 서로 다른 실수를 하는 모델들의 판단을 평균하면 우연한 실수가 서로 상쇄된다.
3. 편향과 분산의 줄다리기
모델의 예측오차를 이해할 때 사용하는 중요한 개념이 편향-분산 분해(Bias–Variance Decomposition)다.
예측오차는 직관적으로 다음 세 부분으로 나눌 수 있다.
편향(Bias)은 모델이 현실을 지나치게 단순하게 이해해서 발생하는 오차다. 예를 들어 실제 관계가 곡선인데도 직선만 사용한다면 일정한 방향의 오차가 생긴다.
분산(Variance)은 훈련 데이터가 조금 달라졌을 때 모델의 예측이 크게 흔들리는 정도다.
깊게 자란 의사결정나무는 복잡한 관계를 잘 표현하므로 편향은 비교적 작다. 반면 데이터가 조금만 바뀌어도 나무의 구조가 크게 달라지므로 분산이 크다.
랜덤 포레스트는 여러 개의 깊은 나무를 평균함으로써 개별 나무의 낮은 편향을 상당 부분 유지하면서 높은 분산을 줄인다. 이것이 랜덤 포레스트가 강력한 첫 번째 이유다.
4. 나무들이 같은 실수를 하면 평균도 실패한다
나무를 많이 만든다고 언제나 성능이 좋아지는 것은 아니다.
100명의 전문가에게 의견을 물었지만 모두 똑같은 정보만 보고 똑같은 방식으로 판단한다면, 100명에게 물어본 의미가 크지 않다. 한 명이 틀릴 때 나머지도 함께 틀릴 가능성이 높기 때문이다.
이를 설명하는 개념이 상관계수와 분산 감소다.
각 나무의 예측 분산이 , 나무 사이의 평균 상관계수가 , 나무 수가 라면 평균 예측의 분산은 대략 다음과 같이 표현할 수 있다.
나무 수 가 매우 커지면 두 번째 항은 거의 0이 된다.
이 식은 중요한 사실을 보여준다. 나무를 아무리 많이 만들어도 나무들이 지나치게 비슷하면 분산이 충분히 줄어들지 않는다.
랜덤 포레스트는 이를 막기 위해 각 분기에서 모든 변수를 검토하지 않는다. 전체 변수 중 무작위로 선택된 일부 변수만 후보로 보여준다.
예를 들어 변수가 20개 있어도 한 분기에서 4개만 무작위로 선택한 뒤, 그중 가장 좋은 질문을 찾는다. 강력한 변수 하나가 모든 나무의 첫 번째 질문을 독점하지 못하므로 나무들은 서로 다른 구조로 자란다.
| 무작위성 | 적용 대상 | 효과 |
|---|---|---|
| 행의 무작위성 | 부트스트랩으로 관측값 선택 | 나무마다 다른 훈련 경험을 만든다 |
| 열의 무작위성 | 분기마다 일부 변수만 선택 | 나무 사이의 상관관계를 낮춘다 |
5. 나무는 어떤 질문이 좋은지 어떻게 판단할까?
나무는 데이터를 나눌 때 아무 질문이나 선택하지 않는다. 현재 섞여 있는 데이터를 가장 깔끔하게 분리하는 질문을 찾는다.
분류 문제에서는 데이터가 얼마나 섞여 있는지를 나타내는 불순도 측정(Impurity Measure)을 사용한다. 대표적인 방법이 지니 불순도다.
상승과 하락이 절반씩 섞여 있다면 불순도가 높다. 반대로 한 노드에 상승 사례만 모여 있다면 불순도는 0이 된다. 엔트로피도 같은 목적으로 사용할 수 있다.
나무는 분기 전과 분기 후의 불순도를 비교한다.
불순도를 가장 많이 줄이는 질문이 선택된다.
회귀 문제에서는 보통 불순도 대신 예측값의 흩어진 정도를 계산한다. 분기 후 두 집단의 제곱오차나 분산이 얼마나 감소했는지 비교하는 것이다. 이를 분산 감소 기준(Variance Reduction Criterion)이라고 한다.
예를 들어 거래량을 기준으로 나눴을 때 각 집단의 미래 수익률이 이전보다 비슷해진다면, 거래량은 좋은 분기 기준이 된다.
6. 큰 수의 법칙이 숲을 안정시킨다
동전을 열 번 던졌을 때 앞면이 일곱 번 나올 수 있다. 하지만 수만 번 던지면 앞면의 비율은 대체로 50%에 가까워진다.
이처럼 반복 횟수가 증가할수록 평균이 기대값에 가까워지는 성질이 큰 수의 법칙(Law of Large Numbers)이다.
랜덤 포레스트도 비슷하다. 나무가 적으면 어떤 부트스트랩 표본이 우연히 선택되었는지에 따라 예측이 흔들릴 수 있다. 나무를 충분히 늘리면 평균이나 투표 비율이 점차 안정된다.
다만 큰 수의 법칙이 예측을 자동으로 정답으로 만들어주는 것은 아니다. 같은 편견을 가진 나무를 수없이 모으면 잘못된 판단이 안정적으로 반복될 수도 있다. 나무 수를 늘리는 것은 예측의 흔들림을 줄여주지만, 잘못된 데이터나 중요한 변수의 누락까지 해결해주지는 않는다.
7. Breiman의 일반화 오차 상한이 말해주는 것
랜덤 포레스트를 정립한 통계학자 리오 브레이먼(Leo Breiman)은 숲의 성능을 두 가지 요소로 설명했다.
- 개별 나무의 강도(Strength)
- 나무들 사이의 상관관계(Correlation)
이를 단순화해 나타낸 Breiman 일반화 오차 상한은 다음과 같다.
여기서 는 새로운 데이터에 대한 일반화 오차, 는 개별 나무의 평균적인 강도, 는 나무 사이의 평균 상관관계를 의미한다.
수식이 전하는 메시지는 어렵지 않다.
- 개별 나무가 강할수록 오차 상한은 낮아진다.
- 나무 사이의 상관관계가 낮을수록 오차 상한도 낮아진다.
따라서 좋은 랜덤 포레스트는 무조건 제각각인 나무들의 집합이 아니다. 각 나무가 어느 정도 정확하면서도 서로 다른 방식으로 실수해야 한다.
변수를 너무 적게 보여주면 나무들의 상관관계는 낮아지지만 개별 나무가 약해진다. 반대로 너무 많은 변수를 보여주면 개별 나무는 강해질 수 있지만 서로 비슷해진다. 랜덤 포레스트의 변수 선택 개수는 이 두 조건 사이에서 균형을 잡는 장치다.
8. 따로 시험용 데이터를 떼어놓지 않아도 되는 이유
부트스트랩으로 개의 데이터를 다시 번 뽑더라도 모든 관측값이 한 번씩 선택되는 것은 아니다. 같은 데이터가 여러 번 뽑히기 때문이다.
특정 관측값이 한 번도 선택되지 않을 확률은 다음과 같다.
데이터가 충분히 많으면 이 값은 약 , 즉 36.8%에 가까워진다.
따라서 한 나무를 만들 때 원본 데이터의 약 63.2%가 한 번 이상 사용되고, 약 36.8%는 그 나무의 훈련에 참여하지 않는다.
이렇게 특정 나무의 학습에서 제외된 데이터를 OOB(Out-of-Bag) 데이터라고 한다.
각 관측값은 자신을 학습에 사용하지 않은 나무들에 의해서만 예측된다. 그 예측을 실제 정답과 비교하면 별도의 검증 데이터를 크게 소모하지 않고도 모델의 성능을 추정할 수 있다. 이것이 OOB 추정이다.
OOB 오차는 특히 데이터가 많지 않을 때 유용하다. 다만 시계열 자료에서는 미래 데이터가 과거 예측에 섞일 수 있으므로, 시간 순서를 지켜야 하는 주가 예측에서는 OOB 평가만 믿어서는 안 된다. 별도의 시간 순서 기반 검증이 필요하다.
9. 조합론으로 보면 숲은 얼마나 다양할까?
랜덤 포레스트의 다양성은 조합론(Combinatorics)으로도 이해할 수 있다.
전체 변수가 개이고 분기마다 개를 선택한다면, 가능한 변수 후보 집합의 수는 다음과 같다.
변수가 20개이고 매번 4개를 선택한다면 가능한 조합은 다음과 같다.
여기에 부트스트랩 표본의 다양한 경우와 각 분기에서 선택할 수 있는 기준값까지 더해진다. 모든 나무가 같은 원본 데이터에서 시작하더라도 서로 다른 나무가 만들어질 가능성이 매우 큰 이유다.
하지만 가능한 조합이 많다는 사실이 반드시 유용한 정보를 의미하지는 않는다. 데이터에 정보가 부족하면 수많은 조합도 결국 같은 불확실성을 다른 모습으로 반복할 뿐이다.
10. 어떤 변수가 중요한지 알아내는 방법
랜덤 포레스트는 예측뿐 아니라 변수 중요도(Feature Importance)도 제공한다.
가장 간단한 방법은 각 변수가 숲 전체에서 불순도를 얼마나 감소시켰는지 합산하는 것이다. 어떤 변수가 여러 나무에서 반복적으로 데이터를 깔끔하게 나눴다면 중요도가 높아진다.
하지만 불순도 기반 중요도에는 함정이 있다. 가능한 분기점이 많은 연속형 변수나 범주가 많은 변수에 더 높은 중요도를 부여하는 경향이 있다.
이를 보완하는 방법이 순열 중요도(Permutation Importance)다.
- 원래 데이터로 모델의 예측 성능을 측정한다.
- 특정 변수 하나의 값만 무작위로 섞는다.
- 다시 예측 성능을 측정한다.
- 성능이 얼마나 나빠졌는지 확인한다.
어떤 변수를 섞었더니 정확도가 크게 떨어졌다면 모델이 그 변수의 정보를 많이 사용하고 있었다는 뜻이다.
이 과정은 무작위 재배열을 이용한다는 점에서 순열 검정(Permutation Test)의 사고방식과 연결된다. 여러 번 섞었을 때 나타나는 성능 저하의 분포를 만들면, 관찰된 중요도가 단순한 우연으로도 나타날 수 있는지 평가할 수 있다.
다만 상관관계가 높은 변수들이 함께 있으면 주의해야 한다. 한 변수를 섞어도 다른 변수가 비슷한 정보를 대신 제공할 수 있으므로 실제보다 중요도가 낮게 나타날 수 있다.
11. 투표율 70%는 정말 확률 70%일까?
나무 100그루 중 70그루가 상승을 선택했다고 해서 실제 상승 확률이 정확히 70%라는 보장은 없다.
랜덤 포레스트의 투표 비율은 분류에는 유용하지만 실제 사건 발생 확률과 일치하지 않을 수 있다. 예를 들어 모델이 70%라고 예측한 사례 100개를 모았는데 실제로 55개만 상승했다면 확률을 과대평가한 것이다.
이 문제를 해결하는 과정이 확률 보정(Calibration)이다.
잘 보정된 모델이라면 상승 확률을 70%로 예측한 사례들은 실제로도 약 70%가 상승해야 한다.
확률 보정에는 별도의 검증 데이터를 이용한 로지스틱 보정, Platt scaling, isotonic regression 등의 방법이 사용된다.
확률 보정은 의료 위험도, 신용평가, 투자 의사결정처럼 확률 자체가 중요한 분야에서 특히 필요하다. “어느 쪽인가?”만 맞히는 모델과 “얼마나 확실한가?”까지 정확하게 말하는 모델은 서로 다른 수준의 모델이기 때문이다.
12. 랜덤 포레스트가 강한 진짜 이유
랜덤 포레스트의 성능을 단순히 “나무를 많이 사용하기 때문”이라고 설명하면 핵심의 절반만 이해한 것이다.
| 통계 개념 | 랜덤 포레스트에서 하는 일 |
|---|---|
| 부트스트랩 | 각 나무에 서로 다른 훈련 데이터를 제공한다 |
| 배깅 | 여러 나무의 투표 또는 평균을 결합한다 |
| 편향-분산 분해 | 개별 나무의 낮은 편향을 유지하면서 분산을 줄이는 원리를 설명한다 |
| 상관계수와 분산 감소 | 나무들이 서로 달라야 평균의 효과가 커지는 이유를 설명한다 |
| Breiman 일반화 오차 상한 | 강한 나무와 낮은 상관관계가 함께 필요함을 보여준다 |
| 큰 수의 법칙 | 나무가 많아질수록 숲의 평균과 투표가 안정되는 이유를 설명한다 |
| OOB 추정 | 학습에 참여하지 않은 표본으로 일반화 성능을 추정한다 |
| 불순도 측정 | 분류나무가 데이터를 잘 나누는 질문을 선택하게 한다 |
| 분산 감소 기준 | 회귀나무가 비슷한 값끼리 모이도록 분기하게 한다 |
| 변수 중요도 | 숲이 어떤 정보를 주로 사용했는지 보여준다 |
| 순열 검정 | 관찰된 중요도가 우연인지 평가하는 사고방식을 제공한다 |
| 확률 보정 | 나무의 투표 비율을 실제 발생 확률에 가깝게 조정한다 |
| 조합론 | 다양한 나무가 만들어질 수 있는 방대한 경우의 수를 설명한다 |
결국 랜덤 포레스트는 뛰어난 천재 한 명을 찾는 알고리즘이 아니다.
각자 조금씩 다른 자료를 보고, 다른 질문을 던지며, 서로 다른 실수를 하는 수많은 판단자를 만든다. 그리고 이들의 의견을 통계적으로 결합해 한 명의 불안정한 판단보다 안정적인 결론을 얻는다.
랜덤 포레스트의 지혜는 숲을 이루는 각각의 나무가 완벽해서 생기는 것이 아니다.
나무들이 충분히 유능하면서도 서로 다르기 때문에 생긴다.
