의사결정나무는 주로 불연속 데이터를 다루며 노이즈가 발생해도 중단되거나 엉뚱한 결과를 보여주지 않는 매우 강건한 모델이다.
목표 변수: 이산형(범주형)
순수도 측정: 지니계수, 엔트로피 지수, 카이제곱 통계량의 p-value
👉 모두 작을수록 순수도가 높음
목표 변수: 연속형
순수도 측정: 분산분석 F-통계량의 p-value,분산의 감소량
👉 분산분석 F-통계량의 p-value 작을수록,분산의 감소량이 높을수록 순수도가 높음
마디 종류 | 설명 |
---|---|
뿌리마디(root node) | 시작되는 마디 |
부모 마디(parent node) | 주어진 마디의 상위마디 |
자식마디(child node) | 하나의 마디에서 분리된 2개 이상의 마디들 |
중간마디(internal node) | 부모마디와 자식마디가 있는 마디 |
끝마디(terminal node)/잎(leaf) | 자식마디가 없는 마디 |
가지(branch) | 뿌리마디부터 끝마디까지 연결된 마디 |
깊이(depth) | 가장 긴 가지의 크기(마디의 개수) |
이 깊이(depth)가 너무 깊어지면 과대적합, 이 깊이가 너무 작으면 과소적합 문제가 일어남!
알고리즘 | 평가지수 |
---|---|
ID3 | Entropy |
C4.5 | Information Gain |
CART | Gini Index,분산의 차이 |
CHAID | 카이제곱,F검정 |
ID3 알고리즘
1) CART (Classification And Regression Tree)
2) C4.5
3) CHAID (Chi - square Automatic Interation Detection)
각 영역의 순도가 증가, 불순도(불확실성)이 최대한 감소하는 방향으로 학습을 진행한다. 이 개념을 이해하기 위해서 먼저 알아야할 개념들이 있다.
그림으로 바로 이해할 수 있다. A와 B중 B는 빨간색과 파란색이 섞여 있으며, 불순도가 높은 상태라고 할 수 있다.
이러한 불순도를 수치화한 지표가 바로 엔트로피와 지니계수이다.
ID3와 C4.5는 불순도 알고리즘으로 Entropy를 사용한다.
두 알고리즘이 가장 큰 차이는 연속형 변수를 사용할 수 있느냐와 없느냐이다.
엔트로피란?
엔트로피가 감소?
👉 불확실성 감소 👉 순도 증가 👉 정보획득 !
수식 설명
^2(제곱) = 한 번만 측정하는 것은 우연히 그 결과가 발생할 수 있다. 그렇기 때문에 최소한 두 번은 측정해야 그 결과를 정확히 알 수 있다는 의미의 제곱이다.
(통계에서의 복원 추출 개념을 사용)
https://www.youtube.com/watch?v=YEt0ViG_VXk
다음 강의를 참고하여 실습을 진행했습니다.
import pandas as pd
import numpy as np
import graphviz
import multiprocessing
import matplotlib.pyplot as plt
plt.style.use(['seaborn-whitegrid'])
from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
iris = load_iris()
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['target']= iris.target
iris_df.head(3)
# 전처리 전
model = DecisionTreeClassifier()
cross_val_score(
estimator = model,
X = iris.data, y= iris.target,
cv=5,
n_jobs = multiprocessing.cpu_count()
)
의사결정나무는 규칙을 학습하는 것이기 때문에 전처리에 큰 영향을 받지 않는다!
model = make_pipeline(
StandardScaler(),
DecisionTreeClassifier()
)
cross_val_score(
estimator = model,
X = iris.data, y= iris.target,
cv=5,
n_jobs = multiprocessing.cpu_count()
)
model = DecisionTreeClassifier()
model.fit(iris.data, iris.target)
dot_data = tree.export_graphviz(decision_tree=model,
feature_names = iris.feature_names,
class_names = iris.target_names,
filled=True,rounded=True,
special_characters = True)
graph = graphviz.Source(dot_data)
graph