의사 결정 트리(Decision Tree)는 데이터를 계층적으로 분할하여 예측을 수행하는 트리 기반 머신러닝 알고리즘
주어진 데이터를 여러 개의 분할 기준(규칙)을 사용하여 나누고, 트리 구조를 통해 최종 예측을 수행
✅ 특징
결정 트리는 데이터를 나누면서 손실 함수(Loss Function)를 최소화하는 방향으로 학습된다.
손실 함수는 모델의 예측값이 실제값과 얼마나 차이가 있는지를 나타내는 지표이다.
결정 트리에서는 주로 회귀 트리(Regression Tree)에서 손실 함수를 사용한다.
📌 손실 함수가 낮을수록 모델이 더 좋은 성능을 보임!
정보(Information)는 노드의 불확실성(Uncertainty)을 측정하는 지표
결정 트리는 정보 이득(Information Gain)이 높은 기준을 사용하여 데이터를 분할
사건이 발생할 확률이 낮을수록 더 많은 정보량을 갖는다.
예를 들어:
엔트로피(Entropy)는 노드의 혼합 정도(불순도, Impurity)를 측정하는 척도이다.
값이 0이면 완전히 순수한 노드, 1에 가까울수록 불순한 노드를 의미한다.
✅ 설명
📌 엔트로피는 불순도를 계산하는 또 다른 방법으로, 정보 이득(Information Gain) 계산에 사용됨.
불순도(Impurity)는 노드 내 데이터가 얼마나 섞여 있는지를 나타내는 지표이다.
결정 트리는 불순도를 최소화하는 방향으로 학습된다.
✅ 불순도가 낮을수록 노드의 순도가 높아짐
❌ 불순도가 높으면 노드가 혼합된 상태
불순도를 측정하는 대표적인 방법은 Gini Index(지니 지수)와 Entropy(엔트로피)이다.
지니 지수(Gini Index)
엔트로피(Entropy)
지니 지수(Gini Index)는 불순도를 측정하는 대표적인 방법이다.
✅ 설명
📌 지니 지수는 계산이 간단하여 CART(Classification and Regression Tree) 알고리즘에서 자주 사용됨
✅ 설명
📌 정보 이득이 클수록 좋은 분할 기준!
정보 이득이 높은 특성이 많을 경우 편향된 분할이 발생할 수 있다.
이를 보완하기 위해 정보 이득 비율(Information Gain Ratio, IG Ratio)을 사용한다.
✅ 설명
📌 정보 이득 비율을 사용하면 불균형 문제를 해결
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2,random_state=42)
DT = DecisionTreeClassifier()
DT.fit(x_train, y_train)
print('accuracy:{:.2f}'.format(DT.score(x_test,y_test)))
from sklearn import tree
tree.plot_tree(DT)
plt.show()
out:

!pip install graphviz
from sklearn.tree import export_graphviz
from graphviz import Source
export_graphviz(DT,
out_file = 'iris_tree.dot',
feature_names=iris.feature_names,
class_names=iris.target_names,
rounded=True,
filled =True)
graph = Source.from_file('iris_tree.dot')
graph.view()
out :

import seaborn as sns
import numpy as np
print('Feature importance : \n:{0}'.format(np.round(DT.feature_importances_,3)))
for name, value in zip(iris.feature_names, DT.feature_importances_):
print('{0} : {1:.3f}'.format(name,value))
sns.barplot(x=DT.feature_importances_, y=iris.feature_names)
plt.show()
out :
Feature importance :
:[0.033 0. 0.889 0.077]
sepal length (cm) : 0.033
sepal width (cm) : 0.000
petal length (cm) : 0.889
petal width (cm) : 0.077

결정 트리(Decision Tree) 모델의 Feature Importance(특성 중요도)
코드 해석:
1. DT.feature_importances_
출력 부분 (print)
np.round(DT.feature_importances_,3) → 소수점 셋째 자리까지 반올림해서 출력.for name, value in zip(iris.feature_names, DT.feature_importances_)iris.feature_names (특성 이름)과 중요도를 같이 출력.Seaborn의 barplot
sns.barplot(x=DT.feature_importances_, y=iris.feature_names) 그래프 해석:
DecisionTreeClassifier를 사용하면 모델이 어떤 특성에 집중하는지 알 수 있음.