← AI 놀이터 홈으로

🌳 결정트리 (Decision Tree)

'x가 6보다 큰가요?' — 스무고개 하듯 질문을 던져 데이터를 나누는 모델이에요. 좋은 질문의 기준은 나눈 뒤 얼마나 덜 섞이는가!

📖 따라하기 가이드 — 1 / 7 단계

Step 1. 스무고개로 분류하기

결정트리(Decision Tree)는 스무고개처럼 “x가 6보다 큰가요?” 같은 질문을 던져 데이터를 둘로 나누고, 또 나누고… 를 반복하는 모델이에요. 화면의 점은 두 반 학생이라고 생각해 보세요 — 🔵 파랑과 🔴 빨강. 가로축이 x, 세로축이 y이고, 캔버스를 클릭하면 선택한 색의 점이 추가돼요(점 근처를 다시 클릭하면 삭제). 목표는 좋은 질문으로 두 색을 깔끔하게 갈라놓는 것!

🖱️ 캔버스를 클릭하면 선택한 색(🔵/🔴)의 점이 추가되고, 점 근처를 클릭하면 삭제돼요.

📂 데이터 꾸러미:

가로축 x, 세로축 y (둘 다 0~10). 수동 모드에서는 보라 점선이 내가 만든 질문 하나, 자동 모드에서는 색칠된 영역이 트리의 예측(파랑 영역 = 🔵로 예측)이고 보라 선이 트리가 고른 질문들이에요. 영역 경계가 항상 축과 평행한 직선인 것도 관전 포인트!

🎛️ 질문 만들기

클릭으로 추가할 점
어느 축으로 나눌까?

📊 지금 상태

분할 전 Gini
0.000
분할 후 Gini (가중 평균)
0.000
불순도 감소 (지니 이득)
0.000
정확도 (질문 1개)
0 / 0

불순도 감소(지니 이득) = 분할 전 Gini − 분할 후 Gini. 클수록 데이터를 잘 가르는 좋은 질문이에요.

🧮 수식과 파이썬

Gini = 1 − Σ pₖ²
0이면 완벽히 순수(한 색만), 0.5면 반반 섞임
🐍 파이썬 코드로 보면? (펼치기)
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
import numpy as np

# X: (n, 2) 좌표 데이터, y: 0(빨강) / 1(파랑) 라벨
X = np.array(coords)   # 예: [[7.2, 6.1], [2.3, 4.5], ...]
y = np.array(labels)

# max_depth로 트리 깊이를 제한해 과적합을 막아요
model = DecisionTreeClassifier(criterion="gini", max_depth=2)
model.fit(X, y)        # 학습: 최선의 질문을 재귀적으로 찾기

print("정확도:", model.score(X, y))

# 학습된 트리를 그림으로 확인 (이 페이지의 트리 구조 카드와 같아요)
plt.figure(figsize=(8, 5))
plot_tree(model, feature_names=["x", "y"], filled=True)
plt.show()