머신러닝 (Machine Learning)/분류(Classification) 분석

Decision Tree Graphviz

DS지니 2021. 2. 14. 00:29
728x90
반응형

▶ Jupyter notebook 과 Google Colab에서 Graphviz 사용하기. (설치 및 사용법)

velog.io/@gggggeun1/%EA%B2%B0%EC%A0%95%ED%8A%B8%EB%A6%AC-%EA%B7%B8%EB%9E%98%ED%94%84-exportgraphviz

 

결정트리 그래프 export_graphviz

1) 프로그램 설치하기https://graphviz.org/download/(설치 시 특별한 설치 디렉터리를 지정하지 않으면 C:\\Program Files\\Graphviz 와 같은 디렉터리에 Graphviz가 설치됨)2) Graphviz 파이썬 래퍼 모듈

velog.io

 

1. 결정 트리 그래프에 대한 설명

 

붓꽃 데이터 Decision Tree 그래프 시각화

더 이상 자식 노드가 없는 노드는 레이블 값이 결정되는 Leaf node 입니다.

리프 노드가 되려면 오직 하나의 클래스 값으로 최종 데이터가 구성되거나 리프 노드가 될 수 있는 하이퍼 파라미터 조건을 충족하면 됩니다.

 

자식노드가 있는 노드는 Branch node이며 자식노드를 만들기 위한 분할 규칙 조건을 가지고 있습니다. 

1번 Node  의미 설명
petal width(cm) <=0.8 이처럼 조건이 있는 것은 자식 노드를 만들기 위한 규칙 조건
이 조건이 없으면 leaf node
petal width(cm) 가 0.8 이하인 규칙으로 자식 노드 생성
samples = 120 현 규칙에 해당하는 총 데이터 건수 전체 데이터가 120개라는 의미
value = [ 40, 37, 43 ] 클래스 값 기반의 각 데이터 건수 붓꽃 데이터의 클래스 값으로 0,1,2 를 가지고 있으며, 0(Setosa)에 40개 1(Versicolor)에 37개 2(Virginica)에 43개를 가지고 있다는 뜻
classs = Virginica 가장 많은 데이터 건수의 클래스 값 Virginica(class 2)의 개수(43개)가 가장 많다는 뜻
gini = 0.665 value =[ ]로 주어진 데이터 분포에서의 지니 계수 sample 120개가 value=[40,37,43] 분포도로 되어 있을 때 지니 계수는 0.665이다.

 

<노드 설명>

  • 1번 노드의 규칙이 True이면 2번 노드 False이면 3번 노드가 만들어집니다.
  • 2번 노드는 petal width(cm) <= 0.8 인 규칙을 만족했을 때, 40개의 모든 데이터가 Setosa(0)로 결정되므로 클래스가 결정된 leaf node가 되고, 노드는 끝이 납니다. (지니계수 0)
  • 3번 노드는 petal width(cm) <= 0.8 이 False인 규칙 노드이다. 80개 샘플 데이터 중 Vesicolor 37개, Virginica 43개로 여전히 지니 계수는 0.497로 높으므로 다음 자식 브랜치 노드로 분기할 규칙 필요함. (petal length <= 4.75로 규칙생성)
  • 4번 노드는 3번 규칙 petal length <= 4.75가 True인 규칙 노드이다. 샘플데이터 34개 중 Vesicolor 33개, Virginica 1개로 대부분이 Versicolor이며 지니 노드가 0.057로 매우 낮지만 아직 섞여있으므로 한번 더 자식노드 생성
  • 5번 노드는 규칙 petal length <= 4.75가 False인 규칙 노드이다. 46개 샘플데이터 중 Vesicolor 4개, Virginica 42개로 대부분이 Virginica 이지만, Vesicolor가 섞여 있으므로 다시 자식 노드 생성
  • 각 노드의 색깔 = 레이블 값
  • 색의 농도 = 짙을수록 지니 계수 낮고 해당 레이블에 속하는 샘플 데이터가 많다는 뜻

▶결론

4번 노드를 살펴보면 [33개:1개] 분포이지만 두 레이블을 구분하기 위해 또 다시 자식 노드를 생성한다.

이처럼 결정 트리는 규칙 생성 로직을 미리 제어하지 않으면 완벽하게 클래스 값을 구별해 내기 위해 느리 노드를 계속해서 만들어 간다. 이로 인해 매우 복잡한 규칙이 트리가 만들어지고 모델이 쉽게 과적합되는 문제점을 가지게 된다.

결정트리는 이러한 이유로 과적합이 상당이 높은 ML 알고리즘이다. 

결정트리 알고리즘을 제어하는 대부분 하이퍼 파라미터는 복잡한 트리가 생성되는 것을 막기 위한 용도이다.

 


 

 

2. 결정트리의 하이퍼파라미터

 

하이퍼 파라미터 조정

min_samples_split - 노드를 분할하기 위한 최소한의 샘플 데이터 수
- 과적합을 제어함
- defalt =2
- 작게 설정할수록 분할되는 노드가 많아져서 과적합 가능성 증가
min_samples_leaf - 말단 노드(leaf)가 되기 위한 최소한의 샘플 데이터 수
- min_samples_split과 유사하게 과적합 제어 용도.
- 비대칭적(imbalanced) 데이터의 경우 특정 클래스의 데이터가 극도로 작을 수 있으므로 이 경우는 작게 설정 필요.
max_features - 최적의 분할을 위해 고려할 최대 피처 개수
- defalt = None (모든 피쳐 사용)
- int 형 = 대상 피처의 개수로 지정
- float 형 = 전체 피처 중 대상 피처의 퍼센트로 지정
- 'sqrt' = 전체 피처 개수의 루트값 선정
- 'auto' = squrt
- 'log' = 전체 피처 중 log2 선정
- 'None' = 전체피처 선정
max_depth - 트리의 최대 깊이를 규정
- defalt = None (완벽하게 클래스 결정 값이 될 때까지 계속 분할 or 노드가 가지는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이를 증가)
max_leaf_nodes - 말단 노드(Leaf)의 최대 개수

 

1. max_depth = 3

max_depth를 제한없음에서 3개로 설정하면 트리 깊이가 3인 간장한 결정 트리가 된다.

 

2. min_samples_splt = 4

자식 규칙 노드를 분할해 만들기 위한 최소한의 샘플 데이터 개수이다. 만약 샘플데이터 개수가 4보다 작으면 더 이상 자식 규칙 노드를 분할 하지 않고 leaf node가 된다. 

빨간 네모박스의 node들은 지니계수가 남아있지만 sample 수가 4 보다 작아 더이상 분할되지 않았다.

 

3. min_samples_leaf = 4

leaf node가 될 수 있는 샘플데이터 개수의 최솟값을 지정한다.

 

리프 노드가 될 수 있는 조건은 defalt로 1인데, 이 의미는 다른 클래스 값이 하나도 없이 단독 클래스로만 되어 있거나 단 한개의 데이터로 되어 있을 경우에는 리프 노드가 될 수 있다는 뜻이다.

 

하지만 이 값을 키우면 더 이상 분할하지 않고, 리프 노드가 될 수 있는 조건이 완화되며, 그로인해 리프 노드를 만들기 위해 규칙 조건이 변하게 된다.

즉, 4로 설정한다는 말은 샘플이 4이하이면 무조건 리프 노드가 되기 때문에 지니 계수값 상관없이 샘플이 4인 조건으로 규칙 변경을 선호하게 되어 자연스럽게 브랜치가 줄어들고 결정트리가 더 간결해진다.

 

각 샘플들이 모두 4 이하인 leaf node

 

 


 

3. 피처 중요도 

 

결정트리는 균일도에 기반해 어떠한 속성을 규칙 조건으로 선택하느냐가 중요한 요건이다.

중요한 몇 개의 피처가 명확한 규칙 트리를 만드는데 크게 기여하며, 모델을 좀 더 간결하고 이상치(Outlier)에 강한 모델을 만들 수 있기 때문이다.

 

사이킷런은 결정 트리 알고리즘이 학습을 통해 규칙을 정하는데 있어 피처의 중요한 역할 지표를 제공한다.

=> feature_importances

 

<code>

import seaborn as sns
import numpy as np
%matplotlib inline

# feature importance 추출
print("Feature importances : \n{0}".format(np.round(dt_clf.feature_importances_, 3)))

# feature importance 매핑
for name, value in zip(iris_data.feature_names, dt_clf.feature_importances_) :
  print('{0} : {1:.3f}'.format(name, value))

# feature importance를 column 별로 시각화하기
sns.barplot(x=dt_clf.feature_importances_, y=iris_data.feature_names)

petal width (cm)가 가장 피처 중요도가 높음을 알 수 있다.

 


 

▶ 결론

일반적으로 다른 알고리즘은 내부의 동작 원리가 복잡해 '블랙박스'인 반면, 결정 트리는 알고리즘 자체가 직관적이기 때문에 알고리즘과 관련된 요소를 시각적으로 표현할 수 있는 다양한 방안이 있다. 

 

규칙트리의 시각화 피쳐중요도 속성으로 결정 트리 알고리즘이 어떻게 동작하는지 직관적으로 이해할 수 있다.

 

 

 

728x90
반응형