第四章 决策树——章节练习

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

答:采用反证法。假设对于不含冲突数据的训练集,不存在与训练集一致的决策树,那么该决策树将至少在一个叶节点上存在无法划分的多个数据(若决策树与训练集一致,则每个数据都将对应一个叶节点),这与假设相矛盾,因此对于不含冲突数据(即特征向量完全相同但标记不同)的训练集,必存在与训练集一致(即训练误差为0)的决策树。

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

答:若以“最小训练误差法”作为决策树划分的依据,则意味着本决策树将尽力拟合训练集,但由于训练集和真实情况总是会存在一定偏差,这使得这样得到的决策树会存在过拟合的情况,对于未知的数据的泛化能力较差。因此最小训练误差不适合用来作为决策树划分的依据。

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

表4.3

由于我觉得英文比较好用(方便输入),因此将中文字符全换成了英文,是好瓜以1代替,是坏瓜以0代替,附在了我的码云仓库里(.csv文件)。

代码主要思路如下:

①定义可能用到的函数,如计算信息熵、信息增益、基尼系数等一系列的函数。

②通过比较按照各属性分类的信息增益或信息增益率或基尼系数,选择合适的分支节点(比较常用的是信息增益准则)。

③生成未剪枝决策树。(本题暂时生成未剪枝决策树,剪枝工作位于第四题)

④得到的决策树如下图所示:

选用信息熵进行划分的决策树  

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

基尼指数是选择分支节点的另一种方法,它反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此基尼指数越小,则数据的纯度越高

公式如下:

我们要做的就是在属性集合A中,选择那个使得划分后基尼指数最小的属性,作为最优划分属性,即

经过计算,得到的基于基尼指数的未剪枝决策树基本和上一题保持一致,接下来进行预剪枝工作。

预剪枝是在决策树生成过程中,在划分节点时,若该节点的划分没有提高其在训练集上的准确率,则不进行划分。进行预剪枝得到的决策树如下:

预剪枝决策树

我们发现相较于未剪枝决策树,预剪枝决策树的很多分支都没有展开,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但另一方面,有些分支的当前划分虽不能提升泛化性能,甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于"贪心"本质禁止这些分支展开, 给预剪枝决策树带来了欠拟含的风险。

后剪枝则是先从训练集生成一棵完整决策树,然后再考察验证集精度,决定是否删除该分支节点,经代码编写,得到的后剪枝决策树如下:

后剪枝决策树

对比预剪枝和后剪枝决策树可看出:后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。

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

对率回归即对数几率回归,在西瓜书的第三章有讲到,他是利用广义线性模型解决二分类任务的一种方法。对每个属性分别做对率回归,找到每个属性的最优划分,然后划分完后看划分后的错误,错的最少的就是最优的划分。

但是我想了很久,不知道该从何入手。。。这真不是很会。。

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

我选择的是Wine Data Set这个数据集,这个数据集共有大约180条数据,12种特征,其标签为1、2、3共三种(应该是三种酒吧)。我对数据的顺序进行了随机,取前140个数据作为训练集,后40个数据作为测试集,基于3.4题的代码,得到未剪枝、预剪枝、后剪枝决策树如下:

未剪枝决策树


预剪枝决策树


后剪枝决策树

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

主要思路每一次循环遍历一层下节点(除去叶节点),为每一个节点生成子节点,将非叶节点入队;用参数L保存每一层有多少个节点。下一次循环执行同样的步骤。直至所有的节点都叶节点,此时队列为空。

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

4.7写的算法就是广度优先搜索的。这道题将MaxNode改为MaxDepth,只需要改几个地方。有一点需要注意的地方,就是在给一个节点生成子节点时(19-32行),可能造成节点数大于最大值的情况,比如某属性下有3种取值,那么至少要生成3个叶节点,这个时候节点总数可能会超过最大值,这时最终节点数可能会是MaxNode+2。

至于两种算法对比。个人理解当数据特征值,各属性的取值较多时,形成的决策树会趋于较宽类型的树,这时使用广度优先搜索更容易控制内存。若属性取值较少时,深度优先搜索更容易控制内存。

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


使用书中式4.9、4.10、4.11有,对于原书中4.5式可以推广为:

码云仓库地址:Click Here

你可能感兴趣的:(第四章 决策树——章节练习)