决策树
文章记录的内容是参加DataWhale的组队学习统计学习方法(第二版)习题解答过程中的笔记与查缺补漏!
参考解答地址:决策树。
1. 根据表5.1所给的训练数据集,利用信息增益比(C4.5算法)生成决策树。
解答思路:
- 列出C4.5的生成算法;
- 使用sklearn的DecisionTreeClassifier类构建决策树,并使用graphviz包展示,默认是Gini,这里可以作为自编程的验证;
- 通过自编程实现C4.5算法生成决策树,并进行特征选择。
先看看 C4.5 算法生成决策树的过程:
输入:训练数据集 ,特征集 阈值 ;
输出:决策树 。
(1)如果 中所有实例属于同一类 ,则置 为单结点树,并将 作为该结点的类,返回 ;
(2)如果 ,则置 为单结点树,并将中实例数最大的类 作为该结点的类,返回 ;
(3)否则,按式 计算 中各特征对 的信息增益比,选择信息增益比最大的特征 ;
(4)如果 的信息增益比小于阈值 ,则置 为单结点树,并将 中实例数最大的类 作为该结点的类,返回 ;
(5)否则,对 的每一可能值 ,依 将 分割为子集若干非空 ,将 中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 ,返回 ;
(6)对结点 ,以 为训练集,以 为特征集,递归地调用步(1)~步(5),得到子树 ,返回
其中一个比较重要的部分就是信息增益比的 的计算。于 ID3 算法不同,C4.5 使用的是信息增益比作为数据集划分时特征选择的准则(ID3 和 C4.5 的作者是同一个人,ID3 先于 C4.5 被提出,但是 ID4 被其他人占用了)。看一下信息增益比的计算方式:
其中 是信息增益, 是数据集 关于特征 的值的熵,即以 的值的不确定性,看看这两个值分别是怎么算的:
上式中 表示 类别为 的样本集合, 表示按照 的 个取值对 进行划分时的一个子集。 表示 对 的经验条件熵。
可以看到 和 很像,
- : 对 的经验条件熵,表示把 按照 的取值划分后的子集的熵,相当于只使用 来分类时的熵;
- : 关于 的值的熵,相当于把 当作数据集的标签后,再衡量 的熵。也可以看成衡量 中, 这个特征取值的不确定性,如果 的取值越多,则熵越大,可以避免信息增益中偏向特征取值多的问题。
具体的过程参考这里。注意 ID3 和 C4.5 是多叉树哦!
2. 已知如表5.2所示的训练数据,试用平方误差损失准则生成一个二叉回归树。
解答思路:
- 根据书中第81页平方误差损失准则,列出最小二乘回归树生成算法(算法5.5);
- 编写代码,实现算法,并用表5.2训练数据进行验证。
这里要求用决策树来解决一个回归问题。其实不管是分类问题还是回归问题,都遵循相似的过程:
- 指定一个特征选择的准则,停止条件;
- 给定一个数据集 ,特征集合;
- 通过准则找到一个特征,将 划分成多个小的数据集 ,并得到一个新的特征集合,新的特征集合去除了刚刚使用的特征;
- 回到第2步,直至满足停止条件。
CART(Classfication and Regression Tree)决策树的生成就是递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。
算法5.5(最小二乘回归树生成算法)
输入:训练数据集
输出:回归树
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树;
(1)选择最优切分变量与切分点,求解遍历变量,对固定的切分变量扫描切分点,选择使得上式达到最小值的对
(2)用选定的对划分区域并决定相应的输出值:(3)继续对两个子区域调用步骤(1),(2),直至满足停止条件
(4)将输入空间划分为个区域,生成决策树:
注意,在回归树中,每次特征选择不仅选择特征,还需在这个特征的取值中找到最优的切分点。在分类树中,选择完特征后,不一定要选择特征的切分点,如 ID3 和 C4.5 中,只是按照特征的取值对数据集进行划分,但是在 CART 中,也会选择特征的切分点(测试特征的每一个取值,按照是否将数据集划分成两部分)。
具体过程参考这里。
3. 证明 CART 剪枝算法中,当 确定时,存在唯一的最小子树 使损失函数 最小。
解答思路:
- 列出 CART 剪枝算法;
- 列出树的剪枝算法;
- 采用反证法,假设存在两棵子树使得损失函数最小。
既然要剪枝,那肯定是有一个是否剪枝的准则的,那就是决策树的损失。先介绍以下怎么衡量决策树的损失:
其中 是一棵决策树, 是 在训练数据上的误差, 表示决策树的叶节点数目, 是计算损失时的一个参数,用于权衡训练数据上的误差于模型复杂度的重要性。在剪枝的过程中,逐步测试每一个内部结点 ,在两种情况下计算 ,
- 以 作为根节点的子树 ,计算 ;
- 以 作为叶节点,即把 合并为一个叶节点,计算 。
注意此时 并未指定,因此对于每一个内部节点 都可以通过这样的方式求出 :
可以得到 ,选择所有最小的 中对应的内部节点,对其进行剪枝。这样我们就完成了一次剪枝,接下来就可以在剪枝后的树上继续剪枝了。
关于 CART 的剪枝,可以参考我的这篇博客:CART剪枝过程。
具体证明请参考这里。
4. 证明 CART 剪枝算法中求出的子树序列分别是区间的最优子树,这里。
解答思路:
- 对题目重新进行表述;
- 证明当 和 时的最优子树;
- 证明 为区间 的最优子树。
具体证明过程参考这里。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步