랜덤 포레스트
고친 사람 github-actions[bot]
랜덤 포레스트는 결정 트리를 여러 그루 키워 그 답을 모아 하나의 답을 냅니다. 트리마다 조금씩 다른 데이터를 보여 줘서 서로 다르게 자라게 합니다. 트리 하나의 답은 잘 흔들립니다. 여럿의 답을 모으면 덜 흔들립니다.
쉽고 빠른 이해
결정 트리는 예·아니오로 답하는 질문을 차례로 던져 답을 고르는 모델입니다. 질문 하나로 데이터를 두 무리로 나누는 지점을 갈림길이라고 부릅니다.
랜덤 포레스트는 결정 트리를 많이 만들어 다수결로 답을 정합니다. 회원 기록을 보고 이번 달에 떠날 회원을 맞히는 일이라면, 트리 백 그루가 저마다 「떠남」이나 「남음」에 표를 던집니다. 표가 많이 나온 쪽이 답입니다.
트리 하나만 쓰면 지난 기록의 우연까지 외워서 새 회원 앞에서 틀리기 쉽습니다. 기록 몇 줄만 바뀌어도 트리 모양이 크게 달라집니다. 서로 다르게 틀리는 트리를 여럿 모으면 틀린 방향이 서로 상쇄됩니다.
- 지난 기록에서 줄을 무작위로 뽑아 트리마다 다른 연습용 표를 만듭니다.
- 트리가 갈림길을 만들 때마다 볼 수 있는 칸을 몇 개로 제한합니다. 그러면 트리끼리 덜 닮습니다.
- 새 회원이 오면 모든 트리에 물어 표를 셉니다. 숫자를 맞힐 때는 트리들의 답을 평균합니다.
대가는 무게와 설명하기 어렵다는 점입니다. 트리를 많이 저장해야 합니다. 예측할 때도 트리를 모두 거칩니다. 그래서 메모리와 예측 시간이 듭니다. 트리 하나처럼 「이 질문 두 개 때문에 떠난다고 봤다」고 따라가 보일 수도 없습니다.
회원 기록처럼 칸으로 정리된 표 데이터에 흔히 씁니다. 사진이나 글처럼 칸으로 정리되지 않은 데이터에는 보통 다른 모델을 씁니다.
상세
어려운 진단을 앞둔 환자가 있습니다. 이 환자는 의사 한 명이 아니라 여러 명에게 따로 소견을 받습니다. 의사마다 받아 본 검사 결과가 조금씩 다릅니다. 가장 많이 나온 진단을 따르면 한 사람의 실수에 덜 휘둘립니다.
랜덤 포레스트는 이 방식을 머신러닝으로 합니다. 머신러닝은 사람이 규칙을 적는 대신 지난 기록을 보여 주고 규칙을 스스로 찾게 하는 방법입니다. 규칙을 손으로 다 적기 어려운 일에 씁니다. 그렇게 찾은 규칙 묶음이 모델입니다.
훈련 데이터는 지난 기록을 모은 표입니다. 표의 한 줄은 예를 들어 회원 한 명입니다. 모델은 이 표에서 규칙을 찾습니다.
특성은 한 줄을 묘사하는 칸 하나하나입니다. 마지막 접속 뒤 지난 날수나 문의 건수가 특성입니다. 모델은 특성 값을 보고 답을 고릅니다.
맞혀야 할 답은 레이블입니다. 회원이 이번 달에 떠났는지가 레이블입니다. 훈련 데이터의 줄마다 레이블이 붙어 있습니다.
훈련 데이터로 모델을 만드는 단계가 훈련입니다. 레이블이 없는 새 줄을 넣어 답을 얻는 단계는 예측입니다.
랜덤 포레스트가 묶는 모델은 결정 트리입니다. 결정 트리는 예 아니오로 답하는 질문을 차례로 던져 답을 가려냅니다. 「마지막 접속 뒤 30일이 지났나」, 「문의를 한 적이 있나」를 차례로 물어 떠날 회원을 골라내는 식입니다.
아래 트리는 30일이 지났고 문의도 한 회원을 떠남으로 봅니다. 30일이 안 지난 회원은 요금제가 무료일 때만 떠남으로 봅니다.
flowchart TD
Q1["마지막 접속 뒤 30일이 지났나"] -->|예| Q2["문의를 한 적이 있나"]
Q1 -->|아니오| Q3["요금제가 무료인가"]
Q2 -->|예| L1["떠남"]
Q2 -->|아니오| L2["남음"]
Q3 -->|예| L3["떠남"]
Q3 -->|아니오| L4["남음"]
맨 위 질문은 「30일이 지났나」입니다. 질문이 놓여 무리를 둘로 나누는 곳이 갈림길입니다. 답이 적힌 맨 아래는 끝입니다. 이 트리는 어느 끝에 닿든 질문 둘을 거칩니다.
맨 위에서 끝까지 거치는 질문 수를 트리의 깊이라고 부릅니다. 위 트리의 깊이는 2입니다. 질문을 더 붙일수록 트리는 깊어지고 무리를 더 잘게 나눕니다.
결정 트리는 훈련 데이터를 두 무리로 나누는 질문을 하나씩 고르며 자랍니다. 고르는 잣대는 나눈 뒤 두 무리에 떠난 회원과 남은 회원이 얼마나 덜 섞이는가입니다. 불순도는 이 섞인 정도를 가리키는 말입니다. 트리는 불순도를 가장 많이 줄이는 질문을 고릅니다.
떠난 회원 넷과 남은 회원 넷이 섞인 무리로 견줘 봅니다. 질문 A 「30일이 지났나」로 나누면 한쪽은 떠남 넷·남음 하나, 다른 쪽은 남음 셋입니다. 질문 B 「요금제가 무료인가」로 나누면 양쪽 모두 떠남 둘·남음 둘입니다.
flowchart TD
subgraph SA["질문 A · 30일이 지났나"]
A0["떠남 4 · 남음 4"] -->|예| A1["떠남 4 · 남음 1"]
A0 -->|아니오| A2["떠남 0 · 남음 3"]
end
subgraph SB["질문 B · 요금제가 무료인가"]
B0["떠남 4 · 남음 4"] -->|예| B1["떠남 2 · 남음 2"]
B0 -->|아니오| B2["떠남 2 · 남음 2"]
end
SA ~~~ SB
질문 A 쪽 두 무리가 훨씬 덜 섞였으니 트리는 A를 고릅니다. B로 나누면 나누기 전과 섞인 정도가 같아서 얻는 것이 없습니다.
랜덤 포레스트는 결정 트리 여러 그루를 따로 키운 뒤 답을 모읍니다. 트리 여럿이 모인 모양이라 숲(forest)이라는 이름이 붙었습니다. 트리마다 무작위로 다른 재료를 주기 때문에 랜덤(random)이 붙었습니다.
이 절은 회원 기록 예제를 끝까지 들고 갑니다. 먼저 트리 하나의 약점을 봅니다. 이어서 트리끼리 다르게 만드는 두 가지 무작위와 답을 모으는 법을 봅니다. 그다음 모으면 덜 틀리는 까닭, 떼어 둔 데이터 없이 성능을 재는 법, 드는 시간, 맞는 데이터와 약한 데이터를 차례로 봅니다.
결정 트리 하나의 약점
결정 트리를 멈추지 않고 끝까지 키우면 훈련 데이터를 거의 다 맞힙니다. 갈림길을 계속 만들어 끝마다 회원 한 명만 남길 수 있기 때문입니다. 그 대신 기록에 섞인 우연까지 규칙으로 삼습니다.
접속한 지 5일 된 회원 한 명이 우연히 떠난 기록이 있습니다. 끝까지 키운 트리는 「접속한 지 4일 넘고 6일 이하면 떠난다」는 규칙을 만들 수 있습니다. 이 규칙은 새 회원 앞에서 틀립니다.
과적합은 이처럼 훈련 데이터에 지나치게 맞춰져 새 데이터 앞에서 틀리는 현상입니다. 끝까지 키운 트리는 과적합되기 쉽습니다.
둘째 약점은 흔들림입니다. 트리는 맨 위 질문을 고를 때 후보끼리 근소한 차이로 승부를 가릅니다. 기록 몇 줄이 바뀌면 맨 위 질문이 바뀝니다. 그러면 그 아래 질문도 모두 따라 바뀝니다.
이 흔들림의 크기를 모델의 분산이라고 부릅니다. 훈련 데이터가 조금 바뀔 때 예측이 얼마나 크게 달라지는지를 가리킵니다. 끝까지 키운 트리는 분산이 높습니다.
편향은 반대쪽 약점입니다. 모델이 너무 단순해서 늘 한쪽으로 틀리는 정도를 가리킵니다. 질문 하나만 던지고 멈춘 트리는 「30일이 지났나」만 보고 답하니 그 질문으로 못 가르는 회원을 늘 틀립니다. 끝까지 키운 트리는 질문을 충분히 던지므로 편향이 낮습니다.
랜덤 포레스트는 편향이 낮은 트리를 손대지 않고 쓰면서 분산만 줄이려 합니다. 방법은 여러 트리의 답을 모으는 것입니다.
여러 트리를 묶는 앙상블
모델 여럿을 묶어 하나처럼 쓰는 방법을 앙상블이라고 합니다. 앙상블의 답은 묶인 모델들의 답을 모아 정합니다.
그런데 같은 훈련 데이터에 같은 방법으로 트리를 키우면 트리가 매번 똑같이 나옵니다. 똑같은 트리 백 그루의 다수결은 트리 한 그루의 답과 같습니다. 모아서 얻는 것이 없습니다.
그래서 랜덤 포레스트는 트리마다 무작위를 두 군데 넣습니다. 하나는 트리가 보는 줄입니다. 다른 하나는 갈림길에서 고를 수 있는 특성입니다. 아래 두 소절이 하나씩 풉니다.
줄을 무작위로 뽑는 부트스트랩 표본
첫째 무작위는 줄입니다. 트리마다 훈련 데이터에서 줄을 무작위로 뽑아 따로 연습용 표를 만듭니다. 뽑는 개수는 원래 표의 줄 수와 같습니다.
뽑을 때는 한 번 뽑은 줄을 표에 도로 넣고 다음 줄을 뽑습니다. 이런 방식이 복원 추출입니다. 같은 줄이 두 번 뽑히기도 합니다. 한 번도 안 뽑히는 줄도 생깁니다.
이렇게 만든 연습용 표를 부트스트랩 표본이라고 합니다. 회원 다섯 명의 표에서 트리 셋의 표본을 뽑으면 아래처럼 됩니다. 칸 안의 숫자는 회원 번호입니다.
| 트리 | 뽑힌 회원 | 한 번도 안 뽑힌 회원 |
|---|---|---|
| 트리 1 | 1 · 2 · 2 · 4 · 5 | 3 |
| 트리 2 | 1 · 1 · 3 · 5 · 5 | 2 · 4 |
| 트리 3 | 2 · 3 · 3 · 4 · 4 | 1 · 5 |
트리 1은 2번 회원을 두 번 봅니다. 3번 회원은 못 봅니다. 트리 2와 트리 3은 또 다른 회원을 놓칩니다. 셋은 서로 다른 표로 자라서 모양이 달라집니다.
줄이 많으면 한 표본에서 한 번도 안 뽑히는 줄은 3분의 1쯤입니다. 줄 n 개에서 n 번 뽑을 때 어떤 줄이 한 번도 안 뽑힐 확률은 (1 − 1/n)ⁿ 입니다. n 이 커지면 이 값은 약 0.37 로 다가갑니다. 이 줄들은 뒤에서 성능을 잴 때 다시 씁니다.
부트스트랩 표본마다 모델을 하나씩 키우고 답을 모으는 방법을 배깅이라고 합니다. 부트스트랩 집계(bootstrap aggregating)를 줄인 이름입니다. 랜덤 포레스트는 배깅에 둘째 무작위를 더한 것입니다.
갈림길마다 특성 일부만 보는 무작위
줄만 바꿔서는 트리가 덜 달라질 때가 있습니다. 특성 가운데 유난히 강한 것이 하나 있으면 어느 표본으로 키워도 맨 위 질문이 그 특성으로 정해지기 때문입니다.
회원 표에 특성이 넷 있습니다. 마지막 접속 뒤 지난 날수, 문의 건수, 요금제, 가입한 뒤 지난 달 수입니다. 지난 날수가 떠남을 가장 잘 가른다면 백 그루가 모두 맨 위에서 지난 날수를 묻습니다. 위쪽 모양이 닮은 트리들은 같은 회원 앞에서 같이 틀립니다.
그래서 랜덤 포레스트는 갈림길 하나를 만들 때마다 특성 몇 개만 무작위로 골라 후보로 줍니다. 트리는 그 후보 안에서만 불순도를 가장 많이 줄이는 질문을 고릅니다. 특성 넷 가운데 둘만 고른다면 갈림길 절반쯤에서는 지난 날수를 아예 못 봅니다.
flowchart TD
A["갈림길 하나를 만든다"] --> B["특성 넷 중 둘을 무작위로 고른다"]
B --> C["그 둘로 만들 수 있는 질문을 견준다"]
C --> D["불순도를 가장 많이 줄이는 질문을 쓴다"]
D --> E["두 무리로 나눈다"]
E -->|무리마다 처음부터| A
갈라진 두 무리는 각각 맨 위로 돌아가 다시 특성 둘을 새로 뽑습니다. 그래서 같은 트리 안에서도 갈림길마다 후보가 달라집니다.
이렇게 하면 다른 특성으로 시작하는 트리가 생깁니다. 강한 특성에 가려 있던 약한 특성들도 쓰일 기회를 얻습니다. 트리 하나하나는 조금 덜 정확해집니다. 대신 트리끼리 덜 닮게 됩니다.
후보로 고를 특성 수는 사람이 훈련 전에 정하는 설정값입니다. 하이퍼파라미터는 이렇게 훈련 전에 사람이 정하는 설정값을 묶어 부르는 말입니다. 떠남·남음처럼 정해진 답 가운데 하나를 고를 때는 전체 특성 수의 제곱근쯤을, 숫자를 맞힐 때는 3분의 1쯤을 흔히 시작값으로 씁니다. 특성이 넷이고 떠남·남음을 고른다면 둘입니다.
답을 모으는 다수결과 평균
답을 모으는 법은 무엇을 맞히느냐에 따라 갈립니다. 답이 「떠남」·「남음」처럼 정해진 무리 가운데 하나면 분류입니다. 답이 집값처럼 숫자면 회귀입니다. 랜덤 포레스트는 둘 다 풉니다.
훈련이 끝나면 트리 수백 그루가 생깁니다. 새 회원 한 명이 오면 모든 트리에 차례로 넣어 각자의 답을 받습니다. 트리 하나가 답을 내는 방법은 결정 트리와 같습니다. 맨 위 질문부터 따라 내려가 끝에 적힌 답을 냅니다.
분류에서는 표를 셉니다. 가장 많은 표를 받은 레이블이 답입니다. 아래 코드는 트리 셋의 답을 세는
모습입니다. Counter 는 파이썬에서 값마다 몇 번 나왔는지 세어 주는 도구입니다.
from collections import Counter
votes = ["떠남", "남음", "떠남"]
c = Counter(votes)
c.most_common(1) # [('떠남', 2)]
셋 가운데 둘이 「떠남」이라 답은 「떠남」입니다. 표의 비율을 확률처럼 쓰기도 합니다. 셋 중 둘이면 떠날 확률을 약 0.67 로 봅니다.
회귀에서는 트리 끝에 숫자가 적힙니다. 그 끝에 닿은 훈련 줄들의 레이블을 평균한 값입니다. 끝에 닿은 집이 3억 원과 3억 2천만 원 두 채라면 그 끝에는 3억 1천만 원이 적힙니다.
포레스트는 트리들이 낸 이 숫자를 다시 평균합니다. 집값을 만 원 단위로 맞히는 트리 셋이 아래 값을 냈다면 답은 그 평균입니다.
prices = [31000, 29000, 33000]
sum(prices) / len(prices) # 31000.0
지금까지 본 훈련과 예측을 한 그림으로 모으면 아래와 같습니다. 트리는 셋만 그렸습니다.
flowchart TD
D["훈련 데이터"] --> S1["부트스트랩 표본 1"]
D --> S2["부트스트랩 표본 2"]
D --> S3["부트스트랩 표본 3"]
S1 --> T1["트리 1 · 갈림길마다 특성 일부"]
S2 --> T2["트리 2 · 갈림길마다 특성 일부"]
S3 --> T3["트리 3 · 갈림길마다 특성 일부"]
T1 -->|새 회원의 답| A1["떠남"]
T2 -->|새 회원의 답| A2["남음"]
T3 -->|새 회원의 답| A3["떠남"]
A1 & A2 & A3 --> V["다수결 · 떠남"]
새 회원이 오면 세 트리가 각자 답을 냅니다. 다수결이 최종 답을 정합니다.
모으면 덜 틀리는 까닭
숫자 하나로 봅니다. 트리 셋이 저마다 새 회원을 열 번에 일곱 번꼴로 맞힌다고 합시다. 맞힐 확률이 0.7 입니다. 그리고 세 트리가 서로 상관없이 틀린다고 가정합니다.
다수결이 맞으려면 셋 중 둘 이상이 맞아야 합니다. 셋 다 맞을 확률은 0.7 × 0.7 × 0.7 = 0.343 입니다. 딱 둘만 맞는 경우는 틀리는 트리를 고르는 방법이 세 가지라서 3 × 0.7 × 0.7 × 0.3 = 0.441 입니다. 둘을 더하면 0.784 입니다.
트리 하나가 맞힐 확률은 0.7 입니다. 셋의 다수결이 맞힐 확률은 약 0.78 입니다. 서로 상관없이 틀리는 트리를 더 보태면 이 값은 더 오릅니다. 아래 그림은 같은 가정으로 트리 수를 아홉까지 늘려 계산한 값입니다.
xychart-beta
title "다수결이 맞힐 확률 · 상관없이 틀린다는 가정"
x-axis "트리 수" ["1", "3", "5", "7", "9"]
y-axis "맞힐 확률" 0.6 --> 1
line [0.700, 0.784, 0.837, 0.874, 0.901]
트리가 다섯이면 약 0.84, 아홉이면 약 0.90 입니다. 트리를 더할수록 오르지만 오르는 폭은 점점 줄어듭니다.
이 계산은 세 트리가 서로 상관없이 틀린다는 가정에 기댑니다. 세 트리가 똑같다면 다수결도 0.7 에 머뭅니다. 실제 트리들은 같은 데이터에서 자라서 어느 정도 같이 틀립니다. 그래서 얻는 몫은 이 계산보다 작습니다.
앞의 두 무작위가 하는 일이 이것입니다. 트리끼리 같이 틀리는 정도를 낮춰 모으는 효과를 키웁니다. 대신 트리 하나하나는 데이터 일부와 특성 일부만 보니 조금 덜 정확해집니다. 랜덤 포레스트는 이 둘을 맞바꿉니다.
트리 수를 늘려도 과적합이 커지지는 않습니다. 트리는 저마다 따로 자랍니다. 답은 그 트리들의 답을 모은 것일 뿐입니다. 그래서 트리를 더해도 모델이 훈련 데이터에 더 맞춰지지 않습니다. 트리를 더할수록 답이 안정되다가 어느 수를 넘으면 더 나아지지 않습니다. 그 뒤로는 시간과 메모리만 늡니다.
떼어 둔 데이터 없이 재는 표본 밖 오차
모델이 새 데이터를 얼마나 맞히는지 재려면 보통 훈련에 안 쓴 데이터를 따로 떼어 둡니다. 이 데이터가 검증 세트입니다. 떼어 둔 만큼 훈련에 쓸 데이터가 줄어듭니다.
랜덤 포레스트는 떼어 두지 않아도 됩니다. 부트스트랩 소절에서 본 것처럼 트리마다 한 번도 안 뽑힌 줄이 3분의 1쯤 있기 때문입니다. 그 트리에게 그 줄들은 처음 보는 데이터입니다.
줄마다 그 줄을 못 본 트리들만 모아 다수결로 답을 냅니다. 앞 표에서 3번 회원은 트리 1만 못 봤으니 트리 1의 답을 씁니다. 1번과 5번 회원은 트리 3의 답을, 2번과 4번 회원은 트리 2의 답을 씁니다.
OOB(out-of-bag, 표본 밖) 오차는 이 답들이 레이블과 어긋난 줄을 센 값입니다. OOB 오차는 검증 세트로 잰 오차와 비슷한 값을 줍니다.
교차 검증은 데이터를 여러 몫으로 나눠 성능을 재는 법입니다. 한 몫을 떼어 둔 채 나머지로 훈련하는 일을 몫마다 돌아가며 되풀이합니다. 훈련을 여러 번 해야 하니 오래 걸립니다. OOB 오차는 훈련 한 번으로 성능을 가늠하므로 하이퍼파라미터를 고를 때 교차 검증 대신 쓰기도 합니다.
어느 특성이 많이 쓰였나를 재는 특성 중요도
랜덤 포레스트는 트리 하나처럼 규칙을 따라가 보일 수 없습니다. 대신 어느 특성이 예측에 많이 쓰였는지를 숫자로 뽑을 수 있습니다. 이 숫자를 특성 중요도라고 합니다.
첫째 방법은 불순도로 잽니다. 모든 트리에서 그 특성으로 만든 갈림길이 불순도를 얼마나 줄였는지 더합니다. 지난 날수로 만든 갈림길이 불순도를 가장 많이 줄였다면 지난 날수의 중요도가 가장 높습니다.
둘째 방법은 섞어 보고 잽니다. 그 특성 칸의 값만 줄끼리 무작위로 뒤섞은 뒤 맞히는 비율이 얼마나 떨어지는지 봅니다. 많이 떨어질수록 모델이 그 특성에 기댄 것입니다. 이 방법을 순열 중요도라고 합니다.
중요도가 높다고 그 특성이 떠남의 원인이라는 뜻은 아닙니다. 모델이 그 특성을 많이 썼다는 뜻일 뿐입니다. 불순도로 잰 중요도는 값의 가짓수가 많은 특성을 부풀리는 경향도 있습니다.
훈련과 예측에 드는 시간
트리들은 서로를 모른 채 자랍니다. 그래서 트리마다 다른 프로세서 코어에 맡겨 동시에 키울 수 있습니다. 일을 쪼개 동시에 돌리는 이 방식을 병렬 처리라고 합니다.
훈련 비용은 트리 하나를 키우는 비용에 트리 수를 곱한 만큼입니다. 갈림길마다 특성 일부만 견주므로 트리 하나는 결정 트리를 혼자 키울 때보다 가볍습니다.
예측은 트리마다 맨 위 질문에서 끝까지 한 번씩 답하면 끝납니다. 트리 하나에서 거치는 질문 수가 앞에서 본 깊이입니다. 그래서 예측 한 번의 비용은 트리 수와 깊이의 곱에 비례합니다.
빅오 표기법으로는 트리 수를 T, 깊이를 d 라 할 때 O(T × d) 라고 적습니다. 빅오 표기법은 입력이 늘 때 비용이 어떤 모양으로 따라 느는지를 적는 약속입니다.
트리는 모두 메모리에 올려 둬야 합니다. 끝까지 키운 트리는 끝마다 한두 줄만 남으므로 갈림길과 끝의 수가 훈련 줄 수에 비례해 늡니다. 트리 수백 그루면 모델이 커집니다. 예측 한 번에 걸리는 시간도 트리 하나보다 깁니다.
그레이디언트 부스팅과 견주기
결정 트리를 묶는 앙상블에는 배깅 말고 부스팅이라는 갈래도 있습니다. 부스팅은 모델을 하나씩 차례로 더해 앞 모델의 모자람을 메웁니다. 그레이디언트 부스팅은 부스팅을 결정 트리로 하는 대표 방법입니다.
flowchart TD
E["앙상블"] --> BG["배깅"]
E --> BS["부스팅"]
BG -->|+ 갈림길마다 특성 일부| RF["랜덤 포레스트"]
BS --> GB["그레이디언트 부스팅"]
그레이디언트 부스팅의 새 트리는 앞 트리들이 틀린 만큼을 메우도록 훈련됩니다. 두 방법을 표로 견주면 아래와 같습니다.
| 랜덤 포레스트 | 그레이디언트 부스팅 | |
|---|---|---|
| 트리를 만드는 순서 | 따로 동시에 | 하나씩 차례로 |
| 새 트리가 배우는 것 | 자기 부트스트랩 표본 | 앞 트리들이 틀린 만큼 |
| 트리 하나의 모양 | 끝까지 키운 깊은 트리 | 흔히 얕은 트리 |
| 주로 줄이는 것 | 분산 | 편향 |
| 답을 내는 법 | 다수결이나 평균 | 모든 트리의 답을 더한다 |
| 트리 수를 늘리면 | 안정되다가 멈춘다 | 지나치면 과적합된다 |
랜덤 포레스트는 흔들리는 트리 여럿을 모아 흔들림을 줄입니다. 그레이디언트 부스팅은 반대쪽에서 출발합니다. 질문 몇 개로 멈춘 얕은 트리는 혼자서는 단순해서 편향이 큽니다.
부스팅은 이런 얕은 트리를 차례로 더해 앞에서 못 맞힌 만큼을 메웁니다. 그렇게 편향을 줄여 갑니다. 다만 너무 많이 메우면 훈련 데이터의 우연까지 메웁니다. 트리 수를 지나치게 늘리면 과적합되는 까닭입니다.
부스팅은 트리를 동시에 키울 수 없어서 훈련을 쪼개기 어렵습니다. 대신 하이퍼파라미터를 잘 맞추면 정확도가 더 높게 나오는 일이 많습니다.
랜덤 포레스트가 맞는 데이터와 약한 데이터
랜덤 포레스트는 칸이 정해진 표 데이터에서 흔히 고르는 모델입니다. 회원 이탈 예측, 사기 거래 찾기, 대출 심사처럼 특성이 표의 칸으로 주어지는 일이 그렇습니다. 아래 표는 그 까닭과 약점을 나란히 적었습니다.
| 성질 | 까닭 |
|---|---|
| 특성의 단위를 맞출 필요가 없다 | 질문이 특성 하나를 기준값과 견주기만 한다. 날수와 금액이 한 표에 섞여도 된다 |
| 숫자와 범주가 섞여도 된다 | 범주 특성은 「요금제가 무료인가」처럼 묻는다 |
| 트리 하나보다 과적합이 덜하다 | 서로 다르게 틀리는 트리의 답을 모아 분산을 줄인다 |
| 훈련 범위 밖의 숫자를 못 낸다 | 트리 끝에 적힌 값들을 다시 평균한다 |
| 예측 근거를 따라가 보이기 어렵다 | 트리 수백 그루의 질문을 사람이 다 읽을 수 없다 |
| 모델이 크고 예측 한 번에 시간이 더 든다 | 트리를 모두 저장하고 모두 거친다 |
| 사진·소리·글에 약하다 | 픽셀 하나, 글자 하나 같은 칸은 따로 떼어 보면 뜻이 없다 |
위 세 줄이 랜덤 포레스트를 고르는 까닭입니다. 손을 덜 대고도 트리 하나보다 덜 틀리는 모델을 얻습니다. 그래서 새 문제에 처음 세워 보는 기준 모델로도 자주 씁니다.
넷째 줄은 회귀에서 조심할 점입니다. 훈련 데이터에서 가장 비싼 집이 10억 원이면 모델은 그보다 비싼 값을 내지 못합니다. 트리 끝에 적힌 값은 그 끝에 닿은 훈련 집값들의 평균이라 10억 원을 넘을 수 없습니다. 그 값들을 다시 평균해도 마찬가지입니다.
마지막 줄의 데이터는 칸 하나하나보다 칸끼리의 배치가 뜻을 집니다. 이런 데이터에는 신경망을 흔히 씁니다.
관련 항목
랜덤 포레스트가 속하는 상위 분류
머신러닝 · 지도학습 · 분류 · 회귀 · 모델 · 앙상블 · 알고리즘
랜덤 포레스트를 이루는 구성 요소
결정 트리 · 배깅 · 부트스트랩 · 복원 추출 · 불순도 · 지니 불순도 · 다수결
랜덤 포레스트가 받는 훈련 데이터의 구성 요소
훈련 데이터 · 특성 · 레이블 · 범주형 변수 · 결측치
랜덤 포레스트의 성능을 재고 맞추는 방법
검증 세트 · 교차 검증 · OOB 오차 · 하이퍼파라미터 · 하이퍼파라미터 튜닝 · 그리드 서치 · 정확도
랜덤 포레스트가 다스리는 오차의 원인
과적합 · 과소적합 · 편향과 분산 · 분산 · 잡음 · 일반화
랜덤 포레스트와 겨루는 다른 모델
그레이디언트 부스팅 · 부스팅 · XGBoost · LightGBM · 엑스트라 트리 · 로지스틱 회귀 · 서포트 벡터 머신 · 최근접 이웃 · 신경망
랜덤 포레스트의 예측을 해석하는 개념
특성 중요도 · 순열 중요도 · 해석 가능성 · 설명 가능한 인공지능 · 결정 경계
랜덤 포레스트의 비용을 따지는 개념
다른 이름: random forest · random forests · 랜덤 포리스트 · 무작위 숲 · 랜덤 포레스트 모델