머신러닝을 공부하다 보면 자연스럽게 이런 의문이 생깁니다. 모델이 데이터를 분류할 때, 도대체 어떤 기준으로 판단을 내리는 걸까? 그리고 그 판단 과정을 사람이 직접 읽을 수 있을까? 지난 글에서 로지스틱 회귀를 통해 분류 문제를 확률로 접근하는 방법을 다뤘습니다. 오늘은 그보다 훨씬 직관적인 방식으로 분류와 회귀 문제를 동시에 풀 수 있는 모델, 결정 트리를 정리해보겠습니다 🙂
1. 결정 트리의 구조

결정 트리(Decision Tree)는 데이터를 분기(split)하는 질문들을 연속적으로 만들어 최종 예측값에 도달하는 모델입니다. 마치 스무고개처럼, 조건에 따라 데이터를 계속 나눠가는 구조입니다.
루트 노드(Root Node) → 내부 노드(Internal Node) → 리프 노드(Leaf Node)
루트 노드 : 첫 번째 분기 기준이 되는 최상위 노드
내부 노드 : 각 분기 조건을 담당하는 중간 노드
리프 노드 : 최종 예측값이 결정되는 끝 노드
중요한 점은 이 구조가 단순히 데이터를 나누는 것이 아니라, 각 분기마다 가장 의미 있는 질문을 스스로 찾아낸다는 것입니다. 어떤 질문이 의미 있는지를 판단하는 기준이 바로 불순도(Impurity)입니다.
1.1 분류와 회귀 모두 가능한 이유
결정 트리는 리프 노드에서 최종값을 결정하는 방식만 달라지면 분류와 회귀 모두에 사용할 수 있습니다.
| 구분 | 분류 트리 | 회귀 트리 |
|---|---|---|
| 출력값 | 가장 많은 클래스 | 평균값 |
| 불순도 기준 | 지니, 엔트로피 | MSE, MAE |
| 예시 | 스팸 분류, 생존 예측 | 집값 예측, 수요 예측 |
1.2 결정 트리가 선형 모델과 다른 점
선형 회귀나 로지스틱 회귀는 입력 변수와 출력 사이의 선형 관계를 가정합니다. 반면 결정 트리는 어떤 가정도 없이 데이터 자체의 구조를 따라갑니다.
이 덕분에 결정 트리는 비선형 관계, 변수 간 상호작용, 이상치가 있는 데이터에서도 비교적 잘 작동합니다. 단, 그만큼 과적합 위험도 높아집니다.
2. 분기 기준: 어떤 질문이 가장 좋은 질문인가
결정 트리 학습의 핵심은 각 분기에서 어떤 변수를, 어떤 값을 기준으로 나눌지를 결정하는 것입니다. 이를 위해 불순도(Impurity)라는 개념을 사용합니다.
불순도란 하나의 노드 안에 여러 클래스가 섞여 있는 정도입니다.
분기를 거칠수록 불순도가 낮아지는 방향으로 학습이 진행됩니다.
2.1 지니 불순도 (Gini Impurity)

사이킷런(scikit-learn)의 결정 트리 기본 설정값입니다. 계산이 빠르고 직관적입니다.
Gini = 1 - Σ(pᵢ)²
pᵢ는 해당 노드에서 클래스 i의 비율입니다.
예를 들어 한 노드에 양성 50개, 음성 50개가 있다면
Gini = 1 - (0.5² + 0.5²) = 0.5 → 최대 불순도
반대로 양성 100개, 음성 0개라면
Gini = 1 - (1.0² + 0.0²) = 0 → 완전히 순수
2.2 엔트로피와 정보 이득 (Entropy & Information Gain)
엔트로피(Entropy)는 정보이론에서 유래한 개념으로, 노드 안의 무질서도를 측정합니다.
Entropy = -Σ pᵢ · log₂(pᵢ)
정보 이득(Information Gain)은 분기 전후의 엔트로피 차이입니다. 결정 트리는 이 값이 가장 큰 변수와 기준을 선택해 분기합니다.
Information Gain = Entropy(부모) - Σ [가중치 × Entropy(자식)]
2.3 지니 vs 엔트로피: 실무에서의 선택
| 구분 | 지니 불순도 | 엔트로피 |
|---|---|---|
| 계산 방식 | 제곱합 기반 | 로그 연산 기반 |
| 계산 속도 | 빠름 | 상대적으로 느림 |
| 성능 차이 | 대부분의 경우 거의 없음 | |
| sklearn 기본값 | ✓ | |
실무에서는 기본값인 지니를 그대로 사용하는 경우가 대부분입니다.
두 지표를 비교하기보다는 다른 하이퍼파라미터 튜닝에 집중하는 것이 효율적입니다.
3. 과적합: 결정 트리의 구조적 약점
결정 트리는 제한을 두지 않으면 훈련 데이터를 완벽하게 학습할 때까지 계속 분기합니다. 극단적으로는 리프 노드마다 데이터 1개씩 배정되는 상황도 가능합니다.
트리 깊이 증가 → 훈련 정확도 ↑ → 새로운 데이터에 대한 성능 ↓
이것이 과적합(Overfitting)입니다.
3.1 과적합을 제어하는 주요 하이퍼파라미터

| 파라미터 | 역할 | 권장 방향 |
|---|---|---|
| max_depth | 트리 최대 깊이 제한 | 3~10 사이에서 시작 |
| min_samples_split | 분기를 위한 최소 샘플 수 | 값이 클수록 단순한 트리 |
| min_samples_leaf | 리프 노드 최소 샘플 수 | 작은 리프 생성 방지 |
| max_features | 분기 시 고려할 변수 수 | 랜덤 포레스트의 핵심 아이디어 |
3.2 코드로 보는 결정 트리
타이타닉 생존 예측을 예시로 결정 트리를 적용해보겠습니다.
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습 (max_depth로 과적합 제어)
clf = DecisionTreeClassifier(max_depth=4, min_samples_leaf=5, random_state=42)
clf.fit(X_train, y_train)
# 예측 및 평가
y_pred = clf.predict(X_test)
print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")
# 트리 구조 텍스트로 출력
print(export_text(clf, feature_names=list(X.columns)))
# 특성 중요도 확인
import pandas as pd
importance_df = pd.DataFrame({
'feature': X.columns,
'importance': clf.feature_importances_
}).sort_values('importance', ascending=False)
print(importance_df)
max_depth=4로 설정하면 트리가 최대 4단계까지만 분기합니다.
제한 없이 학습시켰을 때와 비교해보면 과적합의 차이를 직접 확인할 수 있습니다.
4. 특성 중요도: 모델이 어떤 변수를 중요하게 봤는가
결정 트리는 학습이 끝난 후 각 변수가 분기에 얼마나 기여했는지를 수치로 제공합니다. 이것이 특성 중요도(Feature Importance)입니다.
Feature Importance = Σ (해당 변수가 분기에 기여한 불순도 감소량)
이 값은 전체 합이 1이 되도록 정규화되어 출력됩니다.
4.1 특성 중요도의 한계와 주의점
결정 트리의 특성 중요도는 몇 가지 한계가 있습니다.
① 연속형 변수나 고유값(카디널리티)이 많은 변수에 유리하게 측정되는 경향이 있습니다.
② 서로 상관관계가 높은 변수가 있을 경우 중요도가 분산되어 실제보다 낮게 나올 수 있습니다.
③ 단일 결정 트리의 특성 중요도는 트리 구조가 바뀔 때마다 불안정하게 변합니다.
더 신뢰할 수 있는 변수 중요도가 필요하다면 SHAP 값을 활용하는 것이 좋습니다.
SHAP은 모델에 관계없이 각 변수의 기여도를 일관되게 측정합니다. (추후 별도 글에서 다룰 예정입니다.)
5. 결정 트리에서 앙상블로
결정 트리 단독으로는 과적합에 취약하고, 데이터의 작은 변화에도 트리 구조가 크게 바뀌는 불안정성(High Variance)을 가집니다.
이 한계를 극복하기 위해 등장한 것이 앙상블 모델입니다. 여러 개의 결정 트리를 조합해 개별 트리의 약점을 상쇄하고 더 안정적인 예측을 만들어냅니다.
결정 트리 한 그루는 불안정하지만,
수백 그루의 트리가 모이면 강력한 예측기가 됩니다.
다음 글에서 다룰 랜덤 포레스트가 바로 그 원리입니다.
정리
결정 트리는 단순하지만 머신러닝의 핵심 개념들이 집약된 모델입니다.
- 불순도(지니, 엔트로피)를 기준으로 스스로 분기 질문을 설계한다
- 분류와 회귀 모두 가능한 유연한 구조를 가진다
- 과적합에 취약하며 max_depth와 min_samples_leaf 튜닝이 핵심이다
- 특성 중요도를 제공하지만 한계가 있으며 SHAP으로 보완할 수 있다
- 단독보다는 앙상블의 기반 모델로 더 강력하게 활용된다
다음 글에서는 랜덤 포레스트를 다뤄보겠습니다. 나무가 많아지면 왜 더 강해지는지, 앙상블의 원리를 살펴볼게요 🙂
'AI & ML > ML' 카테고리의 다른 글
| [머신러닝] XGBoost & LightGBM: 부스팅은 왜 순서가 중요한가 (0) | 2026.05.25 |
|---|---|
| [머신러닝] 랜덤 포레스트: 나무가 많아지면 왜 더 강해지는가 (0) | 2026.05.24 |
| [머신러닝] 로지스틱 회귀: 분류 문제를 확률로 푸는 방법 (0) | 2026.04.26 |
| [머신러닝] 선형 회귀: 가장 단순한 모델의 작동 원리 (0) | 2026.04.26 |
| [머신러닝] 지도학습(회귀모델 vs 분류모델) (3) | 2026.02.17 |
HELLO WORLD
안녕하세요. 데이터로 말하는 분석가 모모입니다.
데이터를 구조화하고 분석하는 과정과 실무에 활용되는 도구 중심의 내용을 기록합니다.