详解决策树-剪枝十分钟机器学习系列笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解决策树-剪枝十分钟机器学习系列笔记相关的知识,希望对你有一定的参考价值。

 

决策树生成算法递归地产生决策树,直到不等你继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,模型结构过于复杂,即出现过拟合现象

直接来看优秀的决策树一般要求深度小、叶结点少

 

剪枝是我们常用来处理决策树的过拟合问题的手段,一般有预剪枝的后剪枝

预剪枝:生辰过程中,对每个节点划分前进行估计,若当前节点的划分不能提升泛化能力,则停止划分,记当前结点为叶结点

后剪枝:生成一颗完整的决策树之后,自底而上的对内部结点考察,若此内部节点变为叶结点,可以提升泛化能力,则做此替换

 

预剪枝

限定决策树的深度

 

 

通过ID3生成决策树

 

如果我们限定决策树的深度为2,那么我们需要对根蒂$\\rightarrow$色泽进行剪枝

其中符合纹理为清晰,根蒂为稍蜷缩的数据有

 

显然是否好瓜中,是为2个,否为1个,因此我们认为剪枝后的根蒂在稍蜷缩的情况下,对叶结点为好瓜,即新的决策树为

 

 

阈值

在决策树的生成中,我们就有提到阈值,其由$\\epsilon$限制

我们可以计算$D$下各个特征的信息增益

 

如果我们设定$\\epsilon =0.4$,显然在确定根节点的时候,没有任何一个特征符合要求,因此返回单结点树,又因为$D$上坏瓜数量多于好瓜,因此唯一叶结点为坏瓜

 

基于测试集上的误差率

测试集上的误差率:测试集中错误分类的实例占比

测试集上的准确率:测试集中正确分类的实例占比

 

 

先构建单结点树,由于训练集中好瓜有5个,坏瓜有5个,我们认为单结点树类标记为好瓜。对于测试集,好瓜有3个,坏瓜有4个,因此可计算误差率$\\beginaligned P=\\frac47\\endaligned$

再构建深度为1的树,计算最大信息增益,可得脐部为最大值,因此脐部作为根节点

 

 

与测试集对照,求得误差率$\\beginaligned P=\\frac27\\endaligned$

显然误差率小于单结点树,因此保留该结点

再构建深度为2的树

 

计算脐部凹陷的情况下最大信息增益,可得色泽为最大值,计算误差率$\\beginaligned P=\\frac37\\endaligned$,因此不保留该结点

计算脐部稍凹的情况下最大信息增益,可得根蒂为最大值,计算误差率$\\beginaligned P=\\frac27\\endaligned$,根据奥卡姆剃刀原理(模型越简单越好),因此不保留该结点

在脐部为平坦的情况下,全为坏瓜,根据ID3算法要求,因此该结点即为叶结点,标记为坏瓜

 

后剪枝

降低错误剪枝(REP)

原理:自下而上,使用测试集来剪枝。对每个结点,计算剪枝前和剪枝后的误判个数,若是剪枝有利于减少误判(包括相等的情况),则剪掉该结点所在分枝

有点类似于预剪枝中的基于测试集上的误差率剪枝

 

该方法受测试集影响大,如果测试集比训练集小很多,会限制分类的精度。

 

例:

 

根据ID3算法,可得决策树

 

该决策树深度为4,现在我们尝试剪枝深度为3。从测试集中找到脐部为稍凹,根蒂为稍卷曲,色泽为乌黑的样本,编号8、9符合要求。与训练集所得决策树相比较,可得误判个数为2。

剪掉纹理所在的枝条,根据训练集数据,对应样本(脐部为稍凹,根蒂为稍卷曲,色泽为乌黑),编号为7、15,好瓜数量为1,坏瓜数量为1,因此我们令该叶结点(脐部为稍凹,根蒂为稍卷曲,色泽为乌黑)为好瓜,可得新的决策树

 

在新的决策树下该结点(脐部为稍凹,根蒂为稍卷曲,色泽为乌黑)误判个数为1,因此符合剪枝要求,进行剪枝

按照此方法不断递归剪枝,最终可得符合条件的决策树

 

显然该决策树是由欠拟合倾向的

 

悲观错误剪枝(PEP)

原理:根据剪枝前后的错误率来决定是否剪枝。

和REP不同之处在于,PEP只需要训练集即可,不需要验证集,并且PEP是自上而下剪枝的

 

优点:不需要分离剪枝数据集,有利于实例较小的问题;误差使用了连续修正值,使得适用性更强;由于自上而下的剪枝策略,PEP效率更高

但仍然有可能会剪掉不应剪掉的枝条

 

步骤:

剪枝前

  1. 计算剪枝前目标子树每个叶结点的误差,并进行连续修正

       $$Error(Leaf_i)=\\fracerror(Leaf_i)+0.5N(T)$$

       > 其中$i$表示每个叶结点;$error_i(Leaf_i)$表示叶结点$Leaf_i$处误判的样本个数;$N(T)$表示的是总样本个数,剪谁,总样本就对应谁,不一定是整个$D$上的所有样本

       > 加0.5是为了连续型修正

       >

       > 作者:Dr_Janneil

       > 链接:从二项分布到正态分布的连续性修正 (qq.com)

      

       > 这里阐述不是很准确,建议结合例题看

      

  1. 计算剪枝前目标子树的修正误差

  $$Error(T)=\\sum\\limits_i=1^LError(Leaf_i)=\\frac\\sum\\limits_i=1^Lerror(Leaf_i)+0.5 \\times LN(T)$$

       > $L$表示叶结点个数

      

  1. 计算剪枝前目标子树误差个数的期望

       $$E(T)=N(T)\\times Error(T)=\\sum\\limits_i=1^Lerror(Leaf_i)+0.5\\times L$$

  1. 计算剪枝前目标子树误判个数的标准差

       $$std(T)=\\sqrtN(T)\\times Error(T)\\times (1-Error(T))$$

       > 根据我们现在已经得到的叶结点误差数据,如果要们要预测整个子树的误差数量,则可以由已知的数据构造二项分布,即

       > $$T \\sim B(np,np(1-p))$$

       > 其中$p=Error(T),n=N(T)$

      

  1. 计算剪枝前误判上限(即悲观误差)

       $$E(T)+std(T)$$

       这里的悲观误差是从期望上限来考虑的,那么我们这里只加了1个标准差

 

剪枝后

  1. 计算剪枝后该结点的修正误差

       $$Error(Leaf)=\\fracerror(Leaf)+0.5N(T)$$

  1. 计算剪枝后该结点误判个数的期望值

       $$E(leaf)=error(Leaf)+0.5$$

  1. 比较剪枝前后的误判个数,如果满足以下不等式,则剪枝;否则,不剪枝

       $$E(Leaf)<E(T)+std(T)$$

 

例:用PEP判断是否要剪枝

 

 

$$

\\beginaligned

Error(T)&=\\frac6+0.5 \\times 330= \\frac7.530\\

E(T)&=7.5\\

std(T)&=\\sqrt30 \\times \\frac7.530\\times (1- \\frac7.530)=2.37\\

Error(Leaf)&=\\frac13+0.530=\\frac13.530\\

E(Leaf)&=13.5\\

9.87&<13.5

\\endaligned

$$

不剪枝

 

最小误差剪枝(MEP)

原理:根据剪枝前后的最小分类错误概率例决定是否剪枝。自下而上剪枝,只需要训练集即可

 

在节点$T$处,计算出属于类别$k$的概率

$$

P_k(T)=\\fracn_k(T)+Pr_k(T)\\times mN(T)+m

$$

其中$N(T)$为该节点处总样本个数;$n_k(T)$为结点下属于类别$k$的样本个数;$Pr_k(T)$为类别$k$的先验;$m$是先验概率对后验概率的影响

 

 

在节点$T$处,计算出预测出错率

$$

Error(T)=\\min \\left1-P_k(T)\\right

$$

如果我们将节点$T$记为类别$k$,那么上式意味着不属于类别$k$的概率,代入$P_k(T)$

$$

Error(T)=\\min \\left\\fracN(T)-n_k(T)+m(1-Pr_k(T))N(T)+m\\right

$$

如果先验概率是确定的(一般,在无任何假设的情况下,我们通常假设各类别是等概率出现的,因此,先验概率为$\\beginaligned Pr_k(T)=\\frac1K\\endaligned$),那么该式就是以$m$作为变量的函数,我们可以通过计算

$$

\\mathop\\textargmin\\space\\limits_mError(T)

$$

来得到$m$。在这里为了演示MEP算法,假设$m=K$,$K$为类别的总个数,因此预测错误率可以写作

$$

Error(T)=\\fracN(T)-n_k(T)+K-1N(T)+K

$$

 

步骤

  1. 计算剪枝前目标子树每个叶结点的预测错误率

       $$Error(Leaf_i)=\\fracN(Leaf_i)-n_k(Leaf_i)+K-1N(Leaf_i)+K$$

       $N(Leaf_i)$代表叶结点处样本的总个数,$n_k(Leaf_i)$代表叶结点下属于$k$类的样本个数

  1. 计算剪枝前目标子树的预测错误率

       假设目标子树中一共有$L$个叶结点

$$Error(Leaf)=\\sum\\limits_i=1^L\\omega_iError(Leaf_i)=\\sum\\limits_i=1^L\\fracN(Leaf_i)N(T)Error(Leaf_i)$$

       这里$\\beginaligned \\omega_i=\\fracN(Leaf_i)N(T)\\endaligned$指每个叶子结点对应目标子树的权重

  1. 计算剪枝后目标子树的预测错误率

       $$Error(T)=\\fracN(T)-n_k(T)+K-1N(T)+K$$

  1. 比较剪枝前后的预测错误率,如果满足以下不等式,则剪枝;否则,不剪枝

       $$Error(T)<Error(Leaf)$$

 

例:通过MEP判断T4-T5是否可以剪枝

 

 

计算剪枝前目标子树每个叶结点的预测错误率

$$

\\beginaligned

Error(T7)&=\\fracN(T7)-n_7(T7)+K-1N(T7)+K=\\frac11-9+2-111+2=\\frac313\\

Error(T8)&=\\fracN(T8)-n_8(T8)+K-1N(T8)+K=\\frac9-8+2-19+2=\\frac211

\\endaligned

$$

计算剪枝前目标子树的预测错误率

$$

\\beginaligned

Error(Leaf)&=\\omega_7Error(T7)+\\omega_8Error(T8)\\

&=\\frac1120\\times \\frac313+ \\frac920\\times \\frac211\\

&=0.2087

\\endaligned

$$

计算剪枝后目标子树的预测错误率

$$

Error(T5)=\\fracN(T5)-n_5(T5)+K-1N(T5)+K=\\frac20-10+2-120+2=\\frac1122=0.5

$$

显然$0.2087<0.5$,因此不能剪枝

 

基于错误剪枝(EBP)

原理:根据剪枝前后的误判个数来决定是否剪枝。自下而上剪枝,只需要训练集即可

 

计算置信水平$\\alpha$下每个结点的误判上界

$$

U_\\alpha(e(T),N(T))=\\frace(T)+0.5+ \\fracq_\\alpha^22+ q_\\alpha\\sqrt\\frac(e(T)+0.5)(N(T)-e(T)-0.5)N(T)+ \\fracq_\\alpha^24N(T)+ q_\\alpha^2

$$

其中

$\\beginaligned Error(T)= \\frace(T)+0.5N(T)\\endaligned$,也就是误判率,$e(T)$代表样本的误判个数,$N(T)$代表样本总个数,$0.5$为连续型修正

$U_\\alpha(e(T),N(T))$表示在置信水平为$\\alpha$下的误差率上界

$\\beginaligned \\frac(e(T)+0.5)(N(T)-e(T)-0.5)N(T)=N(T)\\cdot \\frace(T)+0.5N(T)\\cdot \\fracN(T)-e(T)-0.5N(T)\\endaligned$表示二项分布里的方差,即$np(1-p)$,$p$为误判率

$\\beginaligned \\fracq_\\alpha^22\\endaligned$就是对方差的修正

$q_\\alpha$代表标准正态分布的上分位数,一般的上分位数我们可以通过查标准正态分布表得到。特殊的值我们可以找到周围的两个点,然后通过构建过已知两点的直线在估计中间的值。在该算法中(C4.5),$q_\\alpha$取$0.6925$,对应$\\alpha=0.75$

 

 

步骤:

  1. 计算剪枝前目标子树每个叶子结点的误判率上界

       $$U_CF(e(Leaf_i),N(Leaf_i))=\\frace(Leaf_i)+0.5+ \\fracq_\\alpha^22+ q_\\alpha\\sqrt\\frac(e(Leaf_i)+0.5)(N(Leaf_i)-e(Leaf_i)-0.5)N(Leaf_i)+ \\fracq_\\alpha^24N(Leaf_i)+ q_\\alpha^2$$

       设$L$代表子树上有$L$个叶结点,因此我们就要算$L$个误判率上界

  1. 计算剪枝前目标子树的误判个数上界

       $$E(Leaf)=\\sum\\limits_i=1^LN(Leaf_i)U_CF(e(Leaf_i),N(Leaf_i))$$

       这一步骤就是将每个叶子结点的个数乘以对应的误判率上界后求和,就得出了这棵子树上的误判个数上界。

  1. 计算剪枝后目标子树的误判率上界

       $$U_CF(e(T),N(T))=\\frace(T)+0.5+ \\fracq_\\alpha^22+ q_\\alpha\\sqrt\\frac(e(T)+0.5)(N(T)-e(T)-0.5)N(T)+ \\fracq_\\alpha^24N(T)+ q_\\alpha^2$$

  1. 计算剪枝后目标子树的误判个数上界

       $$E(T)=N(T)U_CF(e(T),N(T))$$

       只需要计算将目标子树替换成叶子结点后的误判率上界。

  1. 比较剪枝前后的误判个数上界,如果满足以下不等式,则剪枝;否则,不剪枝。

       $$E(T)<E(Leaf)$$

 

例:通过EBP判断$T$是否可以剪枝

 

计算剪枝前目标子树每个叶子结点的误判率上界

$$

\\beginaligned

U_CF(0,6)&=\\frace(Leaf_i)+0.5+ \\fracq_\\alpha^22+ q_\\alpha\\sqrt\\frac(e(Leaf_i)+0.5)(N(Leaf_i)-e(Leaf_i)-0.5)N(Leaf_i)+ \\fracq_\\alpha^24N(Leaf_i)+ q_\\alpha^2\\

&=\\frac0+0.5+ \\frac0.6925^22+0.6925\\sqrt\\frac(0+0.5)(6-0-0.5)6+ \\frac0.6925^246+0.6925^2\\

&=0.206\\

U_CF(0,9)&=0.143\\

U_CF(0,1)&=0.75

\\endaligned

$$

计算剪枝前目标子树的误判个数上界

$$

\\beginaligned

E(Leaf)&=\\sum\\limits_i=1^LN(Leaf_i)U_CF(e(Leaf_i),N(Leaf_i))\\

&=6 \\times 0.206+9\\times 0.143+1\\times 0.75\\

&=3.273

\\endaligned

$$

计算剪枝后目标子树的误判率上界

$$

U_CF(1,16)=0.157

$$

计算剪枝后目标子树的误判个数上界

$$

E(T)=N(T)U_CF(e(T),N(T))=16 \\times 0.157=2.512

$$

比较剪枝前后的误判个数上界,如果满足以下不等式,则剪枝;否则,不剪枝

$$

E(T)=2.512<3.273=E(Leaf)

$$

因此可以剪枝

以上是关于详解决策树-剪枝十分钟机器学习系列笔记的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记 | 机器学习 决策树

学习笔记 | 机器学习 决策树

机器学习笔记之三CART 分类与回归树

西瓜书决策树笔记

机器学习算法基础+实战系列决策树算法

机器学习实战精读--------决策树