우당탕탕 개발일지

[혼공머신] 5-1. 결정트리 본문

인공지능

[혼공머신] 5-1. 결정트리

민아당긴아 2025. 1. 24. 15:25

💡 로지스틱 회귀로 와인 분류하기(Logistic Regression)

결정트리를 이용하기 전에 먼저 로지스틱 회귀를 이용해서 와인을 분류해본다.

로지스틱 회귀 모델에서는 표준화 전처리 잊지 않기!

로지스틱 회귀 모델의 단점: 모델이 왜 저러 계수 값을 학습했는지 이해하기 어렵다.

print(lr.coef_, lr.intercept_)
# 결과: [[ 0.4270427   0.35107217 -4.06298437]] [8.48363274]

각 값이 무엇을 의미하는지 설명하기 어렵다. 

해결방법: 설명하기 쉬운 결정 트리를 이용한다.

 

💡 결정 트리(Decision Tree)

ⓒ https://dataaspirant.com/how-decision-tree-algorithm-works/

스무 고개처럼 계속 질문을 추가하며 분류하는 모델로, 설명하기 쉬운 모델에 속한다.

사이킷런의 DecisionTreeClassifier 클래스를 사용한다.

결정 트리 모델 불러오기

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(random_state = 42)
dt.fit(train_input, train_target)

결정 트리의 훈련 점수, 테스트 점수

 

트리 그림 그리기

사이킷런의 plot_tree() 함수를 사용해서 결정 트리를 그림으로 표현할 수 있다.

 

하지만 매개변수를 지정해주지 않으면 이렇게 복잡한 그림이 나온다.

설명하기 쉬운 결정트리인데 그림을 이렇게 그리면 아무것도 볼 수가 없으니,

매개변수를 지정해서 해석하기 쉬운 트리 그림을 그려준다.

 

plot_tree() 함수의 매개변수:

1. max_depth: 트리의 깊이

2. filled = True: 클래스에 맞게 노드의 색을 칠한다. 어떤 클래스의 비율이 높아지만 점점 진한 색으로 표시한다.

3. feature_names = ['alcohol', 'sugar', 'pH']: 특성의 이름을 명시해준다.

 

매개변수를 지정한 뒤 트리 그림을 그리면 아래와 같다.

# 트리 그림
plt.figure(figsize = (10, 7))
plot_tree(dt, filled = True, feature_names= ['alcohol', 'sugar', 'pH']) # max_depth 매개변수는 DecisionTreeClassifier()에서 지정할 수도 있고 2)plot_tree()에서 지정할 수도 있다.
plt.show()

결과적으로 리프 노드에서 가장 많은 클래스가 예측 클래스가 된다. 왼쪽 자식 노드의 경우 value = [1177, 1745]이므로 양성 클래스인 화이트 와인으로 예측한다. 오른쪽 자식 노드의 경우 value = [81, 2194]이므로 양성 클래스인 화이트 와인으로 예측한다.

만약 이 결정 트리의 성장을 여기서 멈춘다면 왼쪽 노드에 도달한 샘플과 오른쪽 노드에 도달한 샘플은 모두 양성 클래스로 예측된다.

 

💡 불순도(Impurity)

불순도는 노드에서 데이터를 분할할 기준을 정하며, criterion 매개변수를 이용하여 불순도의 종류를 정한다.

불순도는 1) gini 지니 불순도 2) entropy 엔트로피 불순도 - 총 2가지가 있다.

1) gini 지니 불순도

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

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

부모 노드와 자식 노드의 불순도 차이정보 이득이라고 한다.

정보 이득 = 부모 노드의 불순도 - (왼쪽 노드의 샘플 비율 * 왼쪽 자식 노드의 불순도)  - (오른쪽 노드의 샘플 비율 * 오른쪽 자식 노드의 불순도)

2) entropy 엔트로피 불순도

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

결론짓자면, 결정 트리 모델은 불순도를 기준으로 정보 이득을 최대화하도록 노드를 분하랗ㄴ다.

새로운 샘플을 예측할 때 노드의 질문에 따라 트리를 이동하게 되고,

불순도(gini/entropy) 사용해서 테스트 조건을 결정하게 된다.

 

💡 가지치기

트리의 최대 깊이 지정(max_depth 매개변수 지정)

그리고 결정 트리는 표준화 전처리 과정 불필요하다.

가지치기를 통해 max_depth = 3으로 지정하면 결과가 다음과 같이 나온다.

💡 특성 중요도(Feature Importances)

어떤 특성이 가장 유용한지 나타낸다.