이론

[알고리즘] 의사결정나무 Decision Tree - 개념 정리

weweGH 2026. 7. 7. 09:00
반응형

의사결정나무 개념 정리
의사결정나무 개념 정리


의사결정나무 Decision Tree - 개념 정리


들어가며


의사결정나무(Decision Tree)는 머신러닝에서 가장 직관적으로 이해하기 쉬운 알고리즘 중 하나입니다. 이름 그대로 나무(Tree) 구조를 활용하여 데이터를 분류하거나 수치를 예측합니다.

예를 들어, "오늘 우산을 들고 나갈까?"라는 질문에 답하는 과정을 생각해 보겠습니다.

  • "오늘 비 예보가 있나요?" → 있다 → 우산 챙기기
  • "오늘 비 예보가 있나요?" → 없다 → "구름이 많이 낀 날씨인가요?" → 아니다 → 우산 불필요

이처럼 질문을 단계적으로 던지면서 최종 결론에 도달하는 구조가 바로 의사결정나무입니다.



의사결정나무의 구성 요소


의사결정나무는 다음 3가지 요소로 구성됩니다.

  • 루트 노드(Root Node): 나무의 맨 위, 전체 데이터를 처음 분할하는 시작점
  • 내부 노드(Internal Node): 조건(질문)에 따라 데이터를 나누는 중간 분기점
  • 리프 노드(Leaf Node): 나무의 끝, 최종 예측값(클래스 혹은 수치)이 결정되는 지점

※ 트리의 깊이(Depth)는 루트에서 리프까지의 거리를 의미하며, 깊이가 깊어질수록 더 세밀한 분류가 가능하지만 과적합(Overfitting) 위험도 함께 증가합니다.


분할 기준 - 불순도란?


의사결정나무는 데이터를 분할할 때 "어떤 조건으로 나눠야 가장 잘 분류할 수 있는가?"를 기준으로 설정합니다. 이 기준이 바로 불순도(Impurity)입니다.

불순도란, 한 노드 안에 서로 다른 클래스가 얼마나 섞여 있는지를 나타내는 값입니다. 불순도가 낮을수록, 즉 한 클래스로만 구성될수록 좋은 분할입니다. 불순도를 측정하는 대표적인 지표는 지니 불순도, 엔트로피 2가지입니다.


[ 지니 불순도 | Gini Impurity ]

사이킷런(scikit-learn)의 기본 설정값으로, 모든 데이터가 같은 클래스라면 지니 불순도는 0이 됩니다. 수식은 다음과 같습니다.

$$ Gini = 1 - \sum_{k=1}^{K} p_k^2 $$

  • $p_k$: 노드 내 클래스 $k$의 비율
  • 값의 범위: 0(완전 순수) ~ 0.5(완전 혼합, 이진 분류 기준)

[ 엔트로피 | Entropy ]

정보 이론에서 출발한 지표로, 수식은 다음과 같습니다.

$$ Entropy = -\sum_{k=1}^{K} p_k \log_2(p_k) $$

  • 값의 범위: 0(완전 순수) ~ 1(완전 혼합, 이진 분류 기준)

※ 두 지표 모두 낮을수록 좋은 분할을 의미합니다. 실무에서는 계산이 빠른 지니 불순도를 주로 사용합니다.


[ 정보 이득 | Information Gain ]

지니 불순도와 엔트로피가 노드 하나의 순수도를 측정한다면, 정보 이득(Information Gain)은 분할 전후의 불순도 차이를 비교하여 최선의 분할 조건을 선택하는 기준입니다.

  • 예를 들어, "독감에 걸렸는지"를 예측하는 문제에서 각 조건의 정보 이득이 다음과 같다고 가정하겠습니다.
    • 발열 여부로 나누면 정보 이득 = 0.24
    • 기침 여부로 나누면 정보 이득 = 0.12

이 경우 정보 이득이 더 큰 '발열'을 분할 기준으로 먼저 선택합니다. 즉, 불순도를 도구로 사용하여 계산하는 값이 정보 이득입니다.

$$ IG = Impurity_{parent} - \sum_{child} \frac{n_{child}}{n_{parent}} \times Impurity_{child} $$

반응형

의사결정나무 예제


다음과 같은 날씨 데이터로 "골프를 칠 것인지"를 예측하는 예제를 살펴보겠습니다.

날씨 온도 습도 바람 골프 여부
맑음 높음 높음 약함 X
맑음 높음 높음 강함 X
흐림 높음 높음 약함 O
보통 높음 약함 O
낮음 보통 약함 O
낮음 보통 강함 X
흐림 낮음 보통 강함 O
맑음 보통 높음 약함 X
맑음 낮음 보통 약함 O
보통 보통 약함 O

위 데이터를 의사결정나무로 분류하면, 알고리즘은 각 조건(날씨, 온도, 습도, 바람)에 대해 정보 이득을 계산하고 가장 높은 조건부터 분할합니다. 다음 이미지처럼 조건을 단계으로 분기하여 최종 예측에 도달합니다.

** 다음 이미지는 설명을 위한 단순화 예시입니다. 실제 학습 시, 온도 조건이 추가될 수 있습니다.

골프 여부 예측 시각화
골프 여부 예측 시각화


파이썬을 활용한 의사결정나무


파이썬으로 의사결정나무를 구현하는 방법은 다음과 같습니다. sklearn의 DecisionTreeClassifier를 사용합니다.

from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.preprocessing import LabelEncoder
import pandas as pd

# 예제 데이터
data = {
    '날씨':    ['맑음','맑음','흐림','비','비','비','흐림','맑음','맑음','비'],
    '온도':    ['높음','높음','높음','보통','낮음','낮음','낮음','보통','낮음','보통'],
    '습도':    ['높음','높음','높음','높음','보통','보통','보통','높음','보통','보통'],
    '바람':    ['약함','강함','약함','약함','약함','강함','강함','약함','약함','약함'],
    '골프여부': [0, 0, 1, 1, 1, 0, 1, 0, 1, 1]
}

df = pd.DataFrame(data)

# 범주형 데이터 인코딩
le = LabelEncoder()
X = df[['날씨', '온도', '습도', '바람']].apply(le.fit_transform)
y = df['골프여부']

# 모델 학습
model = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
model.fit(X, y)

# 트리 구조 출력
print(export_text(model, feature_names=['날씨', '온도', '습도', '바람']))

 

[ 주요 파라미터 ]

파라미터 설명 기본값
criterion 불순도 기준(gini or entropy) gini
max_depth 트리의 최대 깊이(과적합 방지) None
min_samples_split 노드 분할에 필요한 최소 샘플 수 2
min_samples_leaf 리프 노드의 최소 샘플 수 1

 

[ 트리 시각화 ]

시각화 코드는 다음과 같습니다. 'filled=True' 옵션을 사용하면 각 노드가 다수 클래스의 색상으로 채워지므로, 분류 결과를 직관적으로 확인할 수 있습니다.

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

plt.figure(figsize=(12, 6))
plot_tree(
    model,
    feature_names=['날씨', '온도', '습도', '바람'],
    class_names=['골프 안 함', '골프 함'],
    filled=True,
    rounded=True
)
plt.title("Decision Tree - 골프 여부 예측")
plt.show()

트리 시각화
트리 시각화


장점과 한계점


[ 장점 ]

  • 모델의 결정 과정을 트리 구조로 시각화할 수 있어 해석이 쉽습니다.
  • 수치형, 범주형 데이터를 모두 처리할 수 있습니다.
  • 데이터 정규화나 표준화 없이도 사용 가능합니다.
  • 특성 중요도(Feature Importance)를 통해 어떤 변수가 예측에 영향을 주는지 파악할 수 있습니다.

[ 한계점 ]

  • 트리가 지나치게 깊어지면 과적합(Overfitting)이 발생하기 쉽습니다.
  • 데이터의 작은 변화에도 트리 구조가 크게 바뀔 수 있어 불안정합니다.
  • 데이터가 불균형(Imbalanced)할 경우 편향된 트리가 형성될 수 있습니다.

이러한 한계점을 보완하기 위해 여러 개의 의사결정나무를 결합한 랜덤 포레스트(Random Forest), 그래디언트 부스팅(Gradient Boosting) 등의 앙상블 방법이 등장하게 됩니다.


마무리하며

의사결정나무는 질문을 단계적으로 분기하여 최종 결론을 도출하는 알고리즘으로, 직관적인 해석이 가능하다는 것이 가장 큰 장점입니다. 불순도(지니, 엔트로피)를 기준으로 정보 이득이 최대인 조건을 선택하여 데이터를 분할하며, `max_depth` 등의 파라미터로 과적합을 제어할 수 있습니다.


반응형