决策树以及XGBoost如何画出 树分裂图?

Posted 悟乙己

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了决策树以及XGBoost如何画出 树分裂图?相关的知识,希望对你有一定的参考价值。

之前有专门研究过,在各自的文中,这里进行罗列:


1 pydotplus安装

文档:PyDotPlus Homepage

如果要画出决策树图,一般需要该库,需要先下载:
http://www.graphviz.org/download/


然后记住下载的路径,

pip install pydotplus

就可以按下面使用了:

import os
os.environ["PATH"] += os.pathsep + 'C:\\\\Desktop\\\\Graphviz\\\\bin\\\\'
import pydotplus 

2 XGBoost画出分裂图

R+python︱XGBoost极端梯度上升以及forecastxgb(预测)+xgboost(回归)双案例解读

如果y是分类变量,可以直接画出节点图:

from matplotlib import pyplot
from xgboost import plot_tree
plot_tree(gbm, num_trees=0, rankdir='LR')
pyplot.show()

可以直接通过plot_tree画出节点图,但是plot_tree很丑,很模糊!

一种解决方案,参考https://github.com/dmlc/xgboost/issues/1725:

xgb.plot_tree(bst, num_trees=2)
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(150, 100)
fig.savefig('tree.png')

于是乎,就需要来一张清晰一些的图片还有一种画法如下:

xgb.to_graphviz(gbm, num_trees=80, rankdir='LR')


来观察一下图型:

其中分支代表,category<5,两条路,代表条件成立,yes;条件不成立,no

每个节点都带有节点名,但是圆圈的大小,有人说是样本量越大,圆圈越大,也有可能是根据节点名称的多少来划定。

如何把图形输出出来:from graphviz import Digraph(参考:如何画XGBoost里面的决策树(decision tree)

参数界面:https://xgboost.readthedocs.io/en/latest/python/python_api.html


3 决策树画出分裂图

决策树之ID3、C4.5、C5.0等五大算法及python实现

from sklearn.datasets import load_iris
from sklearn import tree
import sys
import os       
from IPython.display import Image as Images
import pydotplus 
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
import numpy as np

import os
os.environ["PATH"] += os.pathsep + 'C:\\\\Desktop\\\\Graphviz\\\\bin\\\\'

iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)

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)  

Images(graph.create_png()) 

在ipython的notebook生成的图如下:

其中解析一下这张图:

通过剪枝,把很多不必要的枝叶进行删减,保留有效节点;根据gini系数来判定节点,划分最优属性,gini越大,分割贡献越大,越容易成为高层节点。

颜色信息,这边

  • virginica——紫色/2;
  • versicolor——绿色/1;
  • setosa——橙色/0。
    gini系数的大小,代表颜色的深浅,gini越大,颜色越浅。

samples代表这个节点的样本数量,value = [0,2,1]代表三种种类的样本数量分别是多少。

一般来说,紫色越多的分支,分类效力越高。

如果要保存图片,可以使用下面的语句:

Image.open(BytesIO(graph.create_png())).save('roi.png')

如何选择最优路径的一些准则,笔者自己整理,勿怪:

  • 紫色扎堆、链路较短、而且完整链路上只有紫色会更好;
  • 链路最低端最好是gini = 0

以上是关于决策树以及XGBoost如何画出 树分裂图?的主要内容,如果未能解决你的问题,请参考以下文章

如何画xgboost里面的决策树

如何在 xgboost 中访问单个决策树的权重?

决策树如何计算分裂属性?

一文带你用Python玩转决策树 ❤️画出决策树&各种参数详细说明❤️决策树的优缺点又有哪些?

构建决策树时如何找到分裂点的熵?

机器学习不同决策树的节点分裂准则