第一个问题: 是的,你的逻辑是正确的。左边的节点是True,右边的节点是False。这是违反直觉的;真实通常意味着一个较小的值。
第二个问题: 这个问题最好通过用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格式(参见[链接](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 –