🐍 파이썬 데이터 분석 프로젝트/🫀 심혈관질환 데이터 분석

🫀 심혈관질환 데이터 분석 14. 결정트리 시각화

nyamin9 2023. 2. 3. 11:39

모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!!

 

 


 

🩸 저번 글에서는 결정 트리를 통해 Classification을 진행했습니다. correlation 분석으로 얻어진 4개의 attribute set과 PCA dataframe에 대해 예측력을 평가했습니다. 이번 글에서는 앞서 얻은 결정 트리 모델을 시각화해볼 것입니다.

 


🫀 1. 라이브러리

 

📌 결정트리를 위한  graphviz 라이브러리 를 사용합니다. 처음 설치할 때 바이너리 코드의 경로를 잘 설정해줘야합니다.

 

 

데이터의 크기가 크지 않은 경우에는 만들어진 결정 트리를 살펴보기 어렵지 않지만, 본 프로젝트에 사용한 데이터는 column이 많기에 한번에 파악하기 어렵습니다. 따라서 이렇게 만들어진 결정 트리를 .png 파일로 저장해서 세세한 부분들을 살펴보기로 하였는데요, 이때 사용하는 라이브러리가  pydotplus 입니다.

 

# decision tree를 위한 export_graphviz 라이브러리 임포트
# sklearn 모듈의 tree 라이브러리 임포트

from sklearn.tree import export_graphviz
import graphviz
from sklearn import tree
from os import system


# 결정트리를 png 형태로 저장하기 위한 라이브러리 임포트
import pydotplus

 


🫀 2. Attribute set 4 :  age, aphi, aplo, cholesterol, gluc, BMI  결정 트리

 

📌 test set에 대해 높은 accuracy를 보인 attribute set 4에 대해서 시각화를 진행하겠습니다.

 

# attribute set 4에 대한 결정트리 시각화 (max_depth = 5)

# 의사결정나무 모형 대입
dot_data = tree.export_graphviz(accuracy_test(cardio_4_feat, 5)[0],        
                               
                               # file로 변환할 것인가
                               out_file = None,      
                               
                               # feature 이름
                               feature_names = cardio_4_feat.columns,      
                               
                               # target 이름
                               class_names = cardio.target_rand,    
                               
                               # 그림에 색상을 넣을것인가
                               filled = True,                              
                               
                               # 반올림을 진행할 것인가
                               rounded = True,        
                               
                               # 특수문자를 사용하는가
                               special_characters = True)                  


graph = pydotplus.graph_from_dot_data(dot_data)
graph.set_size('"60,30!"')
graph.write_png('atribute_4_tree.png')

 

 

 

앞서 말씀드린대로 정말 자잘자잘한 형태로 나옵니다. 구글링을 해보면 대부분의 결정트리에서 iris 데이터를 사용하고 있는데요, iris 데이터는 정말 유명한 데이터이고 그만큼 정리도 잘 되어 있는 데이터이기에 깨끗한 결정 트리를 관찰할 수 있지만, 본 데이터는 완전한 균일화가 되기에는 어렵습니다. 위의 결정 트리의 결과를 설명하면 다음과 같습니다.

 

 

▪ 결정 트리의 목적은 데이터가 균일할 수 있도록 계속해서 데이터를 분류해 나가는 것입니다.

 

 데이터를 분류하는 기준은 균일하게 분류된 그룹을 기준으로 만들어집니다.

 

 첫 그룹을 잘 나눌 수 있는 기준을 통해 다음 두 개의 자식 노드로 만들고, 다음 기준을 통해 다시 자식 노드를 만듭니다.

 

 각 그룹의 균일도를 측정하는 방법에는 크게 두 가지가 있습니다.

 

  ▪  Entropy  : 데이터의 complexity. 다른 값이 많이 섞여 있는 경우 높고, 같은 값이 많은 경우 낮습니다.

 

    - 이 Entropy가 낮은 그룹을 기준으로 자식 노드로 나눠줍니다.

 

  ▪  gini  : 0~1의 값으로 데이터의 불평등함을 나타냅니다. 데이터가 같은 값을 많이 가질수록 불평등하다는 의미입니다.

 

      - gini 계수가 높을수록 데이터가 균일합니다.

 

 

결정트리를 만들 때 엔트로피를 사용하였기 때문에, 위의 결정트리를 보면 엔트로피로 기준이 잡혀있는 것을 확인 할 수 있습니다. 결정트리의 목적은 모든 그룹을 균일하도록 만들어 그 예측력을 높이는 데에 있기 때문에, 트리의 깊이를 조정하며 엔트로피값을 최적화합니다. 사용한 결정 트리는 깊이가 5이기 때문에 5개까지만 만들어졌습니다.

 

 

 

 

결정 트리를 살짝 확대해서 가져왔습니다. 기준을 if 문으로 나눠서 자식 노드가 갈라지며, 그에 따른 엔트로피 값을 계산하는 것을 확인 할 수 있습니다. 따라서 어떤 노드는 엔트로피가 0인 반면, 아닌 노드도 있습니다.

 


🫀 3. PCA Decision Tree

 

📌 이번에는 PCA 결과 만들어진 데이터를 가지고 결정 트리를 시각화합니다.

 

# PCA Dataframe에 대한 결정트리 시각화 (max_depth = 6)

# 의사결정나무 모형 대입
dot_data_PCA = tree.export_graphviz(clf_PCA,                            

                               # file로 변환할 것인가
                               out_file = None,                         
                               
                               # feature 이름
                               feature_names = PCA_df.feat.columns,     
                               
                               # target 이름
                               class_names = PCA_df.target,             
                               
                               # 그림에 색상을 넣을것인가
                               filled = True,                           
                               
                               # 반올림을 진행할 것인가
                               rounded = True,                          
                               
                               # 특수문자를 사용하는가
                               special_characters = True)               


graph_PCA = pydotplus.graph_from_dot_data(dot_data_PCA)
graph_PCA.set_size('"60,30!"')
graph_PCA.write_png('PCA_tree.png')

 

 


🩸 이번 글을 통해 결정 트리를 시각화하였습니다. graphviz를 설치하는 과정이 까다로웠지만 눈에 띄는 결과가 나와 재밌었습니다.

 

🩸 결정 트리만 가지고 예측하기는 쉽지 않습니다. 다음 글에서 트리들이 모여있는 랜덤 포레스트를 사용해볼 것입니다.