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

2022. 1. 20. 12:30·Minding's Programming/Knowledge
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

'Minding's Programming > Knowledge' 카테고리의 다른 글

[ChatGPT] ChatGPT에게 여행일정을 짜달라고 해보았다.  (0) 2023.02.05
[ML / DL] KNN (K-Nearest-Neighbor, K-최근접 이웃)  (0) 2022.01.25
[ML/DL] 랜덤포레스트(Random Forest) & 앙상블(Ensemble)  (0) 2022.01.23
[ML/DL] 로지스틱 회귀 (Logistic Regression)  (0) 2022.01.19
[ML/DL] 선형회귀 (Linear Regression)  (0) 2022.01.18
'Minding's Programming/Knowledge' 카테고리의 다른 글
  • [ML / DL] KNN (K-Nearest-Neighbor, K-최근접 이웃)
  • [ML/DL] 랜덤포레스트(Random Forest) & 앙상블(Ensemble)
  • [ML/DL] 로지스틱 회귀 (Logistic Regression)
  • [ML/DL] 선형회귀 (Linear Regression)
Minding
Minding
  • Minding
    Today's Minding
    Minding
  • 전체
    오늘
    어제
    • 울고넘는 딥러닝 (278)
      • Minding's Baseball (57)
        • MLB Statcast (29)
        • 머신러닝으로 홈런왕 예측하기 (3)
        • 야구칼럼 (12)
        • 야구 규칙, 용어 (1)
        • 2022-23 질롱 코리아 (8)
        • 류현진 등판경기 (4)
      • Minding's Programming (185)
        • 프로그래머스 코딩테스트 (21)
        • Knowledge (44)
        • Numpy & Pandas (6)
        • Excel (3)
        • Git (1)
        • Pygame (11)
        • CV (3)
        • Tensorflow tutorial (4)
        • Kaggle and Dacon (4)
        • 에러 코드 (8)
        • FastAPI (8)
        • Airflow (29)
        • Crawling (6)
        • Django (14)
        • AWS (18)
        • Spark (5)
      • Minding's Reading (30)
        • 머신러닝 딥러닝에 필요한 기초 수학 with 파이.. (2)
        • 칼만필터는 어렵지 않아 (11)
        • 밑바닥부터 시작하는 딥러닝 (6)
        • 메이저리그 야구 통계학 2e (8)
        • 논문읽기 (2)
        • 빅데이터를 지탱하는 기술 (1)
      • Minding's Life (5)
        • 주식 (4)
        • 각종 소식 (1)
  • 블로그 메뉴

    • 홈
    • Baseball
    • Programming
    • Reading
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    django
    파이게임
    KBO
    데이터 엔지니어
    django python
    파이썬
    AWS
    에어플로우
    Python
    칼만필터는어렵지않아python
    파이썬게임개발
    FastAPI
    칼만필터는어렵지않아
    pygame
    코딩테스트
    프로그래머스
    딥러닝
    데이터분석
    질롱코리아
    칼만필터는어렵지않아파이썬
    MLB
    Airflow
    머신러닝
    야구
    KalmanFilter
    게임개발
    칼만필터
    넘파이
    메이저리그
    mlb stats api
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Minding
[ML / DL] 의사결정나무 (Decision Tree)
상단으로

티스토리툴바