如何将python生成的决策树利用graphviz画出来

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将python生成的决策树利用graphviz画出来相关的知识,希望对你有一定的参考价值。

参考技术A # 这里有一个示例,你可以看一下。
# http://scikit-learn.org/stable/modules/tree.html
>>> from IPython.display import Image  
>>> dot_data = tree.export_graphviz(clf, out_file=None, 
                        feature_names=iris.feature_names,  
                        class_names=iris.target_names,  
                        filled=True, rounded=True,  
                        special_characters=True)  
>>> graph = pydotplus.graph_from_dot_data(dot_data)  
>>> Image(graph.create_png())

本回答被提问者采纳
参考技术B 决策树是用样本的属性作为结点,用属性的取值作为分支的树结构。
决策树的根结点是所有样本中信息量最大的属性。树的中间结点是该结点为根的子树所包含的样本子集中信息量最大的属性。决策树的叶结点是样本的类别值。决策树是一种知识表示形式,它是对所有样本数据的高度概括决策树能准确地识别所有样本的类别,也能有效地识别新样本的类别。

决策树算法ID3的基本思想:
首先找出最有判别力的属性,把样例分成多个子集,每个子集又选择最有判别力的属性进行划分,一直进行到所有子集仅包含同一类型的数据为止。最后得到一棵决策树。
J.R.Quinlan的工作主要是引进了信息论中的信息增益,他将其称为信息增益(information gain),作为属性判别能力的度量,设计了构造决策树的递归算法。
举例子比较容易理解:
对于气候分类问题,属性为:
天气(A1) 取值为: 晴,多云,雨
气温(A2) 取值为: 冷 ,适中,热
湿度(A3) 取值为: 高 ,正常
风 (A4) 取值为: 有风, 无风
每个样例属于不同的类别,此例仅有两个类别,分别为P,N。P类和N类的样例分别称为正例和反例。将一些已知的正例和反例放在一起便得到训练集。

更改使用导出 graphviz 创建的决策树图的颜色

【中文标题】更改使用导出 graphviz 创建的决策树图的颜色【英文标题】:Changing colors for decision tree plot created using export graphviz 【发布时间】:2017-08-10 23:54:23 【问题描述】:

我正在使用 scikit 的回归树函数和 graphviz 来生成一些决策树的精彩、易于解释的视觉效果:

dot_data = tree.export_graphviz(Run.reg, out_file=None, 
                         feature_names=Xvar,  
                         filled=True, rounded=True,  
                         special_characters=True) 
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png('CART.png')
graph.write_svg("CART.svg")

这运行得很完美,但如果可能的话,我想更改配色方案吗?该图表示 CO2 通量,因此我想将负值设为绿色,将正值设为棕色。我可以改为导出为 svg 并手动更改所有内容,但是当我这样做时,文本与框并不完全对齐,因此手动更改颜色并修复所有文本为我的工作流程增加了一个非常乏味的步骤,我真的很喜欢避免!

此外,我还看到一些树,其中连接节点的线的长度与拆分解释的百分比方差成正比。如果可能的话,我也希望能够做到这一点?

【问题讨论】:

【参考方案1】: 您可以通过graph.get_edge_list()获取所有边的列表 每个源节点应有两个目标节点,索引较低的为 True,索引较高的为 False 颜色可以通过set_fillcolor()分配

import pydotplus
from sklearn.datasets import load_iris
from sklearn import tree
import collections

clf = tree.DecisionTreeClassifier(random_state=42)
iris = load_iris()

clf = clf.fit(iris.data, iris.target)

dot_data = tree.export_graphviz(clf,
                                feature_names=iris.feature_names,
                                out_file=None,
                                filled=True,
                                rounded=True)
graph = pydotplus.graph_from_dot_data(dot_data)

colors = ('brown', 'forestgreen')
edges = collections.defaultdict(list)

for edge in graph.get_edge_list():
    edges[edge.get_source()].append(int(edge.get_destination()))

for edge in edges:
    edges[edge].sort()    
    for i in range(2):
        dest = graph.get_node(str(edges[edge][i]))[0]
        dest.set_fillcolor(colors[i])

graph.write_png('tree.png')

另外,我还看到了一些树,其中连接线的长度 节点与拆分解释的百分比方差成正比。 ID 如果可能的话,我也希望能够做到这一点!?

您可以使用 set_weight()set_len() 来玩,但这有点棘手,需要一些小技巧才能正确完成,但这里有一些代码可以帮助您入门。

for edge in edges:
    edges[edge].sort()
    src = graph.get_node(edge)[0]
    total_weight = int(src.get_attributes()['label'].split('samples = ')[1].split('<br/>')[0])
    for i in range(2):
        dest = graph.get_node(str(edges[edge][i]))[0]
        weight = int(dest.get_attributes()['label'].split('samples = ')[1].split('<br/>')[0])
        graph.get_edge(edge, str(edges[edge][0]))[0].set_weight((1 - weight / total_weight) * 100)
        graph.get_edge(edge, str(edges[edge][0]))[0].set_len(weight / total_weight)
        graph.get_edge(edge, str(edges[edge][0]))[0].set_minlen(weight / total_weight)

【讨论】:

你会如何根据虹膜的类别来适应颜色?

以上是关于如何将python生成的决策树利用graphviz画出来的主要内容,如果未能解决你的问题,请参考以下文章

如何阅读graphviz决策树?

Python 决策树 GraphViz

解释 Graphviz 输出以进行决策树回归

更改使用导出 graphviz 创建的决策树图的颜色

Graphviz绘制决策树基于Graphviz绘制由字典形式表示的决策树图像

Graphviz绘制决策树基于Graphviz绘制由字典形式表示的决策树图像