Decision Tree (의사결정트리)

조은별·2025년 5월 10일
post-thumbnail

이 문서는 의사결정트리(Decision Tree) 알고리즘의 기초 이론부터 실습 예제,
그리고 엔트로피(Entropy), 정보이득(Information Gain) 수식까지 포함하여 학습한 내용을 자세히 정리한 자료입니다.

Decision Tree (의사결정트리) 알고리즘 정리


1. 개요

의사결정트리는 분류(classification) 또는 회귀(regression) 문제를 해결하는 데 사용되는
가장 직관적이고 구조적인 머신러닝 알고리즘 중 하나입니다.

새로운 샘플이 들어왔을 때, 트리의 루트에서 시작하여 각 노드에서 조건문을 따라가며
분기를 거쳐 최종 예측을 수행합니다.

트리의 구성 요소

  • 노드(Node): 조건문을 포함한 분기 기준
  • 엣지(Edge): 분기 조건 결과에 따라 나뉘는 경로
  • 루트 노드(Root): 첫 번째 분기 기준
  • 잎 노드(Leaf): 최종 분류 결과를 담고 있는 노드

즉, 데이터의 특성을 기반으로 질문을 던지듯 분기하며 최종적으로 클래스(분류) 또는 값(회귀)를 예측합니다.

  • 분류 문제: yes/no, spam/ham, malignant/benign
  • 회귀 문제: 예측값을 평균 또는 가중 평균으로 추론

2. 대표 알고리즘 - ID3

의사결정트리는 데이터를 어떻게 나눌지 결정해야 하며, 이때 사용하는 대표적인 알고리즘이 바로 ID3입니다.

ID3는 다음 두 개념을 기반으로 작동합니다:

데이터 분할 기준 - 엔트로피(Entropy)와 정보이득(Information Gain)

  • Entropy (엔트로피): 데이터의 불확실성 측정
  • Information Gain (정보 이득): 엔트로피 감소량을 기반으로 분할 기준을 선택

ID3 특징

  • 분류 문제 전용
  • 범주형 데이터에 적합
  • 엔트로피와 정보이득을 사용하여 트리를 만듬

한계

  • 연속형 변수 처리 어려움
  • 과적합(overfitting)에 민감

이후 C4.5, CART 등에서 이를 보완하여 Gini 지수, 가지치기 등을 도입함


3. 엔트로피 (Entropy)

개념

  • 엔트로피는 데이터 집합의 혼합 정도를 의미합니다.
  • 순수한(한 클래스만 존재하는) 데이터는 엔트로피가 0
  • 여러 클래스가 섞여 있을수록 엔트로피는 높아집니다.

수식

클래스가 k개일 때, 엔트로피 E는 다음과 같이 정의됩니다:

Entropy(S) = - ∑ p_i * log2(p_i)
  • S: 데이터 집합
  • p_i: 클래스 i의 비율

엔트로피 예시

  • [0.5, 0.5] → E = 1.0 (가장 불확실)
  • [1.0, 0.0] → E = 0.0 (완전히 확실)

4. Information Gain (정보이득)

Information Gain은 어떤 속성 A로 데이터를 분할했을 때
전체 엔트로피가 얼마나 줄어드는지를 계산하는 값입니다.

수식

IG(S, A) = Entropy(S) - ∑ (|S_v| / |S|) * Entropy(S_v)
  • S: 전체 데이터 집합
  • A: 속성
  • S_v: 속성 A의 값 v에 해당하는 부분집합

직관적 해석

  • 분할 후 엔트로피가 많이 줄어들수록 → 좋은 속성
  • 가장 큰 정보이득을 주는 속성을 기준으로 분기함

5. 엔트로피 시각화 비교

분포클래스 구성엔트로피
완전히 섞임[0.5, 0.5]1.0
대부분 동일[0.9, 0.1]~0.47
완전 순수[1.0, 0.0]0.0

6. 실습 예제 (Scikit-learn)

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt

X, y = load_iris(return_X_y=True)

# ID3는 엔트로피 사용
model = DecisionTreeClassifier(criterion='entropy', max_depth=3)
model.fit(X, y)

# 시각화
plt.figure(figsize=(12, 6))
plot_tree(model, filled=True, feature_names=load_iris().feature_names, class_names=load_iris().target_names)
plt.show()

7. 실무에서 고려할 점

  • 데이터 전처리

    • 범주형 속성: LabelEncoder, OneHotEncoder 등을 활용해 숫자화 필요

    • 연속형 속성: 자동으로 최적 임계값을 찾아 <= threshold 방식으로 분기

  • 트리 분할 기준 설정

    • criterion="entropy": 정보이득(ID3) 기반 → 정확성은 높지만 계산 복잡

    • criterion="gini": 지니지수(CART) 기반 → 계산 빠르고 실무에서 일반적으로 사용

  • 과적합 방지를 위한 하이퍼파라미터

    • max_depth: 트리의 최대 깊이 제한

    • min_samples_split: 분기 기준이 되기 위한 최소 샘플 수

    • min_samples_leaf: 리프 노드에 남을 최소 샘플 수

    • pruning: 불필요한 가지 제거 (사후 가지치기 또는 사전 제약)

  • 성능 최적화 팁

    • 교차검증으로 최적의 하이퍼파라미터 튜닝

    • 불균형 클래스 문제 시 class_weight="balanced" 활용 가능


8. 요약

항목설명
엔트로피클래스 분포의 불확실성 측정
정보이득분할 전후 엔트로피 감소량
ID3정보이득을 기준으로 속성 선택
지니지수CART에서 사용되는 간단한 불순도 지표
트리 과적합 제어max_depth, pruning 등

9. 내가 정리하며 느낀 점

엔트로피 개념은 수학적으로 어렵지 않지만,
실제 분할 기준을 고르는 데 매우 직관적인 기준이 된다는 걸 알게 되었다.
ID3는 단순하면서도 이해하기 쉬운 알고리즘이지만,
실전에서는 Gini 지수 기반 CART가 더 널리 쓰인다는 점도 기억해야겠다.

다음에는 CART, C4.5, 그리고 Random Forest까지 비교 정리할 계획이다.

profile
기록과 회고를 통해 성장하는 데이터, AI 엔지니어 지망생입니다.

0개의 댓글