1.前言
假期第一天,首先祝各位假期愉快,难得有这样一段完整的时间,放松的同时也别忘了给自己充电呀,Python实现ID3/C4.5决策树下篇来了。
「决策树」| Part2—Python实现之构建决策树
中我们已经可以基于给定数据集训练出决策树模型,只不过是以字典方式表示决策树,决策树直观、易于理解的优点完全体现不出来。因此,这篇文章的目的就是将训练出的决策树模型以树状图形表示。
给定数据集:
字典形式决策树模型:
2.获取决策树的叶节点数及深度
为了使绘制出的决策树图形不因树的节点、深度的增减而变得畸形,因此利用决策树的叶子节点个数以及树的深度将x轴、y轴平均切分,从而使树状图平均分布在画布上。
3.绘制决策树
3.1绘制节点
plotNode函数一次绘制的是一个箭头与一个节点,plotMidText函数绘制的是直线中点上的文本。
3.2递归绘制决策树
递归绘制决策树的整体思路如下:
(1)绘制当前节点;
(2)如果当前节点的子节点不是叶子节点,则递归;
(3)如果当前节点的子节点是叶子节点,则绘制。
根据决策树的叶子节点数和深度来平均切分画布,并且x、y轴的总长度为1,如下图所示:
原谅我的画图水平
3.2.1在createPlot函数中:
plotTree.totalW:表示叶子节点个数,因此上图中每两个叶子节点之间的距离为:1/plotTree.totalW;
plotTree.totalD:表示决策树深度;
plotTree.xOff:表示最近绘制的叶子节点x坐标,在绘制叶节点时其值才会更新;其初始值为图中虚线圆圈位置,这样在以后确定叶子节点位置时可以直接加整数倍的1/plotTree.totalW;
plotTree.yOff= 1.0 :表示当前绘制的深度,其值初始化为根节点y坐标。
3.2.2在plotTree函数中:
在确定当前节点x坐标时,只需确定当前节点下的叶节点个数,其x坐标即为叶节点所占距离的一半:float(numLeafs)/2.0/plotTree.totalW;
由于plotTree.xOff初始值为-0.5/plotTree.totalW,因此当前节点x坐标还需加上0.5/plotTree.totalW。
4.决策树可视化
字典形式表示决策树:
树状图形决策树:
5.使用决策树算法
在已知对方有钱,人品差,长得漂亮后,利用前面训练的决策树做出决策,见或不见?!
决策结果:
6.存储决策树模型
构建决策树消耗的时间还是很可观的,尤其在数据量大的时候,因此,当训练完决策树模型后有必要将其保存下来,以便后续使用。使用Python模块的pickle序列化对象可以解决这个问题,序列化对象可以在磁盘上保存对象,在需要时将其读取出来。
不知不觉,进入了假期第二天......
Enjoy Coding and Life!
领取专属 10元无门槛券
私享最新 技术干货