Typesetting math: 100%

决策树

文章记录的内容是参加DataWhale的组队学习统计学习方法(第二版)习题解答过程中的笔记与查缺补漏!
参考解答地址决策树

1. 根据表5.1所给的训练数据集,利用信息增益比(C4.5算法)生成决策树。

解答思路

  1. 列出C4.5的生成算法;
  2. 使用sklearn的DecisionTreeClassifier类构建决策树,并使用graphviz包展示,默认是Gini,这里可以作为自编程的验证;
  3. 通过自编程实现C4.5算法生成决策树,并进行特征选择。

先看看 C4.5 算法生成决策树的过程:

输入:训练数据集 D,特征集 A 阈值 ϵ
输出:决策树 T
(1)如果 D 中所有实例属于同一类 Ck,则置 T 为单结点树,并将 Ck 作为该结点的类,返回 T
(2)如果 A=,则置 T 为单结点树,并将D中实例数最大的类 Ck 作为该结点的类,返回 T
(3)否则,按式 gR(D,A)=g(D,A)HA(D) 计算 A 中各特征对 D 的信息增益比,选择信息增益比最大的特征 Ag
(4)如果 Ag 的信息增益比小于阈值 ϵ,则置 T 为单结点树,并将 D 中实例数最大的类 Ck 作为该结点的类,返回 T
(5)否则,对 Ag 的每一可能值 ai,依 Ag=aiD 分割为子集若干非空 Di,将 Di 中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T,返回 T
(6)对结点 i,以 Di 为训练集,以 A{Ag} 为特征集,递归地调用步(1)~步(5),得到子树 Ti,返回 Ti

其中一个比较重要的部分就是信息增益比的 gR(D,A) 的计算。于 ID3 算法不同,C4.5 使用的是信息增益比作为数据集划分时特征选择的准则(ID3 和 C4.5 的作者是同一个人,ID3 先于 C4.5 被提出,但是 ID4 被其他人占用了)。看一下信息增益比的计算方式:

gR(D,A)=g(D,A)HA(D)

其中 g(D,A) 是信息增益,HA(D) 是数据集 D 关于特征 A 的值的熵,即以 A 的值的不确定性,看看这两个值分别是怎么算的:

(1)g(D,A)=H(D)H(DA)(2)=k=1K|Ck||D|log2|Ck||D|(i=1n|Di||D|H(Di))(3)=k=1K|Ck||D|log2|Ck||D|(i=1n|Di||D|k=1K|Dik||Di|log2|Dik||Di|)

上式中 Ck 表示 D 类别为 k 的样本集合,Di 表示按照 An 个取值对 D 进行划分时的一个子集。H(DA) 表示 AD 的经验条件熵。

HA(D)=i=1n|Di||D|log2|Di||D|

可以看到 H(DA)HA(D) 很像,

  • H(DA)AD 的经验条件熵,表示把 D 按照 A 的取值划分后的子集的熵,相当于只使用 A 来分类时的熵;
  • HA(D)D 关于 A 的值的熵,相当于把 A 当作数据集的标签后,再衡量 D 的熵。也可以看成衡量 D 中,A 这个特征取值的不确定性,如果 A 的取值越多,则熵越大,可以避免信息增益中偏向特征取值多的问题。

具体的过程参考这里。注意 ID3 和 C4.5 是多叉树哦!

2. 已知如表5.2所示的训练数据,试用平方误差损失准则生成一个二叉回归树。

解答思路

  1. 根据书中第81页平方误差损失准则,列出最小二乘回归树生成算法(算法5.5);
  2. 编写代码,实现算法,并用表5.2训练数据进行验证。

这里要求用决策树来解决一个回归问题。其实不管是分类问题还是回归问题,都遵循相似的过程:

  1. 指定一个特征选择的准则,停止条件;
  2. 给定一个数据集 D,特征集合;
  3. 通过准则找到一个特征,将 D 划分成多个小的数据集 Di,并得到一个新的特征集合,新的特征集合去除了刚刚使用的特征;
  4. 回到第2步,直至满足停止条件。

CART(Classfication and Regression Tree)决策树的生成就是递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。

算法5.5(最小二乘回归树生成算法)
输入:训练数据集D
输出:回归树f(x)
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树;
(1)选择最优切分变量j与切分点s,求解

minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]

遍历变量j,对固定的切分变量j扫描切分点s,选择使得上式达到最小值的对(j,s)
(2)用选定的对(j,s)划分区域并决定相应的输出值:

R1(j,s)={x|x(j)s},R2(j,s)={x|x(j)>s}c^m=1NmxiRm(j,s)yi,xRm,m=1,2

(3)继续对两个子区域调用步骤(1),(2),直至满足停止条件
(4)将输入空间划分为M个区域R1,R2,,RM,生成决策树:

f(x)=m=1Mc^mI(xRm)

注意,在回归树中,每次特征选择不仅选择特征,还需在这个特征的取值中找到最优的切分点。在分类树中,选择完特征后,不一定要选择特征的切分点,如 ID3 和 C4.5 中,只是按照特征的取值对数据集进行划分,但是在 CART 中,也会选择特征的切分点(测试特征的每一个取值,按照是否将数据集划分成两部分)。

具体过程参考这里

3. 证明 CART 剪枝算法中,当 α 确定时,存在唯一的最小子树 Tα 使损失函数 Cα 最小。

解答思路

  1. 列出 CART 剪枝算法;
  2. 列出树的剪枝算法;
  3. 采用反证法,假设存在两棵子树使得损失函数最小。

既然要剪枝,那肯定是有一个是否剪枝的准则的,那就是决策树的损失。先介绍以下怎么衡量决策树的损失:

Cα=C(T)+α|T|

其中 T 是一棵决策树,C(T)T 在训练数据上的误差,T 表示决策树的叶节点数目,α 是计算损失时的一个参数,用于权衡训练数据上的误差于模型复杂度的重要性。在剪枝的过程中,逐步测试每一个内部结点 t,在两种情况下计算 Cα

  1. t 作为根节点的子树 Tt,计算 Cα(Tt)=C(Tt)+α|Tt|
  2. t 作为叶节点,即把 Tt 合并为一个叶节点,计算 Cα(t)=C(t)+α|t|=C(t)+α

注意此时 α 并未指定,因此对于每一个内部节点 t 都可以通过这样的方式求出 α

Cα(Tt)=Cα(t)

可以得到 α=C(t)C(Tt)|Tt|1,选择所有最小的 α 中对应的内部节点,对其进行剪枝。这样我们就完成了一次剪枝,接下来就可以在剪枝后的树上继续剪枝了。

关于 CART 的剪枝,可以参考我的这篇博客:CART剪枝过程

具体证明请参考这里

4. 证明 CART 剪枝算法中求出的子树序列{T0,T1,,Tn}分别是区间α[αi,αi+1)的最优子树Tα,这里i=0,1,,n,0=α0<α1<,αn<+

解答思路

  1. 对题目重新进行表述;
  2. 证明当 α=0α=+ 时的最优子树;
  3. 证明 T1 为区间 [α1,α2) 的最优子树。

具体证明过程参考这里

posted @   Milkha  阅读(382)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示