习题
4.1
试证明对于不含冲突数据 (即特征向量完全相同但标记不同) 的训练集, 必存在与训练集一致 (即训练误差为 0)的决策树.
既然每个标记不同的数据特征向量都不同, 只要树的每一条 (从根解点到一个叶节点算一条) 枝干代表一种向量, 这个决策树就与训练集一致.
4.2
试析使用 "最小训练误差" 作为决策树划分选择准则的缺陷.
(4.1) 说明了如果数据不冲突, 可以完全拟合数据集, 这正是使用 "最小训练误差" 作为决策树划分选择准则的结果. 而这是绝对的过拟合.
4.3
试编程实现基于信息熵进行划分选择的决策树算法, 并为表 (4.3) 中数据生成一棵决策树.
4.4
试编程实现基于基尼指数进行划分选择的决策树算法, 为表 (4.2) 中数据生成预剪枝、后剪枝决策树, 并与未剪枝决策树进行比较.
4.5
试编程实现基于対率回归进行划分选择的决策树算法, 并为表 (4.3) 中数据生成一棵决策树.
4.6
试选择 (4) 个 (mathrm{UCI}) 数据集, 对上述 (3) 种算法所产生的未剪枝、预剪枝、后剪枝决策树进行实验比较, 并进行适当的统计显著性检验.
4.7
图 (4.2) 是一种递归算法, 若面临巨量数据, 则决策树的层数会很深, 使用递归方法易导致 "栈" 溢出. 试使用 "队列" 数据结构, 以参数 (MaxDepth) 控制树的最大深度, 写出与图 (4.2) 等价、但不使用递归的决策树生成算法.
伪代码:
# 输入: 训练集 D
# 属性集 A
array[0] = [D, A]
for D, A in array:
生成节点node;
if D中样本全属于同一类别C:
将node标记为C类叶节点
continue
elif A = 空 or D中样本在A上取值相同:
将node标记为叶节点, 其类别标记为D中样本数最多的类
continue
从A中选择最优划分属性a
for a_v in a每个取值:
为node生成一个分支, 令D_v表示D在a上取值为a_v的样本子集
if D_v == null:
将分支节点标记为叶节点, 其类别标记为D中样本最多的类
continue
elif
array.append([D_v, A {a}])
# 输出: 以node为根节点的一棵决策树
4.8*
试将决策树生成的深度优先搜索过程修改为广度优先搜索, 以参数 (MaxNode) 控制树的最大结点数, 将题 (4.7) 中基于队列的决策树算法进行改写. 对比题 (4.7) 中的算法, 试析哪种方式更易于控制决策树所需存储不超出内存.
(4.7) 其实已经是广度优先搜索了...
防止内存溢出就是要让深度优先搜索不要递归过深, 广度优先搜索不要太多结点在同一个深度, 因此如果树比较长, 建议用广度优先搜索, 如果树比较宽, 建议用深度优先搜索.
4.9
试将 (4.4.2) 节对缺失值的处理机制推广到基尼指数的计算中去.
(w_{oldsymbol{x}}) 是权值, 初始化为 (1) .
那么推广后的基尼指数为:
同时如果按某属性 (a) 划分, 那么某个缺失该属性的样本按照总体属性比例改变权值进入下一结点 (见书 (mathrm{P}88)).
4.10
从网上下载或自己编程实现任意一种多变量决策树算法, 并观察其在西瓜数据集 (3.0) 上产生的结果.