机器学习(周志华) 参考答案 第四章 决策树

关闭

机器学习(周志华) 参考答案 第四章 决策树

标签: 机器学习
4983人阅读 评论(7) 收藏 举报
category_icon.jpg 分类:

机器学习(周志华) 参考答案 第四章 决策树

机器学习(周志华西瓜书) 参考答案 总目录


    如果说决策树这章还有什么遗憾,就是实在没找到一个好的树形图生成器,结果只能用Matlab上那么丑的图

1.试证明对于不含冲突数据(即特征向量完全相同但标记不同)的训练集,必存在与训练集一致(即训练误差为0)的决策树。

因为决策树是通过属性来划分,相同属性的样本最终肯定会进入相同的叶节点。一个叶节点只有一个分类,如果样本属性相同而分类不同,必然产生训练误差。反之,决策树只会在当前样本集合是同一类或者所有属性相同时才会停止划分,最终得到训练误差为0的决策树。


2.试析使用“最小训练误差”作为决策树划分选择的缺陷。

从机器学习最开始就讲起,最小训练误差并不可靠,由于过度学习样本特性最终导致严重的过拟合,而没有泛化能力。


3.试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树。


4.试编程实现基于基尼指数进行划分选择的决策树算法,并为表4.2中数据生成预剪枝、后剪枝决策树,并与未剪枝决策树进行比较。


5.试编程实现基于对率回归进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树。


6.试选择4个UCI数据集,对上述3种算法所产生的未剪枝、预剪枝、后剪枝决策树进行实验比较,并进行适当的统计显著性检验。

这里要对上面三种实现的算法进行未剪枝,预剪枝,后剪枝做比较,对率回归划分就算了,都不知道是个什么情况,信息增益和基尼指数的差别并不大,其实就是为了比较未剪枝,预剪枝,后剪枝对测试样本的输出结果。显著性分析,对2种算法,3种剪枝方式的错误数做方差分析,信息增益和基尼指数有显著区别是拒绝的,未剪枝,预剪枝,后剪枝有显著区别是接受的。


7.图4.2是一个递归算法,若面临巨量数据,则决策树的层数会很深,使用递归方法易导致“栈”溢出,试使用“队列”数据结构,以参数maxDepth控制数的最大深度,写出与图4.2等价、但不使用递归的决策树生成算法。

直接用递归会导致大量的临时变量被保存,当层数过深时会导致“栈”溢出。
用队列对决策树进行层次遍历来生成,用Max_Depth来控制树的最大层数。队列中每个元素代表着决策树的每个节点,它必要的属性有:样本集合、剩余属性集合,当前层数指示,父节点序号。队列一开始里面只有一个元素,就是最初初始化,带着所有样本的根节点。然后当队列不为空的时候开始循环,每次取出一个元素,判断是否需要划分,如果不要,就是一个叶节点,出队列就不用管了;如果需要划分,那么找出最好的划分属性,然后划分成n个子区间,依次送入队列,继续循环,直到队列为空。
是否需要划分有3个依据:

  • 当前所有样本属于一类
  • 当前所有样本属性完全相同
  • 达到了Max_Depth的深度

这样就完成了层次遍历(广度优先搜索)对决策树的构建。
显然由于每次出队的元素要先完全划分,那么如果是进行预剪枝算法的决策树,用队列结构是非常方便的。
如果是后剪枝,那必须要等到最终整棵树完全生成,才能进行。


8.试将决策树生成的深度优先搜索过程修改为广度优先搜索,以参数MaxNode控制树的最大结点数,将题4.7中基于队列的决策树算法进行改写。对比题4.7中的算法,试分析哪种方式更易于控制决策树所需储存不超过内存。

队列结构看着不错,但是极端情况下,比如层树很低,但是分叉多,会导致队列内有大量元素。另外不能在决策树生成过程中很好的进行后剪枝,全树生成后再次统计会浪费大量时间。
用栈结构把递归转换为非递归是很好的方法,设置最大节点数MaxNode来保证节点数不会爆炸。栈结构内的元素组成与列队的基本相同:样本集合、剩余属性集合,当前层数指示,父节点序号。初始化也是一样,将一个包含所有样本的集合压入栈中,当栈不为空时,每次拿出栈顶的元素进行操作,如果不可以划分,则不做操作;如果可以划分,则划分出1个子集,先将剩余子集压回栈,再将划分出的子集压回栈。然后再取出一个元素,知道栈内没有元素为止。
是否需要划分有3个依据:

  • 当前所有样本属于一类
  • 当前所有样本属性完全相同
  • 达到了Max_node上限

栈也有他的问题,极端情况下会生成一棵畸形的二叉树,但就算这样内部元素也只是队列结构极端情况的一半。栈可以很好的进行后剪枝操作,当非叶节点所有叶节点生成后可以做后剪枝,由于划分子集的时候就需要计算各个属性样本数,所以这些操作代价并不高。对于一棵完整的树,后剪枝要对所有只拥有叶节点的非叶节点进行遍历,如果某个非叶节点可以剪枝,还需要进一步考虑它的父节点。虽然在某些剪枝需求不大的情况下生成树后剪枝有不错的效果,但是我觉得生成中判断更加方便,而且不需要太多额外的代码。


9.试将4.4.2节对缺失值的处理机制推广到基尼指数的计算中去。

只需要把信息增益的公式换成基尼指数就行,包括扩展到连续参数,缺失参数,都是很直观的方法。


10.从网上下载或自己编程实现任意一种多变量决策树算法,并观察其在西瓜数据集3.0上产生的结果。

0
0
 
 

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
快速回复 TOP
个人资料
2
  • 访问:126746次
  • 积分:1771
  • 等级:
    积分:1771
  • 排名:千里之外
  • 原创:52篇
  • 转载:0篇
  • 译文:0篇
  • 评论:217条
文章存档
最新评论
收藏助手

机器学习(周志华) 参考答案 第四章 决策树

机器学习(周志华西瓜书) 参考答案 总目录


    如果说决策树这章还有什么遗憾,就是实在没找到一个好的树形图生成器,结果只能用Matlab上那么丑的图

1.试证明对于不含冲突数据(即特征向量完全相同但标记不同)的训练集,必存在与训练集一致(即训练误差为0)的决策树。

因为决策树是通过属性来划分,相同属性的样本最终肯定会进入相同的叶节点。一个叶节点只有一个分类,如果样本属性相同而分类不同,必然产生训练误差。反之,决策树只会在当前样本集合是同一类或者所有属性相同时才会停止划分,最终得到训练误差为0的决策树。


2.试析使用“最小训练误差”作为决策树划分选择的缺陷。

从机器学习最开始就讲起,最小训练误差并不可靠,由于过度学习样本特性最终导致严重的过拟合,而没有泛化能力。


3.试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树。


4.试编程实现基于基尼指数进行划分选择的决策树算法,并为表4.2中数据生成预剪枝、后剪枝决策树,并与未剪枝决策树进行比较。


5.试编程实现基于对率回归进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树。


6.试选择4个UCI数据集,对上述3种算法所产生的未剪枝、预剪枝、后剪枝决策树进行实验比较,并进行适当的统计显著性检验。

这里要对上面三种实现的算法进行未剪枝,预剪枝,后剪枝做比较,对率回归划分就算了,都不知道是个什么情况,信息增益和基尼指数的差别并不大,其实就是为了比较未剪枝,预剪枝,后剪枝对测试样本的输出结果。显著性分析,对2种算法,3种剪枝方式的错误数做方差分析,信息增益和基尼指数有显著区别是拒绝的,未剪枝,预剪枝,后剪枝有显著区别是接受的。


7.图4.2是一个递归算法,若面临巨量数据,则决策树的层数会很深,使用递归方法易导致“栈”溢出,试使用“队列”数据结构,以参数maxDepth控制数的最大深度,写出与图4.2等价、但不使用递归的决策树生成算法。

直接用递归会导致大量的临时变量被保存,当层数过深时会导致“栈”溢出。
用队列对决策树进行层次遍历来生成,用Max_Depth来控制树的最大层数。队列中每个元素代表着决策树的每个节点,它必要的属性有:样本集合、剩余属性集合,当前层数指示,父节点序号。队列一开始里面只有一个元素,就是最初初始化,带着所有样本的根节点。然后当队列不为空的时候开始循环,每次取出一个元素,判断是否需要划分,如果不要,就是一个叶节点,出队列就不用管了;如果需要划分,那么找出最好的划分属性,然后划分成n个子区间,依次送入队列,继续循环,直到队列为空。
是否需要划分有3个依据:

  • 当前所有样本属于一类
  • 当前所有样本属性完全相同
  • 达到了Max_Depth的深度

这样就完成了层次遍历(广度优先搜索)对决策树的构建。
显然由于每次出队的元素要先完全划分,那么如果是进行预剪枝算法的决策树,用队列结构是非常方便的。
如果是后剪枝,那必须要等到最终整棵树完全生成,才能进行。


8.试将决策树生成的深度优先搜索过程修改为广度优先搜索,以参数MaxNode控制树的最大结点数,将题4.7中基于队列的决策树算法进行改写。对比题4.7中的算法,试分析哪种方式更易于控制决策树所需储存不超过内存。

队列结构看着不错,但是极端情况下,比如层树很低,但是分叉多,会导致队列内有大量元素。另外不能在决策树生成过程中很好的进行后剪枝,全树生成后再次统计会浪费大量时间。
用栈结构把递归转换为非递归是很好的方法,设置最大节点数MaxNode来保证节点数不会爆炸。栈结构内的元素组成与列队的基本相同:样本集合、剩余属性集合,当前层数指示,父节点序号。初始化也是一样,将一个包含所有样本的集合压入栈中,当栈不为空时,每次拿出栈顶的元素进行操作,如果不可以划分,则不做操作;如果可以划分,则划分出1个子集,先将剩余子集压回栈,再将划分出的子集压回栈。然后再取出一个元素,知道栈内没有元素为止。
是否需要划分有3个依据:

  • 当前所有样本属于一类
  • 当前所有样本属性完全相同
  • 达到了Max_node上限

栈也有他的问题,极端情况下会生成一棵畸形的二叉树,但就算这样内部元素也只是队列结构极端情况的一半。栈可以很好的进行后剪枝操作,当非叶节点所有叶节点生成后可以做后剪枝,由于划分子集的时候就需要计算各个属性样本数,所以这些操作代价并不高。对于一棵完整的树,后剪枝要对所有只拥有叶节点的非叶节点进行遍历,如果某个非叶节点可以剪枝,还需要进一步考虑它的父节点。虽然在某些剪枝需求不大的情况下生成树后剪枝有不错的效果,但是我觉得生成中判断更加方便,而且不需要太多额外的代码。


9.试将4.4.2节对缺失值的处理机制推广到基尼指数的计算中去。

只需要把信息增益的公式换成基尼指数就行,包括扩展到连续参数,缺失参数,都是很直观的方法。


10.从网上下载或自己编程实现任意一种多变量决策树算法,并观察其在西瓜数据集3.0上产生的结果。

猜你喜欢

转载自blog.csdn.net/qq_30058597/article/details/78060898