决策树

直接绘制随机森林也不在话下
下面介绍一下这个神器 —— pybaobabdt
安装GraphViz
pybaobabdt依赖GraphViz。
1、首先下载安装包
http://www.graphviz.org/download/
2、双击msi文件,然后一直选择next(默认安装路径为C:\Program Files (x86)\Graphviz2.38\),安装完成之后,会在windows开始菜单创建快捷信息。
3、配置环境变量:计算机→属性→高级系统设置→高级→环境变量→系统变量→path,在path中加入路径:
4、验证:在windows命令行界面,输入dot -version,然后按回车,如果显示如下图所示的graphviz相关版本信息,则安装配置成功。
安装pygraphviz和pybaobabdt
pip直接安装pygraphviz的话,大概率会报错,建议下载whl文件本地安装。
pybaobabdt就简单了,直接pip install pybaobabdt 即可
pybaobabdt用法
pybaobabdt 用起来也简单到离谱,核心命令只有一个pybaobabdt.drawTree,下面是官方文档示例代码,建议在jupyter-notebook中运行。
import pybaobabdtimport pandas as pdfrom scipy.io import arfffrom sklearn.tree import DecisionTreeClassifierfrom matplotlib.colors import LinearSegmentedColormapfrom matplotlib.colors import ListedColormapfrom colour import Colorimport matplotlib.pyplot as pltimport numpy as npdata = arff.loadarff('vehicle.arff')df = pd.DataFrame(data[0])y = list(df['class'])features = list(df.columns)features.remove('class')X = df.loc[:, features]clf = DecisionTreeClassifier().fit(X, y)ax = pybaobabdt.drawTree(clf, size=10, dpi=72, features=features, colormap='Spectral')

这个图怎么看呢?
不同的颜色对应不同的分类(target),每个分叉处都标记了分裂的条件,所以划分逻辑一目了然。树的深度也是工整的体现了出来。
树枝的直径也不是摆设,而是代表了样本的个数(比例),该划分条件下的样本越多,树干也就越粗。
发现最最底层的树枝太细太脆弱的时候,是不是应该考虑一下过拟合风险,比如需要调整一下最小样本数?
绘制随机森林
import pybaobabdtimport pandas as pdfrom scipy.io import arffimport matplotlib.pyplot as pltfrom sklearn.ensemble import RandomForestClassifierdata = arff.loadarff('vehicle.arff')df = pd.DataFrame(data[0])y = list(df['class'])features = list(df.columns)features.remove('class')X = df.loc[:, features]clf = RandomForestClassifier(n_estimators=20, n_jobs=-1, random_state=0)clf.fit(X, y)size = (15,15)plt.rcParams['figure.figsize'] = sizefig = plt.figure(figsize=size, dpi=300)for idx, tree in enumerate(clf.estimators_):ax1 = fig.add_subplot(5, 4, idx+1)pybaobabdt.drawTree(tree, model=clf, size=15, dpi=300, features=features, ax=ax1)fig.savefig('random-forest.png', format='png', dpi=300, transparent=True)

