첫 번째 질문 : 네 논리가 맞습니다. 왼쪽 노드는 참이고 오른쪽 노드는 거짓입니다. 이는 반 직관적입니다. true는 일반적으로 더 작은 값을 의미합니다.
두 번째 질문 : 이 문제는 트리를 pydotplus로 그래프로 시각화하면 가장 잘 해결됩니다. tree.export_graphviz()의 'class_names'속성은 클래스 선언을 각 노드의 다수 클래스에 추가합니다. 코드는 iPython에서 실행됩니다.홍채 데이터 세트처럼
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf2 = tree.DecisionTreeClassifier()
clf2 = clf2.fit(iris.data, iris.target)
with open("iris.dot", 'w') as f:
f = tree.export_graphviz(clf, out_file=f)
import os
os.unlink('iris.dot')
import pydotplus
dot_data = tree.export_graphviz(clf2, out_file=None)
graph2 = pydotplus.graph_from_dot_data(dot_data)
graph2.write_pdf("iris.pdf")
from IPython.display import Image
dot_data = tree.export_graphviz(clf2, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True, # leaves_parallel=True,
special_characters=True)
graph2 = pydotplus.graph_from_dot_data(dot_data)
## Color of nodes
nodes = graph2.get_node_list()
for node in nodes:
if node.get_label():
values = [int(ii) for ii in node.get_label().split('value = [')[1].split(']')[0].split(',')];
color = {0: [255,255,224], 1: [255,224,255], 2: [224,255,255],}
values = color[values.index(max(values))]; # print(values)
color = '#{:02x}{:02x}{:02x}'.format(values[0], values[1], values[2]); # print(color)
node.set_fillcolor(color)
#
Image(graph2.create_png())
, 귀하의 예제는 하나의 클래스와 잎이없는 잎에서 클래스를 결정으로
. 이는 일반적이며 이러한 결과를 얻기 위해 모델을 지나치게 맞추어야 할 수도 있습니다. 클래스의 이산 분포는 많은 교차 유효성이 검증 된 모델에서 가장 좋은 결과입니다.
코드를 즐기십시오!
호기심에서 벗어나 결정 트리를 어떻게 그렸습니까? – Matt
먼저 트리를 JSON 형식으로 내 보낸 다음 (이 [link] (http://www.garysieling.com/blog/rending-scikit-decision-trees-d3-js) 참조) d3.js를 사용하여 트리를 플롯합니다 . 또는 임베디드 함수를 직접 사용할 수 있습니다 :'tree.export_graphviz (clf, out_file = your_out_file, feature_names = your_feature_names)'희망, @Matt –