지도학습에 해당되는 알고리즘 중 하나로, 데이터를 분석하여 이들 사이에 존재하는 패턴을 예측 가능한 규칙들의 조합으로 나타낸다. 그 모양이 나무와 같다고 해서 의사결정나무라고 부른다.
전체 자료를 여러 소집단으로 분류(Classification)하거나 예측(Prediction)하는 데 사용하며 분류와 회귀 문제에 모두 사용할 수 있다!
x축은 사건 x가 발생할 확률, y축은 정보량을 나타내는 그래프이다.
→ 사건 x의 발생 확률이 증가할수록 정보량은 0에 수렴
즉, 자주 발생하는 사건일수록 그닥 많은 정보를 가지지는 않는다.
분석 목적을 정의하고 그에 따라 분리 규칙을 찾아 나무를 형성시키는 과정
데이터의 구조에 따라 분리기준과 정지규칙 설정
각 마디의 최적 분리규칙과 적절한 정지규칙을 만족하면 나무의 성장을 중단시킴
❓ 언제 정지하는가
❓ 어떻게 정지시키는가
방법 1) 검증용 데이터 활용해 예측 정확도 낮은 가지 제거
= 오차를 크게할 위험이 높은 가지 제거
방법 2) 규칙의 타당성 검토하여 부적절한 규칙 가지는 가지 제거
반복적으로 이분하는 알고리즘
이러한 한계점을 보완하고 새로운 기능을 추가한 알고리즘이 바로 C4.5
분류 나무와 회귀 나무 모두 사용 가능한 의사결정나무 알고리즘
불순도 지수로 지니지수를 이용하며
목표변수가 범주형인 경우 지니지수 를 가장 많이 감소시켜주는 변수를 찾아 분리
목표변수가 연속형인 경우, MSE를 이용해 분산량 감소가 가장 큰 변수를 찾아 분리
전체 데이터셋을 가지고 시작하고, 두 개의 자식 노드를 반복 생성하기 위해 모든 예측변수를 사용한다. 데이터셋의 부분집합을 쪼갬으로서 의사결정트리 생성
피어슨의 카이제곱 통계량 이용하여 분리
카이제곱 통계량 값이 크면 p-value는 작아짐
▶ p-value가 가장 작음 변수를 찾아 분리
분산 분석표(ANOVA)의 F-통계량 이용하여 분리
F-통계량 값이 크면 p-value는 작아짐
▶ p-value가 가장 작음 변수를 찾아 분리
수치형, 범주형 종속변수 모두 가능
이지 분리, 다지 분리 모두 가능
https://todayisbetterthanyesterday.tistory.com/38
위 게시글을 참고하여 실습함
import pandas as pd
import numpy as np
import graphviz
import multiprocessing
import matplotlib.pyplot as plt
plt.style.use(['seaborn-whitegrid'])
from sklearn import tree
from sklearn.datasets import load_iris
from os import system
iris = load_iris()
#의사결정나무 분류
#criterion = "entropy" 를 추가하여 불순도 지수로 엔트로피 이용
clf2 = tree.DecisionTreeClassifier(criterion = "entropy") # Information Gain - entropy
clf2 = clf2.fit(iris.data, iris.target)
# 시각화
dot_data2 = tree.export_graphviz(clf2, # 의사결정나무 모형 대입
out_file = None, # file로 변환할 것인가
feature_names = iris.feature_names, # feature 이름
class_names = iris.target_names, # target 이름
filled = True, # 그림에 색상을 넣을것인가
rounded = True, # 반올림을 진행할 것인가
special_characters = True) # 특수문자를 사용하나
graph2 = graphviz.Source(dot_data2)
graph2
트리 구조에서 색깔은 각 클래스를 나타낸다. 총 3개의 클래스로 분류가 되었으며 깊이 6인 트리 모형이 형성되었다.
지니지수를 이용한 트리 모형과 불순도 지수 이외는 동일한 형태의 트리이다.
가지치기로 최대 깊이를 제한하여 모형을 만든다면?
깊이 제한을 2로 설정, 3개의 집단을 구분하기 위해서는 최소 깊이 2인 트리를 형성해야함
#가지치기
clf3 = tree.DecisionTreeClassifier(criterion = "entropy", max_depth = 2)
clf3.fit(iris.data, iris.target)
#시각화
dot_data3 = tree.export_graphviz(clf3,
out_file = None,
feature_names = iris.feature_names,
class_names = iris.target_names,
filled = True,
rounded = True,
special_characters = True)
가지치기 전 상태의 모형과 비교했을 때, 깊이를 2로 제한하여 단조로운 모형이 되었으며 entropy 지수가 증가하였다. 정확도는 낮아졌지만 직관적으로 이해하기 쉬운 모형은 가지치기를 진행한 모형이었다.