[python] 결정트리의 학습과 예측

 

📑 사이킷 런 라이브러리에서 제공하는 유방암 데이터셋 사용

 

전체 코드


from sklearn.datasets import load_breast_cancer
from sklearn import tree
import pydotplus

wdbc = load_breast_cancer()

decision_tree = tree.DecisionTreeClassifier(max_depth = 4, random_state = 1)
dt = decision_tree.fit(wdbc.data, wdbc.target)

res = dt.predict(wdbc.data)
print("결정 트리의 정확률 = ",sum(res==wdbc.target)/len(res))

dot=tree.export_graphviz(dt, out_file=None, feature_names = wdbc.feature_names, class_names = wdbc.target_names, filled=True, node_ids = True, rounded=True)
graph=pydotplus.graph_from_dot_data(dot)

import os
os.environ['PATH'] = os.environ['PATH']+';'+r"\Library\bin/graphviz"

graph.write_png("tree.png")

x_test = wdbc.data[0:1]
path = dt.decision_path(x_test)
path_seq = path.toarray()[0]

for n,value in enumerate(path_seq):
    node = graph.get_node(str(n))[0]
    if value==0:
        node.set_fillcolor('white')
    else: 
        node.set_fillcolor('green')

graph.write_png('tree_with_path.png')

 

 

실행 결과


 

 

코드 해설


📌 시작 하기 전 다음 패키지 설치 (아나콘다 기준)

conda install python-graphviz
conda install pydotplus

pydotplus 라이브러리는 결정 트리를 그림으로 그리는 데 사용

 

데이터 준비

wdbc = load_breast_cancer()

유방암 데이터를 읽어온다.

 

 

결정 트리 학습

decision_tree = tree.DecisionTreeClassifier(max_depth = 4, random_state = 1)
dt = decision_tree.fit(wdbc.data, wdbc.target)

DecisionTreeClassifier 함수를 호출해 결정 트리를 학흡할 준비를 한다

이때, 매개변수 max_depth=4는 깊이 4까지만 노드를 생성하라는 지시

실제 학습은 fit함수를 호출해 수행한다.

학습을 마친 결정 트리는 dt 객체에 저장.

 

결정 트리 그리기

dot=tree.export_graphviz(dt, out_file=None, feature_names = wdbc.feature_names, class_names = wdbc.target_names, filled=True, node_ids = True, rounded=True)
graph=pydotplus.graph_from_dot_data(dot)

tree 클래스가 제공하는 export-graphvis함수를 이용해 graphviz 형식으로 변환한다.

pydotplus 라이브러리가 제공하는 graph_from_dot_data 함수를 이용해 dot 객체를 그래프로 그린다.

 

graph.write_png("tree.png")

그래프를 그림 파일로 저장한다.

위 실행결과에서 트리파일이 tree.png이다.

 

테스트 샘플 인식

x_test = wdbc.data[0:1]
path = dt.decision_path(x_test)
path_seq = path.toarray()[0]

for n,value in enumerate(path_seq):
    node = graph.get_node(str(n))[0]
    if value==0:
        node.set_fillcolor('white')
    else: 
        node.set_fillcolor('green')

graph.write_png('tree_with_path.png')

학습된 결정 트리로 테스트 샘플을 인식하는 것으로, 테스트 샘플이 루트에서 출발하여 트리를 타고 내려가는 경로를 녹색으로 표시한다.

코드를 자세히 살펴보자.

 

x_test = wdbc.data[0:1]

훈련 집합에 있는 0번 샘플을 테스트 샘플로 간주한다.

여러 샘플을 동시에 인식할 수 있다. 
wdbc.data[100:200]로 변경하면 100번째부터 199번째까지 100개의 샘플을 인식함
path = dt.decision_path(x_test)

샘플이 트리를 타고 내려가면서 단말 노드에 도착할 때까지 거쳐간 노드의 경로를 path 객체에 저장한다.

path객체는 희소 행렬 형태로 표현된다.

path_seq = path.toarray()[0]

toarray함수를 이용해 배열 형태로 변환 후 저장한다.

path_seq는 경로 상에 있는 노드를 1, 그렇지 않은 노드를 0으로 표시한다.

테스트샘플인 0번 샘플은 node #0 - node #14 - node #15 - node #17의 경로를 타고 내려간다.

경로를 표현하는 희소 행렬 형식은 다음과 같이 표현된다.

이를 toarray함수를 적용하면 다음과 같은 배열이 얻어진다.

for n,value in enumerate(path_seq):
    node = graph.get_node(str(n))[0]
    if value==0:
        node.set_fillcolor('white')
    else: 
        node.set_fillcolor('green')

테스트 샘플이 거쳐간 경로를 녹색으로 표시한 그래프를 생성한다.

graph.get_node를 통해 노드를 얻어오고 set_fillcolor함수로 경로상에 있는 노드를 초록색, 그렇지 않은 노드는 흰색으로 변경한다.

 


참고교재 파이썬으로 만드는 인공지능 - 한빛미디어