한양과학기술고등학교

에듀테크 프로젝트 대시보드

결정 트리 (Decision Tree)

결정 트리 (Decision Tree)

"날개가 있어? → 응. 날 수 있어? → 아니. → 펭귄." 결정 트리는 이런 스무고개를 데이터로부터 자동으로 만든다. 핵심은 어떤 질문을 먼저 던져야 답이 가장 빨리 갈리는가 — 이 "갈림의 정도"를 재는 자가 엔트로피와 지니 불순도다.

결정 트리는 규칙(if–else)의 사다리다. 각 내부 노드는 하나의 질문(특징 < 임계값), 각 잎(leaf)은 최종 예측. 학습이란 곧 "매 단계에서 데이터를 가장 잘 나누는 질문 고르기"의 반복이다.

1. 불순도 — 한 상자가 얼마나 섞여 있나

한 노드에 A 클래스와 B 클래스가 섞여 있다. 얼마나 "지저분한지"를 숫자로 재자. 두 가지 척도가 쓰인다.

엔트로피 H = −Σ pᵢ·log₂ pᵢ   |   지니 G = 1 − Σ pᵢ²

둘 다 한 클래스만 있으면 0(완벽하게 순수), 반반이면 최대(가장 혼란). 아래 슬라이더로 A의 비율을 바꿔 보라.

엔트로피 지니
A 비율  
엔트로피 H (bits)
–
지니 불순도 G
–

2. 정보 이득 — 어떤 질문이 가장 많이 갈라주나

부모 노드의 불순도에서, 질문으로 나눈 자식들의 가중 평균 불순도를 뺀 값이 정보 이득(Information Gain)이다. 클수록 좋은 질문.

IG = H(부모) − Σ (자식 크기 / 부모 크기) · H(자식)

새(분홍) vs 포유류(파랑) 8마리. 세 가지 질문 중 하나로 나눠 보자.

동물깃털난다알을 낳음정답
질문 선택:
부모 엔트로피 H = 1.000 bits (새 4, 포유류 4)
질문을 골라 정보 이득을 확인하세요.
깃털 질문은 두 자식이 모두 완벽히 순수해져 IG가 최대(1.0 bit)다. 트리는 이렇게 탐욕적으로 매 단계 IG가 가장 큰 질문을 고른다.

3. 트리 자라기 — 2차원 데이터를 잘라 나가기

좌표평면에 흩어진 두 클래스 점들. 트리는 매번 세로선 또는 가로선(x < t, y < t) 하나로 공간을 잘라 불순도를 낮춘다. 「한 번 나누기」를 눌러 가장 지저분한 잎을 최적의 선으로 쪼개 보라.

특징 공간 — 배경색 = 그 칸의 예측 클래스
결정 트리 — 초록 잎 = 순수, 회색 잎 = 아직 섞임
깊이
0
잎 개수
1
학습 정확도
–
평균 불순도
–
아직 나누지 않았습니다. 트리는 뿌리 하나(다수결 예측)로 시작합니다.

4. 과적합과 가지치기

깊이 제한을 풀면 트리는 결국 모든 점을 외워 학습 정확도 100%를 만든다. 하지만 그건 데이터의 노이즈까지 외운 것 — 새 데이터에서는 오히려 틀린다. 이것이 과적합(overfitting)이다.

위 3번 데모에서 최대 깊이를 6으로 올리고 「자동」을 돌려 보라. 정확도는 오르지만 배경(결정 경계)이 점점 울퉁불퉁해진다 — 각 점을 감싸는 작은 상자들이 생기는 게 과적합의 모습이다.

5. 코드로 정리

import math

def entropy(rows):
    n = len(rows)
    if n == 0: return 0.0
    h = 0.0
    for c in set(r.label for r in rows):
        p = sum(1 for r in rows if r.label == c) / n
        h -= p * math.log2(p)
    return h

def best_split(rows):
    base = entropy(rows); best = (0, None, None)
    for feat in features:
        for t in thresholds(rows, feat):
            left  = [r for r in rows if r[feat] < t]
            right = [r for r in rows if r[feat] >= t]
            if not left or not right: continue
            w = len(left)/len(rows)
            ig = base - (w*entropy(left) + (1-w)*entropy(right))   # 정보 이득
            if ig > best[0]: best = (ig, feat, t)
    return best

def build(rows, depth=0):
    if depth == MAX_DEPTH or entropy(rows) == 0:
        return Leaf(majority(rows))               # 멈춤 → 다수결 예측
    ig, feat, t = best_split(rows)
    if ig <= 1e-7: return Leaf(majority(rows))
    left  = build([r for r in rows if r[feat] < t], depth+1)
    right = build([r for r in rows if r[feat] >= t], depth+1)
    return Node(feat, t, left, right)
한 줄 요약 — 결정 트리는 매 단계 정보 이득이 가장 큰 질문으로 데이터를 쪼개는 탐욕 알고리즘이고, 멈추지 않으면 과적합한다. 관련: 이진 탐색 트리, 경사 하강법, 퍼셉트론, k-평균 클러스터링, 허프만 코딩(같은 엔트로피).