Skip to main content

정보 이론 기초

정보 이론(Information Theory)은 데이터의 불확실성과 정보량을 측정하는 프레임워크로, 결정 트리의 분할 기준과 특성 선택의 수학적 기반입니다.

학습 목표

  • 엔트로피(Entropy)의 의미와 계산 방법을 이해합니다.
  • 정보 이득(Information Gain)이 결정 트리에서 어떻게 활용되는지 파악합니다.
  • 지니 불순도(Gini Impurity)와 엔트로피의 차이를 이해합니다.
  • KL 발산(Kullback-Leibler Divergence)의 개념을 학습합니다.

왜 중요한가

결정 트리(Decision Tree)는 매 분할에서 “어떤 특성으로, 어떤 값에서 나눌 것인가”를 결정합니다. 이 결정의 수학적 기준이 정보 이득(엔트로피 기반)과 지니 불순도입니다.

핵심 개념

엔트로피 (Entropy)

데이터의 **불확실성(무질서도)**을 측정합니다. 값이 클수록 불확실성이 높습니다.
import numpy as np

def entropy(probs):
    """확률 분포의 엔트로피를 계산합니다."""
    probs = np.array(probs)
    probs = probs[probs > 0]  # log(0) 방지
    return -np.sum(probs * np.log2(probs))

# 동전 던지기
print(f"공정한 동전 (50/50): {entropy([0.5, 0.5]):.4f}")  # 1.0 (최대 불확실성)
print(f"편향된 동전 (90/10): {entropy([0.9, 0.1]):.4f}")  # 0.4690
print(f"확실한 결과 (100/0): {entropy([1.0]):.4f}")        # 0.0 (불확실성 없음)
확률 분포엔트로피의미
[0.5, 0.5]1.0최대 불확실성 — 예측 불가
[0.9, 0.1]0.47낮은 불확실성 — 대부분 한쪽
[1.0, 0.0]0.0불확실성 없음 — 완전히 예측 가능

정보 이득 (Information Gain)

특성으로 데이터를 분할했을 때 엔트로피가 얼마나 감소하는지 측정합니다.
정보 이득 = 분할 전 엔트로피 - 분할 후 가중 평균 엔트로피
def information_gain(parent_probs, children_probs_list, children_sizes):
    """정보 이득을 계산합니다."""
    parent_entropy = entropy(parent_probs)
    total = sum(children_sizes)

    # 분할 후 가중 평균 엔트로피
    weighted_entropy = sum(
        (size / total) * entropy(probs)
        for probs, size in zip(children_probs_list, children_sizes)
    )

    return parent_entropy - weighted_entropy

# 예시: 날씨에 따른 테니스 경기 여부
# 전체: 9 Yes, 5 No
parent = [9/14, 5/14]

# "날씨=맑음"으로 분할: 맑음(2Y,3N), 흐림(4Y,0N), 비(3Y,2N)
children = [[2/5, 3/5], [4/4], [3/5, 2/5]]
sizes = [5, 4, 5]

ig = information_gain(parent, children, sizes)
print(f"정보 이득 (날씨): {ig:.4f}")  # 0.2467
결정 트리와의 연결: 결정 트리는 매 노드에서 정보 이득이 가장 큰 특성과 분할 기준을 선택합니다.

지니 불순도 (Gini Impurity)

엔트로피의 대안으로, 계산이 더 빠른 불순도 측정 방법입니다.
def gini_impurity(probs):
    """지니 불순도를 계산합니다."""
    probs = np.array(probs)
    return 1 - np.sum(probs ** 2)

# 엔트로피와 비교
for p in [0.5, 0.7, 0.9, 1.0]:
    probs = [p, 1-p]
    print(f"p={p:.1f}: 엔트로피={entropy(probs):.4f}, 지니={gini_impurity(probs):.4f}")
기준엔트로피지니 불순도
scikit-learn 기본값-기본값 (criterion='gini')
계산 복잡도log 연산 필요단순 곱셈
최대값1.0 (이진 분류)0.5 (이진 분류)
실무 성능 차이거의 동일거의 동일

KL 발산 (Kullback-Leibler Divergence)

두 확률 분포 사이의 차이를 측정합니다. 비대칭적이며, 값이 클수록 두 분포가 다릅니다.
from scipy.special import kl_div
from scipy.stats import entropy as scipy_entropy

p = np.array([0.4, 0.3, 0.3])  # 실제 분포
q = np.array([0.33, 0.33, 0.34])  # 근사 분포

# KL(P || Q)
kl = scipy_entropy(p, q)
print(f"KL(P || Q): {kl:.6f}")
ML 활용: 모델이 출력하는 확률 분포(Q)가 실제 분포(P)와 얼마나 다른지 측정합니다. 교차 엔트로피 손실 함수는 KL 발산과 밀접하게 관련됩니다.

AI/ML에서의 활용

개념ML 활용관련 알고리즘
엔트로피분할 기준, 불확실성 측정결정 트리
정보 이득최적 특성 선택랜덤 포레스트
지니 불순도빠른 분할 기준결정 트리
KL 발산분포 비교, 손실 함수교차 엔트로피 손실
상호 정보량특성 선택Filter 기반 선택
실무에서 성능 차이는 거의 없습니다. scikit-learn의 기본값인 지니 불순도를 먼저 사용하고, 필요시 엔트로피로 전환해서 비교하는 것을 권장합니다.
네. 특성과 타겟 변수 사이의 상호 정보량(Mutual Information)을 계산하여 유용한 특성을 선택할 수 있습니다. scikit-learn의 mutual_info_classifmutual_info_regression 함수가 이를 지원합니다.

체크리스트

  • 엔트로피의 의미를 직관적으로 설명할 수 있다
  • 정보 이득의 계산 과정을 이해한다
  • 지니 불순도와 엔트로피의 관계를 설명할 수 있다
  • 결정 트리가 정보 이론을 어떻게 활용하는지 설명할 수 있다

다음 문서