ASR/CV/ML      使用python演示决策树中的几个概念   
文章目录  [隐藏]

准备一个数据集,基于老妹相亲已经掌握的15个小伙的信息,进行整理得到。
每个人有5项信息,前4项是基本情况——特征,第5项是老妹根据前4项做出的决定——即这个人的标签。
这些信息组成一个二维序列(二维数组、表),每行代表1个人,每列表示同一种特征。


1.经验熵

这一份数据中,最后一列,是老妹想要得到的结果,无论前面考虑多少种“特征”,无非是为了最终相亲与否的“标签”,
我们用一个数字来表示老妹想得到这个标签的程度的话,这个数字称为“熵”,称为“经验熵(香农熵)”。
要计算经验熵,标签这一列出现的2个值‘yes’和‘no’,分别有多少比例,然后结合数学中的log运算,进行计算。
(1)已知数据的标签有2种:no、yes,no有9个,yes有6个,
no个数在总人数的比例 probNo = 9/15
yes个数在总人数的比例 probYes = 6/15
(2)此数据集基于标签的经验熵HD即:
HD = ( -1 * probYes * log(2)probYes ) + ( -1 * probNo * log(2)probNo )


2.信息增益

既然有4个考虑因素(特征)来决定最终标签值是yes还是no,那么是不是有某个特征的会起决定性的作用?通常是的。
本例中"房子"一项似乎对结果影响很大,

特征对标签的影响有多大,也用数字来表示,称为“信息增益”。
要计算信息增益,得考虑数据集中人数、本特征的每种值的比例,对应的每种标签值的比例,还要结合经验熵。
比如先计算‘年龄’特征的信息增益,
(1)年龄为0的5人中,标签为no的3个,yes的2个,比例分别是 3/5 、2/5,
则,这5人数据的经验熵为 HDAge0 = (-1 * 3/5 * math.log(3/5, 2)) + (-1 * 2/5 * math.log(2/5, 2))
(2)年龄为1的5人中,标签为no的2个,yes的3个,比例分别是 2/5 、3/5,
则,这5人数据的经验熵为 HDAge1 = (-1 * 2/5 * math.log(2/5, 2)) + (-1 * 3/5 * math.log(3/5, 2))
(3)年龄为2的5人中,标签为no的1个,yes的4个,比例分别是 1/5 、4/5,
则,这5人数据的经验熵为 HDAge2 = (-1 * 1/5 * math.log(1/5, 2)) + (-1 * 4/5 * math.log(4/5, 2))
(4)总人数中,
年龄为0的5个人占比ratioAge0 = 5/15
年龄为1的5个人占比ratioAge1 = 5/15
年龄为2的5个人占比ratioAge2 = 5/15
(5)则特征年龄的“经验条件熵”HAage即
HAage = ratioAge0 * HDAge0 + ratioAge1 * HDAge1 + ratioAge2 * HDAge2
(6)年龄的信息增益gDAage为 数据集经验熵HD 减去 年龄的经验条件熵HAage
gDAage = HD - HAage
如此,再计算工作、房子、车子的信息增益:gDAjob、gDAhouse、gDAcredit。只要看一下哪个特征的信息增益最大,就知道哪个特征起作用最大。
即特征的信息增益表现了在预测最终标签值时的优先级;信息增益越大,则此特征越能决定标签为何值。
如下代码演示计算信息增益:


3.决策树

要把特征对标签的影响能力表现出来,根据它们的信息增益用树结构可以很清晰直白的做到。树结构表达了什么因素导致什么决策,称为决策树。
从图中可以看出,除了房子、工作两个特征,可以导致标签出现“yes”,年龄、车子无论什么值,标签都是‘no’。而决策树保留的也是和‘yes’相关的、有用的特征。
● 房子是信息增益最大的特征,作为整棵树的根节点。即为树结构的第1层。
房子为1时,检查标签都为yes。则直接指向"yes"这个“叶子节点”;为树结构的第2层。
房子为0时,标签有yes也有no。那么,须对[年龄、工作、车子]3个特征重新计算出信息增益最大的,作为第2层的另一个节点(下一层的根节点)。
● 特征节点是否有分支,就看它的值对应的标签的值。
无论特征值是0/1/2,只要对应标签值是同一个,则直接指向对应“叶子节点”,结束。
对应标签值不止1个,则下一轮计算。
这种计算方法称为 ID3算法 。


4.可视化

高级绘图诸如matplotlib、pyEcharts等。
这里使用python内置的turtle,针对本例的决策树进行绘制,代码没有通用性。
上面得到的决策树json,即二叉树结构。可以对其解析为一个类链表进行存储,能通过父子节点关系以确定绘制位置。


5.预测

首先修改一下getMyTree函数,以保存最终有用/有效的特征名称。

这里生成的决策树“tree”,即通常所说的“模型”,一旦生成后就可重复使用。
在进行预测时,只要按照模型中 有用特征 的顺序,定义测试数据,代入模型即可。
[0, 1] 表示没有房子,但工作挺好。


6.模型持久化

上面说了,模型一旦生成,以后就直接使用,当业务调整、算法优化、数据集足够扩充,则有必要进行重新构建。
持久化就是写到硬盘上,保存为一个文件,这样也好分享给别人使用。可保存为txt文件、数据库文件、等等,通常以二进制的形式保存,不希望公开的话还会加密。
本例使用pickle包进行持久化:

把这个"mytree.m"文件发给老妹,让她自己用。她的代码:


本文参考 https://cuijiahua.com/blog/2017/11/ml_2_decision_tree_1.html


- end

承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设