상세 컨텐츠

본문 제목

분류 - 의사결정나무(Decision Tree)

인공지능/머신러닝

by 2^7 2024. 12. 16. 21:00

본문

의사결정 나무(Decision Tree)

  • 데이터를 트리 형태로 분류하거나 예측하는 데 사용하는 지도 학습(Supervised Learning) 알고리즘.
  • 나무 모양처럼 분기(branch)가 갈라지며 각 분기점에서 질문을 던지고, 그 질문에 따라 데이터를 분류하거나 예측하는 방식으로 동작함

 

의사결정 나무 특징

  • 구조가 직관적: 트리 구조를 통해 사람이 쉽게 이해할 수 있음
  • 다양한 데이터 처리 가능: 연속형 및 범주형 데이터를 모두 처리할 수 있음
  • 해석 용이성: 결과를 시각적으로 표현하여 의사결정을 설명하기 쉬움
  • 재귀적 분할: 데이터를 반복적으로 분할하여 트리 구조를 완성.

 

의사결정나무의 구조

1) 루트 노드 (Root Node)

  • 의사결정나무의 시작점으로, 데이터를 처음 분류하기 위한 기준이 설정됨
  • ex) "온도가 30도 이상인가?"라는 질문을 통해 데이터를 두 그룹으로 나눔

 2) 내부 노드(Internal Node)

  • 각 내부 노드는 추가적인 질문을 통해 데이터를 더 세부적으로 나눔

 3) 리프 노드(Leaf Node)

  • 더 이상 데이터를 나눌 필요가 없을 때 도달하는 노드
  • 최종적으로 예측된 결과(ex. 분류 레이블 또는 숫자 값)가 저장됨

 

의사결정나무가 작동하는 방식

1) 특성 선택

  • 데이터를 나누는 기준이 되는 특성을 선택
  • ex) 학생들의 시험 점수를 분석할 때 "공부 시간"과 "출석률" 중 어떤 특성이 데이터를 더 잘 나눌 수 있을지 판단

 2) 기준 설정

  • 선택된 특성을 기준으로 데이터를 분리
  • 분리를 가장 잘할 수 있는 임계값(Threshold)을 설정함
  • ex) "공부 시간이 5시간 이상인가?" 같은 질문

 3) 반복적으로 분할

  • 루트 노드에서 시작해 리프 노드에 도달할 때까지 데이터를 나눔
  • 데이터를 더 이상 나눌 수 없거나, 설정된 조건(ex. 최대 깊이)이 충족될 때까지 계속됨

 

의사결정나무의 장점과 단점

 1) 장점

  • 직관적: 결과를 시각적으로 표현하기 쉬워서 비전문가도 이해하기 쉬움
  • 다양한 데이터 처리: 수치형 데이터와 범주형 데이터를 모두 처리할 수 있음
  • 빠른 학습과 예측: 계산이 상대적으로 간단하며, 빠르게 학습하고 예측할 수 있음

 2) 단점

  • 과적합(Overfitting): 데이터가 너무 세밀하게 분류되면, 새로운 데이터에 대해 성능이 낮아질 수 있음
  • 변동성(Variance): 데이터가 조금만 바뀌어도 트리의 구조가 크게 변할 수 있음
  • 비효율적인 분할: 트리가 너무 깊어지면 계산 자원이 많이 소모될 수 있음

 

의사결정나무 개선 방법

 1) 가지치기

  • 트리의 크기를 줄여 과적합을 방지하는 방법( 데이터를 너무 세밀하게 나누는 것을 방지 )

 2) 최대 깊이 제한

  • 트리가 너무 깊어지지 않도록 최대 깊이를 설정

 3) 앙상블 기법 사용

  • 의사결정나무 하나 대신 여러 개를 사용하여 성능을 높이는 랜덤 포레스트(Random Forest)나 그래디언트 부스팅(Gradient Boosting) 같은 기법을 사용

Python에서 scikit-learn 라이브러리를 사용해 간단한 의사결정 나무 모델을 구현

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 데이터 로드
data = load_iris()
X = data.data
y = data.target

# 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

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

# 예측
y_pred = model.predict(X_test)

# 성능 평가
print("Accuracy:", accuracy_score(y_test, y_pred))

# 트리 구조 출력
tree_rules = export_text(model, feature_names=data.feature_names)
print("\nDecision Tree Rules:\n", tree_rules)

 

 

 

728x90

관련글 더보기