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

149 阅读9分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

视频作者:简博士 - 知乎 (zhihu.com)简博士的个人空间_哔哩哔哩_bilibili

链接:【合集】十分钟 机器学习 系列视频 《统计学习方法》_哔哩哔哩_bilibili

原书:《统计学习方法》李航

 

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

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

 

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

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

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

 

预剪枝

限定决策树的深度

![[附件/Pasted image 20221004165145.png|500]]

 

 

通过ID3生成决策树

![[附件/Pasted image 20221004165308.png|400]]

 

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

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

![[附件/Pasted image 20221004165455.png|500]]

 

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

![[附件/Pasted image 20221004165636.png|400]]

 

 

阈值

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

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

![[附件/Pasted image 20221004170113.png|200]]

 

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

 

基于测试集上的误差率

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

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

 

![[附件/Pasted image 20221004203939.png|500]]

 

先构建单结点树,由于训练集中好瓜有5个,坏瓜有5个,我们认为单结点树类标记为好瓜。对于测试集,好瓜有3个,坏瓜有4个,因此可计算误差率P=47\begin{aligned} P=\frac{4}{7}\end{aligned}

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

![[附件/Pasted image 20221004204520.png|300]]

 

![[附件/Pasted image 20221004204615.png|500]]

 

与测试集对照,求得误差率P=27\begin{aligned} P=\frac{2}{7}\end{aligned}

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

再构建深度为2的树

![[附件/Pasted image 20221004205204.png|500]]

 

计算脐部凹陷的情况下最大信息增益,可得色泽为最大值,计算误差率P=37\begin{aligned} P=\frac{3}{7}\end{aligned},因此不保留该结点

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

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

 

后剪枝

降低错误剪枝(REP)

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

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

 

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

 

例:

![[附件/Pasted image 20221004212023.png|500]]

 

根据ID3算法,可得决策树

![[附件/Pasted image 20221004212126.png|500]]

 

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

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

![[附件/Pasted image 20221004213205.png|400]]

 

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

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

![[附件/Pasted image 20221004213502.png|300]]

 

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

 

悲观错误剪枝(PEP)

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

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

 

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

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

 

步骤:

剪枝前

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

       Error(Leafi)=error(Leafi)+0.5N(T)Error(Leaf_{i})=\frac{error(Leaf_{i})+0.5}{N(T)}

       > 其中ii表示每个叶结点;errori(Leafi)error_{i}(Leaf_{i})表示叶结点LeafiLeaf_{i}处误判的样本个数;N(T)N(T)表示的是总样本个数,剪谁,总样本就对应谁,不一定是整个DD上的所有样本

       > 加0.5是为了连续型修正

       >

       > 作者:Dr_Janneil

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

      

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

      

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

  Error(T)=i=1LError(Leafi)=i=1Lerror(Leafi)+0.5×LN(T)Error(T)=\sum\limits_{i=1}^{L}Error(Leaf_{i})=\frac{\sum\limits_{i=1}^{L}error(Leaf_{i})+0.5 \times L}{N(T)}

       > LL表示叶结点个数

      

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

       E(T)=N(T)×Error(T)=i=1Lerror(Leafi)+0.5×LE(T)=N(T)\times Error(T)=\sum\limits_{i=1}^{L}error(Leaf_{i})+0.5\times L

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

       std(T)=N(T)×Error(T)×(1Error(T))std(T)=\sqrt{N(T)\times Error(T)\times (1-Error(T))}

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

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

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

      

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

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

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

 

剪枝后

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

       Error(Leaf)=error(Leaf)+0.5N(T)Error(Leaf)=\frac{error(Leaf)+0.5}{N(T)}

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

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

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

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

 

例:用PEP判断是否要剪枝

![[附件/Pasted image 20221005110750.png|300]]

 

 

Error(T)=6+0.5×330=7.530E(T)=7.5std(T)=30×7.530×(17.530)=2.37Error(Leaf)=13+0.530=13.530E(Leaf)=13.59.87<13.5 \begin{aligned} Error(T)&=\frac{6+0.5 \times 3}{30}= \frac{7.5}{30}\\ E(T)&=7.5\\ std(T)&=\sqrt{30 \times \frac{7.5}{30}\times (1- \frac{7.5}{30})}=2.37\\ Error(Leaf)&=\frac{13+0.5}{30}=\frac{13.5}{30}\\ E(Leaf)&=13.5\\ 9.87&<13.5 \end{aligned}

不剪枝

 

最小误差剪枝(MEP)

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

 

在节点TT处,计算出属于类别kk的概率

Pk(T)=nk(T)+Prk(T)×mN(T)+m P_{k}(T)=\frac{n_{k}(T)+Pr_{k}(T)\times m}{N(T)+m}

其中N(T)N(T)为该节点处总样本个数;nk(T)n_{k}(T)为结点下属于类别kk的样本个数;Prk(T)Pr_{k}(T)为类别kk的先验;mm是先验概率对后验概率的影响

 

如果m0,Pk(T)nk(T)N(T)\begin{aligned} m \to 0,P_{k}(T)\to \frac{n_{k}(T)}{N(T)}\end{aligned},意味着以后验概率为准

如果m,Pk(T)Prk(T)\begin{aligned} m \to \infty,P_{k}(T)\to Pr_{k}(T)\end{aligned},意味着以先验概率为准

 

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

Error(T)=min{1Pk(T)} Error(T)=\min \left\{1-P_{k}(T)\right\}

如果我们将节点TT记为类别kk,那么上式意味着不属于类别kk的概率,代入Pk(T)P_{k}(T)

Error(T)=min{N(T)nk(T)+m(1Prk(T))N(T)+m} Error(T)=\min \left\{\frac{N(T)-n_{k}(T)+m(1-Pr_{k}(T))}{N(T)+m}\right\}

如果先验概率是确定的(一般,在无任何假设的情况下,我们通常假设各类别是等概率出现的,因此,先验概率为Prk(T)=1K\begin{aligned} Pr_{k}(T)=\frac{1}{K}\end{aligned}),那么该式就是以mm作为变量的函数,我们可以通过计算

argmin mError(T) \mathop{\text{argmin}\space}\limits_{m}Error(T)

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

Error(T)=N(T)nk(T)+K1N(T)+K Error(T)=\frac{N(T)-n_{k}(T)+K-1}{N(T)+K}

 

步骤

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

       Error(Leafi)=N(Leafi)nk(Leafi)+K1N(Leafi)+KError(Leaf_{i})=\frac{N(Leaf_{i})-n_{k}(Leaf_{i})+K-1}{N(Leaf_{i})+K}

       N(Leafi)N(Leaf_{i})代表叶结点处样本的总个数,nk(Leafi)n_{k}(Leaf_{i})代表叶结点下属于kk类的样本个数

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

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

Error(Leaf)=i=1LωiError(Leafi)=i=1LN(Leafi)N(T)Error(Leafi)Error(Leaf)=\sum\limits_{i=1}^{L}\omega_{i}Error(Leaf_{i})=\sum\limits_{i=1}^{L}\frac{N(Leaf_{i})}{N(T)}Error(Leaf_{i})

       这里ωi=N(Leafi)N(T)\begin{aligned} \omega_{i}=\frac{N(Leaf_{i})}{N(T)}\end{aligned}指每个叶子结点对应目标子树的权重

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

       Error(T)=N(T)nk(T)+K1N(T)+KError(T)=\frac{N(T)-n_{k}(T)+K-1}{N(T)+K}

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

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

 

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

![[附件/Pasted image 20221005154405.png|300]]

 

 

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

Error(T7)=N(T7)n7(T7)+K1N(T7)+K=119+2111+2=313Error(T8)=N(T8)n8(T8)+K1N(T8)+K=98+219+2=211 \begin{aligned} Error(T7)&=\frac{N(T7)-n_{7}(T7)+K-1}{N(T7)+K}=\frac{11-9+2-1}{11+2}=\frac{3}{13}\\ Error(T8)&=\frac{N(T8)-n_{8}(T8)+K-1}{N(T8)+K}=\frac{9-8+2-1}{9+2}=\frac{2}{11} \end{aligned}

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

Error(Leaf)=ω7Error(T7)+ω8Error(T8)=1120×313+920×211=0.2087 \begin{aligned} Error(Leaf)&=\omega_{7}Error(T7)+\omega_{8}Error(T8)\\ &=\frac{11}{20}\times \frac{3}{13}+ \frac{9}{20}\times \frac{2}{11}\\ &=0.2087 \end{aligned}

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

Error(T5)=N(T5)n5(T5)+K1N(T5)+K=2010+2120+2=1122=0.5 Error(T5)=\frac{N(T5)-n_{5}(T5)+K-1}{N(T5)+K}=\frac{20-10+2-1}{20+2}=\frac{11}{22}=0.5

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

 

基于错误剪枝(EBP)

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

 

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

Uα(e(T),N(T))=e(T)+0.5+qα22+qα(e(T)+0.5)(N(T)e(T)0.5)N(T)+qα24N(T)+qα2 U_{\alpha}(e(T),N(T))=\frac{e(T)+0.5+ \frac{q_{\alpha}^{2}}{2}+ q_{\alpha}\sqrt{\frac{(e(T)+0.5)(N(T)-e(T)-0.5)}{N(T)}+ \frac{q_{\alpha}^{2}}{4}}}{N(T)+ q_{\alpha}^{2}}

其中

Error(T)=e(T)+0.5N(T)\begin{aligned} Error(T)= \frac{e(T)+0.5}{N(T)}\end{aligned},也就是误判率,e(T)e(T)代表样本的误判个数,N(T)N(T)代表样本总个数,0.50.5为连续型修正

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

(e(T)+0.5)(N(T)e(T)0.5)N(T)=N(T)e(T)+0.5N(T)N(T)e(T)0.5N(T)\begin{aligned} \frac{(e(T)+0.5)(N(T)-e(T)-0.5)}{N(T)}=N(T)\cdot \frac{e(T)+0.5}{N(T)}\cdot \frac{N(T)-e(T)-0.5}{N(T)}\end{aligned}表示二项分布里的方差,即np(1p)np(1-p)pp为误判率

qα22\begin{aligned} \frac{q_{\alpha}^{2}}{2}\end{aligned}就是对方差的修正

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

 

qαq_{\alpha}可能描述不对,但值是对的

 

步骤:

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

       UCF(e(Leafi),N(Leafi))=e(Leafi)+0.5+qα22+qα(e(Leafi)+0.5)(N(Leafi)e(Leafi)0.5)N(Leafi)+qα24N(Leafi)+qα2U_{CF}(e(Leaf_{i}),N(Leaf_{i}))=\frac{e(Leaf_{i})+0.5+ \frac{q_{\alpha}^{2}}{2}+ q_{\alpha}\sqrt{\frac{(e(Leaf_{i})+0.5)(N(Leaf_{i})-e(Leaf_{i})-0.5)}{N(Leaf_{i})}+ \frac{q_{\alpha}^{2}}{4}}}{N(Leaf_{i})+ q_{\alpha}^{2}}

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

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

       E(Leaf)=i=1LN(Leafi)UCF(e(Leafi),N(Leafi))E(Leaf)=\sum\limits_{i=1}^{L}N(Leaf_{i})U_{CF}(e(Leaf_{i}),N(Leaf_{i}))

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

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

       UCF(e(T),N(T))=e(T)+0.5+qα22+qα(e(T)+0.5)(N(T)e(T)0.5)N(T)+qα24N(T)+qα2U_{CF}(e(T),N(T))=\frac{e(T)+0.5+ \frac{q_{\alpha}^{2}}{2}+ q_{\alpha}\sqrt{\frac{(e(T)+0.5)(N(T)-e(T)-0.5)}{N(T)}+ \frac{q_{\alpha}^{2}}{4}}}{N(T)+ q_{\alpha}^{2}}

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

       E(T)=N(T)UCF(e(T),N(T))E(T)=N(T)U_{CF}(e(T),N(T))

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

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

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

 

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

![[附件/Pasted image 20221005172702.png|300]]

 

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

UCF(0,6)=e(Leafi)+0.5+qα22+qα(e(Leafi)+0.5)(N(Leafi)e(Leafi)0.5)N(Leafi)+qα24N(Leafi)+qα2=0+0.5+0.692522+0.6925(0+0.5)(600.5)6+0.6925246+0.69252=0.206UCF(0,9)=0.143UCF(0,1)=0.75 \begin{aligned} U_{CF}(0,6)&=\frac{e(Leaf_{i})+0.5+ \frac{q_{\alpha}^{2}}{2}+ q_{\alpha}\sqrt{\frac{(e(Leaf_{i})+0.5)(N(Leaf_{i})-e(Leaf_{i})-0.5)}{N(Leaf_{i})}+ \frac{q_{\alpha}^{2}}{4}}}{N(Leaf_{i})+ q_{\alpha}^{2}}\\ &=\frac{0+0.5+ \frac{0.6925^{2}}{2}+0.6925\sqrt{\frac{(0+0.5)(6-0-0.5)}{6}+ \frac{0.6925^{2}}{4}}}{6+0.6925^{2}}\\ &=0.206\\ U_{CF}(0,9)&=0.143\\ U_{CF}(0,1)&=0.75 \end{aligned}

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

E(Leaf)=i=1LN(Leafi)UCF(e(Leafi),N(Leafi))=6×0.206+9×0.143+1×0.75=3.273 \begin{aligned} E(Leaf)&=\sum\limits_{i=1}^{L}N(Leaf_{i})U_{CF}(e(Leaf_{i}),N(Leaf_{i}))\\ &=6 \times 0.206+9\times 0.143+1\times 0.75\\ &=3.273 \end{aligned}

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

UCF(1,16)=0.157 U_{CF}(1,16)=0.157

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

E(T)=N(T)UCF(e(T),N(T))=16×0.157=2.512 E(T)=N(T)U_{CF}(e(T),N(T))=16 \times 0.157=2.512

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

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

因此可以剪枝