📑 사이킷 런 라이브러리에서 제공하는 유방암 데이터셋 사용
전체 코드
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함수로 경로상에 있는 노드를 초록색, 그렇지 않은 노드는 흰색으로 변경한다.
참고교재 파이썬으로 만드는 인공지능 - 한빛미디어