결정 트리

Jaeseok Han·2024년 4월 19일

머신러닝&딥러닝

목록 보기
10/22

결정 트리

결정 트리는 데이터를 분할해가면서 예측하는 모델로, 각 노드에서 특정 특성을 기준으로 데이터를 분할하며 진행된다. 이러한 분할을 통해 노드 내의 불순도를 최소화하거나 정보 이득을 최대화하는 방향으로 학습된다.

# 결정 트리 알고리즘
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
# 0.996921300750433
print(dt.score(test_scaled, test_target))
# 0.8584615384615385 #과대적합

dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
#출력 0.8454877814123533
print(dt.score(test_scaled, test_target))
#출력 0.8415384615384616
  • max_depth=1 :루트 노드 제외하고 하나의 노드를 더 확장)
  • filled=True : 클래스에 따라 색상 지정
  • feature_names : 특성 이름 전달

노드 내부 표현값
1) 테스트조건 (sugar)
2) 불순도(gini)
3) 총 샘플 수(smaples)
4) 클래스별 샘플 수(value)

1. 불순도

1) 지니 불순도

노드의 불순도를 측정하는 지표로, 해당 노드의 클래스 분포에 따라 계산된다. 0에 가까울수록 불순도가 낮으며, 한 클래스로만 이루어진 경우 0이된다.

지니 불순도 = 1  (음성 클래스 비2 + 양성 클래스 비2)지니\ 불순도\ =\ 1\ -\ (음성\ 클래스\ 비율^2\ +\ 양성\ 클래스\ 비율^2)

노드에 하나의 클래스만 존재한다면 지니 불순도가 0이 되어 가장 작다.

결정 트리 모델은 부모 노드와 자식 노드의 불순도 차이가 가능한 크도록 트리를 성장시킨다.

ex)

1=((1258/5197)2+(3939/5197)2))=0.3671 = ((1258/5197)^2 + (3939/5197)^2)) = 0.367

2) 엔프로티 불순도

불확실성으로 나타내는 지표로, 클래스의 확률 분포에 따라 계산된다. 0에 가까울수록 불순도가 낮으며, 한클래스로만 이루어진 경우 0이된다.

엔트로피 불순도 = 음성 클래스 비율 × log2(음성 클래스 비율) 양성 클래스 비율 × log2(양성 클래스 비율)엔트로피\ 불순도\ =\ -음성\ 클래스\ 비율\ \times\ \log_2(음성\ 클래스\ 비율) \ -양성\ 클래스\ 비율\ \times\ \log_2(양성\ 클래스\ 비율)

ex)

(1258/5197)×log2(1258/5197)(3939/5197)×log2(3939/5197)=0.798-(1258/5197) \times \log_2(1258/5197) -(3939/5197) \times \log_2(3939/5197) = 0.798

3) 정보 이득

부모와 자식 노드 사이의 불순도 차이를 나타내는 지표로, 불순도 차이가 크면 정보 이득이 크다고 한다. 이를 통해 어떤 특성이 가장 중요한지를 결정 할 수 있다.

불순도 차이 = 부모 불순도  (왼쪽 노드 샘플 수) × 왼쪽 노드 불순도  (오른쪽 노드 샘플 수 / 부모의 샘플 수) × 오른쪽 노드 불순도불순도\ 차이\ =\ 부모\ 불순도 \ - \ (왼쪽\ 노드\ 샘플\ 수)\ \times\ 왼쪽\ 노드\ 불순도\ -\ (오른쪽\ 노드\ 샘플\ 수\ /\ 부모의\ 샘플\ 수)\ \times\ 오른쪽\ 노드\ 불순도

ex)

0.367(2922/5197)×0.481(2275/5197)×0.069=0.0660.367 - (2922/5197)\times0.481 - (2275/5197)\times0.069 = 0.066

2. 가지치기

과대적합을 방지하기위해 결정 트리의 깊이를 제한하는 과정이다. 트리의 최대 깊이(max_depth)나 분할되는 노드의 최소 샘플 수 등을 조절하여 모델을 일반화시킨다.

주요 장점

  • 비교적 예측 과정을 이해하기 쉽고 성능이 뛰어나다.
  • 특성값의 스케일에 영향을 받지 않는다. (스케일 전처리 필요없음)
  • 특성 중요도를 계산하여 특성 선택에 활용할 수 있다.

1.예제

와인 데이터를 사용하여 로지스틱 회귀와 결정 트리 모델을 학습시켜보았다.

1) 로지스틱 회귀 모델

# 특성 표준화
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

# 로지스틱 회귀 모델 훈련
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_scaled, train_target)
print(lr.score(train_scaled, train_target))
#출력 0.7808350971714451
print(lr.score(test_scaled, test_target))
#출력 0.7776923076923077

2) 결정 트리 모델

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_input, train_target) #전처리 하지않은 데이터
print(dt.score(train_input, train_target))
#출력 0.8454877814123533
print(dt.score(test_input, test_target))
#출력 0.8415384615384616

plt.figure(figsize=(20,15))
plot_tree(dt, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()

0개의 댓글