의사결정트리
AI가 '20 질문 게임'을 하는 법
의사의 진단법, 알고리즘이 되다
여러분이 목이 아파서 병원에 갔다고 상상해 봅시다. 의사는 이렇게 질문합니다. "열이 있나요?" -- "네." -- "기침을 하나요?" -- "아니요." -- "목이 부었나요?" -- "네." -- "편도선염이 의심됩니다."
의사는 가장 중요한 질문부터 순서대로 물어서 진단을 좁혀 갑니다. 이 과정 자체가 바로 의사결정트리(Decision Tree)입니다. 데이터를 가장 잘 나누는 질문을 찾아서 반복하면, 컴퓨터도 이런 진단을 할 수 있습니다.
의사결정트리는 머신러닝에서 가장 직관적인 알고리즘 중 하나입니다. 결과를 사람이 읽을 수 있는 규칙으로 설명할 수 있기 때문에, "왜 이런 예측을 했는가?"라는 질문에 명확히 답할 수 있습니다.
트리의 구조: 뿌리, 가지, 잎
의사결정트리는 이름 그대로 나무를 뒤집어 놓은 구조입니다. 맨 위에 뿌리(root)가 있고, 아래로 가지(branch)가 뻗어 나가며, 끝에 잎(leaf)이 있습니다.
내부 노드(Internal Node): 추가 질문으로 데이터를 더 나눔.
리프 노드(Leaf): 최종 판단. "이직한다" 또는 "이직하지 않는다."
깊이(Depth): 루트에서 가장 먼 리프까지의 질문 횟수.
비유하자면, "스무고개" 게임과 같습니다. 적은 질문으로 정답을 맞추려면, 가장 많은 후보를 한 번에 제거하는 질문을 먼저 해야 합니다. "동물인가요?"처럼 반을 나누는 질문이 "코끼리인가요?"보다 훨씬 효율적이죠.
친구가 어떤 물건을 떠올렸고, 여러분은 20번 이내의 예/아니오 질문으로 맞춰야 합니다. 나쁜 전략: "혹시 연필인가요?" -- 아니오. "혹시 책상인가요?" -- 아니오. 이러면 매번 후보가 1개씩만 줄어듭니다. 좋은 전략: "생물인가요?" -- 아니오. "실내에서 쓰나요?" -- 네. "전자제품인가요?" -- 네. 이렇게 절반씩 좁혀가는 질문이 좋은 질문입니다. 의사결정트리의 알고리즘도 정확히 이 논리를 따릅니다. 매 단계에서 데이터를 가장 균등하게 두 그룹으로 나누는 질문(특성 + 기준값)을 자동으로 찾아냅니다.
불순도(Impurity): 얼마나 섞여 있는가?
상자 안에 빨간 공 10개만 있으면 순수합니다. 빨간 공 5개 + 파란 공 5개면 최대로 불순합니다. 트리 알고리즘은 분할 후 자식 노드들의 불순도 합이 최소가 되는 분할을 선택합니다.
지니 불순도 (Gini Impurity)
p_i는 각 클래스의 비율입니다. 클래스가 2개일 때, 50:50이면 Gini = 1 - 0.25 - 0.25 = 0.5 (최대 불순). 100:0이면 Gini = 1 - 1 - 0 = 0 (완전 순수).
엔트로피 (Entropy)
정보이론에서 온 개념입니다. 불확실성이 클수록 엔트로피가 높습니다. 클래스가 2개일 때 최댓값은 1.0, 최솟값은 0입니다.
사과 바구니에 사과만 10개 있으면 순수합니다 (불순도 = 0). 눈 감고 집어도 100% 사과입니다. 사과 5개 + 오렌지 5개가 섞여 있으면 최대로 불순합니다 (불순도 = 0.5). 눈 감고 집으면 반반의 확률이니, 무엇이 나올지 가장 불확실합니다. 트리 알고리즘의 목표는 이 섞임을 빠르게 해소하는 것입니다. "연봉 5000만원 이상?" 같은 질문으로 한쪽에는 이직자만, 다른 쪽에는 잔류자만 남기는 것이 이상적입니다.
정보 이득 (Information Gain)
정보 이득이 클수록 좋은 분할입니다. 모든 가능한 질문(특성 + 분할점)에 대해 정보 이득을 계산하고, 가장 높은 것을 선택합니다. 이 과정을 재귀적으로 반복하면 트리가 완성됩니다.
실습 1: 직접 트리 만들기
아래는 직원 이탈 데이터입니다. 5가지 특성을 보고, 어떤 특성으로 분할할지 직접 선택해 보세요. 각 후보의 지니 불순도 감소량을 비교하고, 알고리즘이 선택한 최적 분할과 비교합니다.
| 연봉(만원) | 근속(년) | 만족도(1-5) | 야근(시간/주) | 승진여부 | 이탈 |
|---|
실습 2: 지니 vs 엔트로피 비교
같은 분할에 대해 지니 불순도와 엔트로피를 나란히 비교합니다. 대부분의 경우 같은 분할을 선택합니다. 차이가 나는 경우를 찾아보세요.
Gini Impurity
Entropy
실습 3: 깊이와 과적합
트리를 깊게 만들면 훈련 데이터를 완벽하게 외울 수 있습니다. 하지만 새로운 데이터에서는? 깊이 슬라이더를 움직여서 과적합의 순간을 찾아보세요.
실습 4: 가지치기(Pruning)
과적합을 막는 대표적인 방법이 가지치기입니다. 너무 깊이 자란 트리의 불필요한 가지를 잘라내면, 오히려 예측 성능이 좋아집니다.
정원의 나무를 한 번도 가지치기하지 않으면, 가지가 사방으로 뻗어 볼품없고 열매도 부실합니다. 의사결정트리도 마찬가지입니다. 데이터의 모든 세부 사항(노이즈 포함)을 완벽하게 반영하려고 가지를 끝없이 뻗으면, 훈련 데이터에는 100% 맞지만 새 데이터에서는 틀립니다. 가지치기는 "이 가지가 정말 유용한 정보를 담고 있는가?"를 묻고, 아니라면 잘라내는 과정입니다. 적절히 다듬어진 트리가 오히려 더 정확하고 일반화 성능이 좋습니다.
실습 5: 특성 중요도
트리가 만들어진 후, 각 특성이 분류에 얼마나 기여했는지 측정할 수 있습니다. 특성 중요도 = 해당 특성을 사용한 모든 분할에서의 총 지니 감소량입니다.
스무고개를 다시 생각해봅시다. 게임이 끝난 후 돌아보면, 어떤 질문은 후보를 확 좁혀줬고 어떤 질문은 별 도움이 안 됐을 것입니다. 특성 중요도는 이 "유용성 점수"입니다. 트리가 "만족도 > 3인가?"라는 질문으로 데이터를 매우 깔끔하게 나눴다면, 만족도의 중요도가 높습니다. 반면 "성별이 남성인가?"로 나눠봤더니 별 차이가 없었다면, 성별의 중요도는 낮습니다. 이것은 의사결정트리의 강력한 부산물입니다 -- 예측뿐 아니라 "왜?"에 대한 답을 줍니다.
의사결정트리의 장점과 한계
장점
- 직관적이고 설명하기 쉬움
- 특성 스케일링 불필요
- 범주형/수치형 혼합 가능
- 비선형 관계 포착
- 특성 중요도 자동 제공
한계
- 과적합에 취약 (깊은 트리)
- 데이터 변화에 민감 (불안정)
- 축 평행 분할만 가능
- 최적 트리 찾기는 NP-완전
- 단독 성능은 앙상블에 밀림
- 의사결정트리는 데이터를 가장 잘 나누는 질문을 반복해서 분류 규칙을 만든다.
- "가장 잘 나눈다" = 불순도(지니 또는 엔트로피)를 최대로 줄이는 분할이다.
- 트리가 너무 깊으면 과적합. 가지치기(pruning)로 최적 복잡도를 찾는다.
- 특성 중요도를 통해 "무엇이 예측에 가장 큰 영향을 미치는가"를 알 수 있다.
- 단점: 불안정성과 단독 성능의 한계 -- 이것을 극복하는 것이 앙상블 학습이다.
다음 장 예고: 한 그루의 나무가 불안정하다면, 숲을 만들면 어떨까요? 다음 장에서는 여러 약한 모델을 결합하는 앙상블 학습을 배웁니다.