Skip to content
PART 4 · 22장

의사결정트리

AI가 '20 질문 게임'을 하는 법

의사의 진단법, 알고리즘이 되다

여러분이 목이 아파서 병원에 갔다고 상상해 봅시다. 의사는 이렇게 질문합니다. "열이 있나요?" -- "네." -- "기침을 하나요?" -- "아니요." -- "목이 부었나요?" -- "네." -- "편도선염이 의심됩니다."

의사는 가장 중요한 질문부터 순서대로 물어서 진단을 좁혀 갑니다. 이 과정 자체가 바로 의사결정트리(Decision Tree)입니다. 데이터를 가장 잘 나누는 질문을 찾아서 반복하면, 컴퓨터도 이런 진단을 할 수 있습니다.

의사결정트리는 머신러닝에서 가장 직관적인 알고리즘 중 하나입니다. 결과를 사람이 읽을 수 있는 규칙으로 설명할 수 있기 때문에, "왜 이런 예측을 했는가?"라는 질문에 명확히 답할 수 있습니다.

트리의 구조: 뿌리, 가지, 잎

의사결정트리는 이름 그대로 나무를 뒤집어 놓은 구조입니다. 맨 위에 뿌리(root)가 있고, 아래로 가지(branch)가 뻗어 나가며, 끝에 잎(leaf)이 있습니다.

루트 노드(Root): 전체 데이터에 대한 첫 번째 질문. "연봉이 5000만원 이상인가?"
내부 노드(Internal Node): 추가 질문으로 데이터를 더 나눔.
리프 노드(Leaf): 최종 판단. "이직한다" 또는 "이직하지 않는다."
깊이(Depth): 루트에서 가장 먼 리프까지의 질문 횟수.

비유하자면, "스무고개" 게임과 같습니다. 적은 질문으로 정답을 맞추려면, 가장 많은 후보를 한 번에 제거하는 질문을 먼저 해야 합니다. "동물인가요?"처럼 반을 나누는 질문이 "코끼리인가요?"보다 훨씬 효율적이죠.

쉽게 말하면 -- 스무고개를 좀 더 자세히 살펴봅시다:
친구가 어떤 물건을 떠올렸고, 여러분은 20번 이내의 예/아니오 질문으로 맞춰야 합니다. 나쁜 전략: "혹시 연필인가요?" -- 아니오. "혹시 책상인가요?" -- 아니오. 이러면 매번 후보가 1개씩만 줄어듭니다. 좋은 전략: "생물인가요?" -- 아니오. "실내에서 쓰나요?" -- 네. "전자제품인가요?" -- 네. 이렇게 절반씩 좁혀가는 질문이 좋은 질문입니다. 의사결정트리의 알고리즘도 정확히 이 논리를 따릅니다. 매 단계에서 데이터를 가장 균등하게 두 그룹으로 나누는 질문(특성 + 기준값)을 자동으로 찾아냅니다.
핵심 질문: 어떤 질문이 "가장 좋은" 질문일까요? 답은 불순도(impurity)를 가장 크게 줄이는 질문입니다. 잎 노드에 한 종류의 데이터만 남으면 "순수(pure)"하다고 합니다.

불순도(Impurity): 얼마나 섞여 있는가?

상자 안에 빨간 공 10개만 있으면 순수합니다. 빨간 공 5개 + 파란 공 5개면 최대로 불순합니다. 트리 알고리즘은 분할 후 자식 노드들의 불순도 합이 최소가 되는 분할을 선택합니다.

지니 불순도 (Gini Impurity)

Gini = 1 - p_1^2 - p_2^2 - ... - p_k^2

p_i는 각 클래스의 비율입니다. 클래스가 2개일 때, 50:50이면 Gini = 1 - 0.25 - 0.25 = 0.5 (최대 불순). 100:0이면 Gini = 1 - 1 - 0 = 0 (완전 순수).

엔트로피 (Entropy)

Entropy = - p_1 log2(p_1) - p_2 log2(p_2) - ...

정보이론에서 온 개념입니다. 불확실성이 클수록 엔트로피가 높습니다. 클래스가 2개일 때 최댓값은 1.0, 최솟값은 0입니다.

비유: 방에 들어갔는데 모든 사람이 같은 팀 유니폼을 입고 있으면 (Gini=0), 누가 어느 팀인지 즉시 알 수 있습니다. 반반 섞여 있으면 (Gini=0.5), 물어봐야 합니다. 트리는 "물어볼 필요가 없는" 상태, 즉 순수한 상태를 목표로 합니다.
쉽게 말하면 -- 불순도란 "섞임 정도"입니다:
사과 바구니에 사과만 10개 있으면 순수합니다 (불순도 = 0). 눈 감고 집어도 100% 사과입니다. 사과 5개 + 오렌지 5개가 섞여 있으면 최대로 불순합니다 (불순도 = 0.5). 눈 감고 집으면 반반의 확률이니, 무엇이 나올지 가장 불확실합니다. 트리 알고리즘의 목표는 이 섞임을 빠르게 해소하는 것입니다. "연봉 5000만원 이상?" 같은 질문으로 한쪽에는 이직자만, 다른 쪽에는 잔류자만 남기는 것이 이상적입니다.

정보 이득 (Information Gain)

Information Gain = 부모 불순도 - (왼쪽 비율 x 왼쪽 불순도 + 오른쪽 비율 x 오른쪽 불순도)

정보 이득이 클수록 좋은 분할입니다. 모든 가능한 질문(특성 + 분할점)에 대해 정보 이득을 계산하고, 가장 높은 것을 선택합니다. 이 과정을 재귀적으로 반복하면 트리가 완성됩니다.

실습 1: 직접 트리 만들기

아래는 직원 이탈 데이터입니다. 5가지 특성을 보고, 어떤 특성으로 분할할지 직접 선택해 보세요. 각 후보의 지니 불순도 감소량을 비교하고, 알고리즘이 선택한 최적 분할과 비교합니다.

목표: 각 노드에서 분할할 특성을 선택하세요. 지니 감소량(Gain)이 가장 큰 특성을 고르면 최적 트리와 같아집니다. 당신의 직관 vs 알고리즘 -- 얼마나 비슷한 결과가 나올까요?
연봉(만원) 근속(년) 만족도(1-5) 야근(시간/주) 승진여부 이탈
현재 노드: 루트 (전체 데이터)
선택한 특성: --
당신의 정확도
-
최적 트리 정확도
-
트리 깊이
-

실습 2: 지니 vs 엔트로피 비교

같은 분할에 대해 지니 불순도와 엔트로피를 나란히 비교합니다. 대부분의 경우 같은 분할을 선택합니다. 차이가 나는 경우를 찾아보세요.

Gini Impurity

Entropy

50%
발견: 지니는 0~0.5, 엔트로피는 0~1 범위입니다. 스케일은 다르지만 형태가 매우 비슷해서, 실무에서는 어떤 것을 쓰든 결과가 거의 같습니다. scikit-learn의 기본값은 지니이고, 계산이 약간 더 빠릅니다.

실습 3: 깊이와 과적합

트리를 깊게 만들면 훈련 데이터를 완벽하게 외울 수 있습니다. 하지만 새로운 데이터에서는? 깊이 슬라이더를 움직여서 과적합의 순간을 찾아보세요.

관찰 포인트: 훈련 정확도(파란선)는 깊이가 깊어질수록 항상 올라갑니다. 테스트 정확도(빨간선)는 어느 지점 이후 내려갑니다. 그 최적 지점이 바로 최적 깊이입니다.
3
결정 경계
깊이별 정확도
훈련 정확도
-
테스트 정확도
-
리프 수
-
최적 깊이
-
과적합 경고: 깊이가 15 이상이면 결정 경계가 들쭉날쭉해집니다. 훈련 데이터의 노이즈까지 학습한 것입니다. 이것은 "시험 문제를 외웠지만 응용 문제를 못 푸는" 것과 같습니다.

실습 4: 가지치기(Pruning)

과적합을 막는 대표적인 방법이 가지치기입니다. 너무 깊이 자란 트리의 불필요한 가지를 잘라내면, 오히려 예측 성능이 좋아집니다.

쉽게 말하면 -- 나무를 적당히 다듬어야 건강합니다:
정원의 나무를 한 번도 가지치기하지 않으면, 가지가 사방으로 뻗어 볼품없고 열매도 부실합니다. 의사결정트리도 마찬가지입니다. 데이터의 모든 세부 사항(노이즈 포함)을 완벽하게 반영하려고 가지를 끝없이 뻗으면, 훈련 데이터에는 100% 맞지만 새 데이터에서는 틀립니다. 가지치기는 "이 가지가 정말 유용한 정보를 담고 있는가?"를 묻고, 아니라면 잘라내는 과정입니다. 적절히 다듬어진 트리가 오히려 더 정확하고 일반화 성능이 좋습니다.
비용-복잡도 가지치기(Cost-Complexity Pruning): alpha 값을 높이면, 복잡한 트리에 패널티를 줍니다. 총 비용 = 분류 오류 + alpha x (리프 노드 수). alpha가 크면 단순한 트리를 선호합니다.
0.000
현재 리프 수
-
훈련 정확도
-
테스트 정확도
-
핵심: 가지치기는 "적당히 단순한" 트리를 찾는 과정입니다. alpha를 서서히 높여보면, 테스트 정확도가 처음에는 올라가다가 나중에 떨어지는 것을 볼 수 있습니다. 정원사가 나무를 가지치기하면 오히려 더 건강하게 자라는 것과 같은 원리입니다.

실습 5: 특성 중요도

트리가 만들어진 후, 각 특성이 분류에 얼마나 기여했는지 측정할 수 있습니다. 특성 중요도 = 해당 특성을 사용한 모든 분할에서의 총 지니 감소량입니다.

쉽게 말하면 -- "어떤 질문이 가장 유용한가?":
스무고개를 다시 생각해봅시다. 게임이 끝난 후 돌아보면, 어떤 질문은 후보를 확 좁혀줬고 어떤 질문은 별 도움이 안 됐을 것입니다. 특성 중요도는 이 "유용성 점수"입니다. 트리가 "만족도 > 3인가?"라는 질문으로 데이터를 매우 깔끔하게 나눴다면, 만족도의 중요도가 높습니다. 반면 "성별이 남성인가?"로 나눠봤더니 별 차이가 없었다면, 성별의 중요도는 낮습니다. 이것은 의사결정트리의 강력한 부산물입니다 -- 예측뿐 아니라 "왜?"에 대한 답을 줍니다.
비즈니스 질문: "직원 이탈을 막으려면 어떤 요인에 집중해야 할까?" 특성 중요도를 보면, 가장 영향력 큰 요인을 데이터로 확인할 수 있습니다. 연봉 인상이 효과적일까, 아니면 야근 줄이기가 더 효과적일까?
전체 특성 정확도
-
특성 제거 후 정확도
-
정확도 변화
-
해석: 중요한 특성을 제거하면 정확도가 크게 떨어집니다. 중요하지 않은 특성을 제거해도 거의 변화가 없습니다. 이것이 특성 선택(feature selection)의 기초입니다.

의사결정트리의 장점과 한계

장점

  • 직관적이고 설명하기 쉬움
  • 특성 스케일링 불필요
  • 범주형/수치형 혼합 가능
  • 비선형 관계 포착
  • 특성 중요도 자동 제공

한계

  • 과적합에 취약 (깊은 트리)
  • 데이터 변화에 민감 (불안정)
  • 축 평행 분할만 가능
  • 최적 트리 찾기는 NP-완전
  • 단독 성능은 앙상블에 밀림
데이터 하나만 바뀌어도: 의사결정트리는 훈련 데이터에 매우 민감합니다. 데이터 하나가 바뀌면 완전히 다른 트리가 만들어질 수 있습니다. 이 불안정성을 해결하기 위해 다음 장에서 배울 앙상블 학습이 등장합니다.
  • 의사결정트리는 데이터를 가장 잘 나누는 질문을 반복해서 분류 규칙을 만든다.
  • "가장 잘 나눈다" = 불순도(지니 또는 엔트로피)를 최대로 줄이는 분할이다.
  • 트리가 너무 깊으면 과적합. 가지치기(pruning)로 최적 복잡도를 찾는다.
  • 특성 중요도를 통해 "무엇이 예측에 가장 큰 영향을 미치는가"를 알 수 있다.
  • 단점: 불안정성과 단독 성능의 한계 -- 이것을 극복하는 것이 앙상블 학습이다.

다음 장 예고: 한 그루의 나무가 불안정하다면, 숲을 만들면 어떨까요? 다음 장에서는 여러 약한 모델을 결합하는 앙상블 학습을 배웁니다.