《机器学习实战》读书笔记 第三章 决策树(part 2)

part 2 树、字典、递

上一篇讲解了决策树算法的数学理论基础,接下来讲讲具体是怎么实现的。

首先,决策树是以一棵树的形式进行存储的。 是一种数据结构,它是若干结点的集合,是由唯一的根结点和若干互不相交的子树组成的(翻开《数据结构高分笔记》,念)。就像这样:



目前我们只要了解:最上面那个是根结点,紧跟在每个结点下面的结点是它的孩子结点,最下面那些没有孩子结点的结点是叶子结点就可以了。

既然树是结点的集合,那么首先要了解的是每个结点的结构。在树的链式存储结构中,每个结点用一个链结点存储。比如C语言中二叉树结点的定义(不知道没关系,这不是重点):



(不要觉得把代码写在纸上是闲得蛋疼,你考试和面试的时候都要在纸上写的,平时不找手感,到时候你就知道什么是拙计)
放这个图是为了说明,树的一个结点需要包含两部分信息:一部分是结点本身的信息,另一部分是要找到它的下一个(或几个)孩子结点在哪里?这样,在有了根结点之后,我们就可以遍历整棵树,来得到树中每个结点的信息。

那么在python中,可以怎样存储一棵树呢?幸而我们不用像C语言那样写冗长的定义,python为我们准备好了一种数据结构:字典,非常适合用来构造一棵树~

我们在第二章里已经见识过字典了。简而言之就是由 键值对构成的集合,像这样:{key1:value1,key2:value2,key3:value3,...}。由于键和值之间建立了映射(相当于c语言里的指针),可以通过字典的嵌套来构造一棵树。比如:

{'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}}


用matplotlib画出来就是这样:




回到决策树。刚才画的那个就是一棵决策树啦,它的根结点是我们选择的第一个要进行分类的特征,分成的几类(如果可再分的话)需要进行下一次分类,那么根结点的孩子结点就是第二次分类时选择的特征;然后这个过程在以孩子结点为根的子树上循环往复,直到得到不可再分的样本集为止。叶子结点储存的是最终 不可再分的样本集的标签。

书上那个给鱼分类的sample太不接地气了,接下来,我再给大家for一个sample:



这是一个决定是否要出去玩的决策树。第一次按天气这个特征进行分类,分为晴、阴、雨三类;其中阴这一类的样本集不可再分,因此它就是叶子结点,标签为“出去玩”。晴和雨分别按湿度和风力进行第二次分类,分类的结果均不可再分,因此湿度和风力的孩子结点均为叶子结点。

值得注意的是决策树算法中选择分类特征、划分样本集这两个过程是不断在循环的,树不断在生长,每个新结点继续生长的方式与根结点第一次生长的方式无异——这说明决策树生长的过程在调用它自身(生长的过程),每一次新的生长都是原来生长的一种重复。这种方法称为递归。

要理解什么是递归,你首先要 理解什么是递归……【拖出去

递归并不是无限循环,否则就要发生栈溢出了(stackoverflow:你叫我?)。看看上面那句话,是不是有种眩晕的感觉?那就是你的大脑溢出了。顺便说一下,如果 你的大脑溢出了,上 stackoverflow看看是一种不错的选择。

扯远了,回来回来。递归要成立,需要两个条件:
1)递归的终止条件。必须要有一种情况能让递归结束,在决策树的例子里,“样本集不可再分”就是终止条件。
2)每次的递归调用过程中,必须要化归为一个更小规模的同类过程,以至于最终可以达到终止条件。比如决策树算法中,每次进行分类都要损失掉一个特征,最终所有特征都损失掉的时候自然就达到了终止条件。

树是由唯一的根结点和若干互不相交的子树组成的。这个树的定义也是递归的,它在定义自身的时候用到了自身的定义。

现在一切的原理都解释明白了,下一篇我们就讲最后一步~实现决策树算法——ID3( Iterative Dichotomiser 3)!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值