데이터분석데브코스 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)log2p(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) | 연속형 숫자 |
공통 단점 | 과적합, 축의존성, 노이즈 민감 |
실전 활용 예시
- 고객 성향 분석
- 자동차 가격 예측
- 학생 점수 예측
- 질병 중증도 예측 등