본문 바로가기

Minding's Programming/Knowledge

[ML / DL] 의사결정나무 (Decision Tree)

728x90
반응형

의사결정나무 (Decision Tree)

  • 데이터가 나타내는 패턴들을 예측 가능한 규칙들의 조합으로 나타낸 모형 (모양이 나무가지가 뻗어나가는 모양)

의사결정나무 예시

 

  • 결정트리의 특징
    • 분류와 회귀문제 모두에서 사용가능
    • True / False 또는 Yes / No 질문들로 이어가며 학습 (특정 질문에 따라 데이터를 구분)
    • 질문/정답이 들어있는 상자를 Node라고 하며 맨 위의 있는 상자를 Root Node, 맨 마지막에 위치한 상자들을 Terminal Node / Leaf Node라고 함
    • 알고리즘이 직관적이고 규칙파악이 용이함
    • 데이터 전처리 작업이 덜 필요함

 

결정트리 프로세스

  • 데이터를 가장 잘 구분할 수 있는 질문(특성)으로 데이터를 나눔

데이터를 잘 구분할 수 있는 기준(특성)으로 나눔

  • 나뉜 각 범주에서 데이터를 가장 잘 구분할 수 있는 질문으로 나눔 (반복)

  • 데이터를 지나치게 나누게 되면 (트리 깊이가 너무 깊어지면) 오버피팅이 될 수 있음

트리가 너무 깊어져 오버피팅이 된 경우

 

가지치기 (Pruning)

  • 의사결정나무 (Decision Tree)에서 오버피팅을 막기위한 전략으로 사용
  • 사전 가지치기와 사후 가지치기 2가지 종류가 있음
    • 사전 가지치기 : 트리를 만들기 전 최대깊이, 노드의 최소 데이터수 등을 미리 지정
    • 사후 가지치기 : 트리를 먼저 완성시켜놓고, 적절한 수준에서 leaf node를 결합시켜줌

 

 

불순도(Impurity), 엔트로피(Entropy)

  • 결정트리 알고리즘은 엔트로피와 불순도를 통해서 구현

불순도

  • 해당 범주 안에 서로 다른 데이터가 얼마나 섞여 있는지를 표현
  • 서로 다른 데이터가 많이 섞여 있을수록 불순도가 높음

불순도 예시 그림

  • 위 그림에서는 아래쪽 범주가 불순도가 높음
  • 결정트리는 불순도를 최소화하는 방향으로 학습을 진행

엔트로피(Entropy)

  • 불순도를 수치적으로 나타낸 척도
  • 엔트로피가 높다면 불순도가 높은 것을 뜻함 (0 ~ 1 사이의 범주를 가지고 있음)

엔트로피 수식

  • Pi = 한 영역 안에 존재하는 데이터 가운데 범주 i에 속하는 데이터의 비율

 

정보획득 (Information gain)

  • 분기(질문을 통과하여 나뉜) 이전의 엔트로피에서 분기 이후의 엔트로피를 뺀 수치를 정보획득이라고 함
    • 엔트로피가 1인 상태에서 0.7로 바뀌었다면 정보획득은 0.3
  • 정보획득 공식
    • Information gain = entropy(parent) - [weighted average]entropy(children)
    • 가중평균(weighted average)을 하는 이유 : 범주가 2개 이상으로 나뉘어지기 때문에 적용

 


의사결정트리 실습 (유방암 데이터 이용)

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()

# Xdata와 ydata 정의
X = cancer.data
y = cancer.target

# dataframe으로 정의
df = pd.DataFrame(X, columns = cancer.feature_names)
df.head()

 

# 훈련데이터 / 테스트데이터 나누기
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# Decision Tree 모델 임포트
from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()

# 모델 피팅 (훈련데이터셋으로)
clf = clf.fit(X_train, y_train)

# 모델 정확도 출력
print("훈련 정확도 : {}".format(clf.score(X_train, y_train)))
print("테스트 정확도 : {}".format(clf.score(X_test, y_test)))
>>>
훈련 정확도 : 1.0
테스트 정확도 : 0.9122807017543859

 

# 가지치기 적용 (최대깊이 4로 설정)
clf = DecisionTreeClassifier(max_depth=4, random_state=0)
clf.fit(X_train, y_train)

print("훈련 정확도 : {}".format(clf.score(X_train, y_train)))
print("테스트 정확도 : {}".format(clf.score(X_test, y_test)))
>>>
훈련 정확도 : 0.9824120603015075
테스트 정확도 : 0.9239766081871345
  • 가지치기 적용 시 오버피팅을 막아 테스트 정확도가 올라가는 모습을 보임

 


Reference

https://ratsgo.github.io/machine%20learning/2017/03/26/tree/

 

의사결정나무(Decision Tree) · ratsgo's blog

이번 포스팅에선 한번에 하나씩의 설명변수를 사용하여 예측 가능한 규칙들의 집합을 생성하는 알고리즘인 의사결정나무(Decision Tree)에 대해 다뤄보도록 하겠습니다. 이번 글은 고려대 강필성

ratsgo.github.io

https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-4-%EA%B2%B0%EC%A0%95-%ED%8A%B8%EB%A6%ACDecision-Tree

 

머신러닝 - 4. 결정 트리(Decision Tree)

결정 트리(Decision Tree, 의사결정트리, 의사결정나무라고도 함)는 분류(Classification)와 회귀(Regression) 모두 가능한 지도 학습 모델 중 하나입니다. 결정 트리는 스무고개 하듯이 예/아니오 질문을

bkshin.tistory.com

 

728x90