AI/ML

[ML] 지도학습 - 분류모델 (의사결정나무)

죵욜이 2024. 12. 29. 01:20

의사결정나무 란?

의사결정나무(Decision Tree) 는 머신러닝에서 널리 사용되는 지도학습 알고리즘으로,

데이터를 계층적으로 나누어 예측하거나 분류하는 데 사용된다.

직관적이고 시작적으로 이해하기 쉬운구조를 가지며, 분류와 회귀 문제 모두에 활용될 수 있다.

 

트리구조를 가지며, 각 내부 노드는 데이터의 특정 feature 에 대한 테스트를 나타내고, 각 가지(branch)는 테스트 결과를 나타내며, 각 리프노드(leaf) 는 클래스레이블을 나타낸다


의사결정나무의 기본 개념

  1. 트리 구조:
    • 루트 노드(Root Node): 트리의 최상단 노드로, 전체 데이터셋을 나타냅니다.
    • 분기(Branch): 데이터를 특정 기준에 따라 나누는 과정.
    • 내부 노드(Internal Node): 데이터를 나누는 기준(결정 규칙)이 포함된 노드.
    • 리프 노드(Leaf Node): 최종적으로 예측값(또는 클래스)을 반환하는 노드.
  2. 의사결정 과정:
    • 데이터를 순차적으로 분할하면서 결정 기준(규칙)을 설정합니다.
    • 각 분기는 데이터의 특정 특성(feature)을 기준으로 나뉩니다.
    • 최종적으로 리프 노드에 도달하면, 해당 노드에 속한 데이터의 클래스나 값을 예측합니다.

의사결정나무의 작동 방식

1. 특성 선택:

  • 각 노드에서 데이터를 나누는 기준이 되는 특성을 선택합니다.
  • 특성 선택의 목표는 데이터를 가장 잘 분리할 수 있는 기준을 찾는 것입니다.

2. 정보 이득(Information Gain):

  • 특성 선택을 평가하는 기준 중 하나로, 데이터의 불확실성을 줄이는 정도를 측정합니다.
  • 엔트로피를 사용하여 계산됩니다.

3. 지니 지수 (Gini Index):

  • CART(Classification and Regression Tree) 알고리즘에서 사용하는 분할 기준입니다.
  • 지니지수는 데이터의 불순도를 측정하며, 값이 낮을수록 더 잘 분리된 상태를 의미합니다

4. 최적의 분할 : 

  • 각 특성과 가능한 분할 기준을 평가하여, 정보 이득이나 지니 지수를 기준으로 최적의 분할을 선택합니다.

5. 종료 조건 : 

  • 트리 생성은 특정 종료 조건에 도달할  때까지 계속됩니다
    • 리프 노드의 데이터가 모두 같은 클래스에 속할 때
    • 더이상 분할할 데이터가 없을 때
    • 트리가 최대 깊이에 도달했을 때

의사결정나무의 장점

  1. 직관적이고 해석 가능:
    • 트리 구조가 사람에게 이해하기 쉬워, 예측 결과를 설명하기 좋습니다.
  2. 전처리가 거의 필요 없음:
    • 데이터의 스케일 조정이나 정규화 없이 사용할 수 있습니다.
  3. 다목적 사용 가능:
    • 분류와 회귀 문제에 모두 사용될 수 있습니다.
  4. 비선형 데이터 처리 가능:
    • 데이터의 복잡한 비선형 관계도 모델링할 수 있습니다.

의사결정나무의 단점

  1. 과적합(Overfitting):
    • 트리가 너무 깊어지면 학습 데이터에 지나치게 적합하게 되어 일반화 성능이 떨어질 수 있습니다.
    • 이를 방지하기 위해 사전 가지치기(Pre-Pruning)나 사후 가지치기(Post-Pruning)를 사용합니다.
  2. 데이터에 민감:
    • 작은 데이터 변경에도 트리 구조가 크게 바뀔 수 있습니다. 이를 해결하기 위해 앙상블 방법(랜덤 포레스트 등)을 사용할 수 있습니다.
  3. 분할 기준의 편향:
    • 정보 이득은 클래스가 많을수록 특정 특성을 선호하는 경향이 있습니다.
  4. 차원의 저주:
    • 고차원 데이터에서는 성능이 저하될 수 있습니다. 이런 경우 특성 선택이나 차원 축소를 고려해야 합니다.

의사결정나무의 개선 방법

  1. 가지치기(Pruning):
    • 트리의 불필요한 분기를 제거하여 과적합을 방지합니다.
    • 사전 가지치기: 트리 생성 중에 조건(최대 깊이, 최소 데이터 개수 등)을 설정하여 성장 제한.
    • 사후 가지치기: 트리 생성 후 성능이 떨어지는 분기를 제거.
  2. 앙상블 방법:
    • 랜덤 포레스트(Random Forest):
      • 여러 개의 의사결정나무를 학습시켜 결과를 앙상블(다수결 또는 평균)하여 예측 성능을 향상.
    • 그래디언트 부스팅(Gradient Boosting):
      • 의사결정나무를 순차적으로 학습시켜 에러를 보완하는 방식.
  3. 데이터 샘플링:
    • 트리 학습 전 데이터 샘플링 또는 특성 선택을 통해 모델 성능을 개선.

의사결정나무의 활용 사례

  1. 의료 분야:
    • 환자의 증상과 검사 결과를 기반으로 질병을 예측.
  2. 금융:
    • 대출 상환 가능성 예측, 사기 탐지.
  3. 마케팅:
    • 고객 분류, 구매 가능성 예측.
  4. 제조:
    • 품질 관리, 오류 탐지.

의사결정나무의 한계와 대안

의사결정나무는 단독으로 사용하면 과적합 및 민감성 문제가 있지만, 이를 해결하기 위해 앙상블 기법(랜덤 포레스트, 그래디언트 부스팅)을 적용하면 강력하고 유연한 모델로 변모합니다. 데이터가 비교적 간단하거나 해석 가능성이 중요한 경우에는 의사결정나무 자체로도 충분히 유용합니다.


예시

- 데이터 로드 및 전처리

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

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

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

# 데이터 스케일링
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

 

- 모델 학습

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 모델 생성 및 학습
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")