본문 바로가기
데이터사이언티스트 Data Scientist

의사결정나무(Decision Tree)

by 루시달 2024. 11. 7.

의사결정나무(Decision Tree) 분류(Classification) 회귀(Regression) 문제에 모두 사용할 수 있는 지도 학습(Supervised Learning) 알고리즘입니다. 데이터에서 규칙 기반의 의사결정을 통해 목표 변수를 예측합니다.

 

 

1. 의사결정나무의 구조

  • 노드(Node):
    • 결정 노드(Decision Node): 특정 조건에 따라 데이터를 분할.
    • 단말 노드(Leaf Node): 최종 출력 값을 예측(분류 또는 회귀 결과).
  • 분기(Branch):
    • 각 노드는 조건에 따라 분기를 통해 데이터를 두 그룹으로 나눕니다.
Root Node
  ├── Decision Node (Condition: X < 5)
  │     ├── Leaf Node (Class A)
  │     └── Leaf Node (Class B)
  └── Decision Node (Condition: X >= 5)
        ├── Leaf Node (Class C)
        └── Leaf Node (Class D)

 

 

2. 의사결정나무의 주요 개념

(1) 정보 이득(Information Gain)

  • 데이터를 분할할 때 얼마나 유용한 정보를 얻는지를 측정.
  • *엔트로피(Entropy)를 기준으로 계산: 

 

(2) 지니 지수(Gini Impurity)

  • 불순도를 측정하여 분할의 질을 평가

  • : 특정 클래스에 속할 확률.

(3) CART (Classification and Regression Tree)

  • 사이킷런의 의사결정나무는 CART 알고리즘을 사용.
    • 분류: 지니 지수 또는 엔트로피 기반.
    • 회귀: 평균 제곱 오차(MSE) 기반.

3. 의사결정나무의 장단점

장점:

  1. 해석 용이: 결과가 트리 구조로 제공되어 이해하기 쉽습니다.
  2. 특성 스케일링 불필요: 정규화나 표준화가 필요하지 않음.
  3. 다양한 데이터 처리 가능: 수치형 및 범주형 데이터 모두 처리 가능.

단점:

  1. 과적합(Overfitting): 트리가 너무 깊어질 경우 훈련 데이터에 과적합될 수 있습니다.
  2. 일반화 성능 저하: 새로운 데이터에 대한 예측력이 떨어질 수 있음.
  3. 불안정성: 데이터의 작은 변화로 트리 구조가 크게 바뀔 수 있습니다.

4. 의사결정나무 알고리즘의 활용 예시

(1) 분류 문제

  • 이메일 스팸 필터링.
  • 고객 세그먼트 분석.

(2) 회귀 문제

  • 주택 가격 예측.
  • 특정 시간대의 온도 예측.

5. Python을 활용한 의사결정나무 구현

*사이킷런(Scikit-learn)을 사용하여 의사결정나무를 구현하는 예시입니다.

 

(1) 분류 모델

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import matplotlib.pyplot as plt

# 데이터 로드
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# 의사결정나무 분류 모델 학습
clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
clf.fit(X_train, y_train)

# 시각화
plt.figure(figsize=(12, 8))
tree.plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

 

(2) 회귀 모델

from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split

# 데이터 로드
X, y = load_diabetes(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 의사결정나무 회귀 모델 학습
reg = DecisionTreeRegressor(max_depth=3, random_state=42)
reg.fit(X_train, y_train)

# 예측 및 평가
predictions = reg.predict(X_test)

 

6. 의사결정나무의 개선

(1) 가지치기(Pruning)

  • 사전 가지치기(Pre-pruning): 트리가 너무 깊어지지 않도록 최대 깊이(max_depth) 설정.
  • 사후 가지치기(Post-pruning): 모델 학습 후 불필요한 노드를 제거.

(2) 앙상블 기법

  • 랜덤 포레스트(Random Forest): 여러 의사결정나무의 예측을 평균화하여 성능 향상.
  • 그래디언트 부스팅(Gradient Boosting): 순차적 모델 학습으로 예측 정확도를 높임.

7. 요약

  • 의사결정나무는 데이터를 규칙 기반으로 분할하여 예측하는 직관적인 알고리즘입니다.
  • 분류회귀 모두에 사용 가능하며, 결과를 쉽게 해석할 수 있는 장점이 있습니다.
  • 과적합 문제를 해결하기 위해 가지치기 또는 앙상블 기법을 활용할 수 있습니다.

사이킷런에서 제공하는 붓꽃데이터 세트 기반 ML 분류예측 수행 프로젝트 프로세스

반응형