데이터분석데브코스 8/이론

8 - 13. Decision Tree

DataJ 2025. 5. 28. 12:40

✅ [1부] Decision Tree 용어 및 구조 이해

1. 트리 기반 분류 모델이란?

  • 입력 데이터를 조건에 따라 분기하면서 최종 예측값 또는 클래스를 결정하는 모델
  • 질문을 연속적으로 던지는 방식으로 작동

2. 핵심 용어 정리

용어 설명

노드(Node) 특정 질문 또는 조건 (예: "나이 > 30?")
엣지(Edge) 노드와 노드를 연결하며, 질문에 대한 답변 경로
루트노드 트리의 시작점. 첫 조건
분할노드(결정노드) 데이터를 나누는 중간 노드
리프노드(말단노드) 더 이상 분기가 없는 최종 노드 (예측값 출력)

✅ [2부] 분류 문제에서의 Decision Tree 구성

1. 트리의 분할 기준 (Decision Criteria)

  • 각 노드에서 어떤 기준으로 데이터를 나눌 것인가가 핵심
  • 좋은 분할은 과적합을 줄이고 일반화 성능을 높임

2. 대표 분할 기준

(1) 정보 이득 (Information Gain) — 엔트로피 기반

  • 엔트로피(Entropy): 데이터의 불확실성을 나타냄
  • 정보이득: 분할 전-후 엔트로피 감소량
  • 엔트로피 수식:H(X)=−∑p(x)log2p(x)
  • H(X)=−∑p(x)log⁡2p(x)H(X) = - \sum p(x) \log_2 p(x)
  • 정보이득 수식:IG=H(부모)−∑(자식 엔트로피)
  • IG=H(부모)−∑(자식 엔트로피)IG = H(\text{부모}) - \sum (\text{자식 엔트로피})

(2) 지니 불순도 (Gini Impurity)

  • 각 클래스의 불균형도를 측정
  • 수식:Gini(S)=1−∑pi2
  • Gini(S)=1−∑pi2Gini(S) = 1 - \sum p_i^2
  • Gini가 0이면 한 클래스만 존재 → 순도 높음

✅ 차이 요약

항목 엔트로피 (Entropy) 지니 불순도 (Gini Impurity)

의미 정보의 불확실성 측정 클래스 혼합도 측정
계산 복잡도 로그 계산 포함 → 상대적으로 느림 곱셈/덧셈만 있음 → 더 빠름
분할 성향 정보이득이 큰 걸 선호 → 불균형 클래스 민감 클래스가 혼합되지 않게 분리하려 함 → 균형 분할 선호
사용 예 이론적으로 정확성 중시 실용적으로 속도 중시

✅ 실전에서의 선택 기준

상황 추천

속도, 성능 모두 중요할 때 Gini (기본값, 계산 빠름)
정보 이론 기반 분석할 때 Entropy (정보이득에 민감)
클래스 불균형이 큰 경우 Entropy가 더 나은 분할을 찾는 경우가 있음
Scikit-learn 기본값 사용 시 criterion='gini' (기본값)

3. 엔트로피/지니 계산 예시

노드 클래스 분포 엔트로피 지니 불순도

A 0 / 5 / 15 0.8113 0.375
B 7 / 6 / 7 1.5813 0.665
C 20 / 0 / 0 0 0
  • C 노드는 한 클래스만 → 순도 최상

4. 분류 문제 예시 코드 (Scikit-learn):

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(criterion='entropy', max_depth=3)
model.fit(X_train, y_train)
  • criterion: 'gini' 또는 'entropy' 선택 가능
  • max_depth: 과적합 방지를 위한 최대 깊이 제한

5. 활용 분야

  • 의료 진단 (예: 질병 여부 예측)
  • 고객 이탈 예측 (churn prediction)
  • 신용 위험 평가
  • 텍스트 분류, 음성 분류 등

✅ [3부] 회귀 문제를 위한 Decision Tree

1. 회귀 트리란?

  • 분류 대신 연속값(숫자)을 예측하는 트리 모델
  • 리프 노드는 범주가 아니라 수치 예측값을 출력

2. 분할 기준: MSE (Mean Squared Error)

  • 각 노드에서의 오차는 MSE(평균제곱오차)로 측정
  • MSE가 가장 작아지도록 분할 기준 결정

MSE 수식:

MSE=1n∑(yi−y^)2MSE = \frac{1}{n} \sum (y_i - \hat{y})^2

MSE=n1∑(yi−y^)2

  • yiy_iyi: 실제값
  • y^\hat{y}y^: 예측값 (리프노드의 평균값)

예시 코드 (Scikit-learn):

from sklearn.tree import DecisionTreeRegressor

model = DecisionTreeRegressor(max_depth=4)
model.fit(X_train, y_train)
predictions = model.predict(X_test)

✅ [4부] Decision Tree 모델 사용 시 주의사항

1. 장점

  • 직관적이며 시각화 가능
  • 전처리(스케일링) 거의 불필요
  • 범주형/수치형 모두 처리 가능

2. 단점 및 리스크

문제 설명

수직 분할 한계 데이터 경계가 축과 평행할 때는 유리, 회전된 데이터엔 비효율적
과적합 위험 깊은 트리일수록 훈련 데이터에 과적합되기 쉬움
노이즈 민감성 작은 데이터 변화에도 모델 전체가 달라질 수 있음
일반화 어려움 분기 기준이 지나치게 세분화되면 테스트셋 성능 저하

해결 방법:

  • max_depth, min_samples_split 등 하이퍼파라미터 조정
  • 앙상블 기법 사용 (랜덤 포레스트, 그래디언트 부스팅 등)
  • *PCA (주성분 분석)**을 통한 축 회전 고려

📌 전체 요약: Decision Tree

구분 설명 분할 기준 예측값

분류 트리 클래스 예측 엔트로피, 지니 불순도 범주형 (ex. Yes/No)
회귀 트리 숫자 예측 평균제곱오차 (MSE) 연속형 숫자
공통 단점 과적합, 축의존성, 노이즈 민감    

실전 활용 예시

  • 고객 성향 분석
  • 자동차 가격 예측
  • 학생 점수 예측
  • 질병 중증도 예측 등