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/
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 |