详解决策树-剪枝十分钟机器学习系列笔记
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效率更高
但仍然有可能会剪掉不应剪掉的枝条
步骤:
剪枝前
- 计算剪枝前目标子树每个叶结点的误差,并进行连续修正
$$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)
> 这里阐述不是很准确,建议结合例题看
- 计算剪枝前目标子树的修正误差
$$Error(T)=\\sum\\limits_i=1^LError(Leaf_i)=\\frac\\sum\\limits_i=1^Lerror(Leaf_i)+0.5 \\times LN(T)$$
> $L$表示叶结点个数
- 计算剪枝前目标子树误差个数的期望
$$E(T)=N(T)\\times Error(T)=\\sum\\limits_i=1^Lerror(Leaf_i)+0.5\\times L$$
- 计算剪枝前目标子树误判个数的标准差
$$std(T)=\\sqrtN(T)\\times Error(T)\\times (1-Error(T))$$
> 根据我们现在已经得到的叶结点误差数据,如果要们要预测整个子树的误差数量,则可以由已知的数据构造二项分布,即
> $$T \\sim B(np,np(1-p))$$
> 其中$p=Error(T),n=N(T)$
- 计算剪枝前误判上限(即悲观误差)
$$E(T)+std(T)$$
这里的悲观误差是从期望上限来考虑的,那么我们这里只加了1个标准差
剪枝后
- 计算剪枝后该结点的修正误差
$$Error(Leaf)=\\fracerror(Leaf)+0.5N(T)$$
- 计算剪枝后该结点误判个数的期望值
$$E(leaf)=error(Leaf)+0.5$$
- 比较剪枝前后的误判个数,如果满足以下不等式,则剪枝;否则,不剪枝
$$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
$$
步骤
- 计算剪枝前目标子树每个叶结点的预测错误率
$$Error(Leaf_i)=\\fracN(Leaf_i)-n_k(Leaf_i)+K-1N(Leaf_i)+K$$
$N(Leaf_i)$代表叶结点处样本的总个数,$n_k(Leaf_i)$代表叶结点下属于$k$类的样本个数
- 计算剪枝前目标子树的预测错误率
假设目标子树中一共有$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$指每个叶子结点对应目标子树的权重
- 计算剪枝后目标子树的预测错误率
$$Error(T)=\\fracN(T)-n_k(T)+K-1N(T)+K$$
- 比较剪枝前后的预测错误率,如果满足以下不等式,则剪枝;否则,不剪枝
$$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$
步骤:
- 计算剪枝前目标子树每个叶子结点的误判率上界
$$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$个误判率上界
- 计算剪枝前目标子树的误判个数上界
$$E(Leaf)=\\sum\\limits_i=1^LN(Leaf_i)U_CF(e(Leaf_i),N(Leaf_i))$$
这一步骤就是将每个叶子结点的个数乘以对应的误判率上界后求和,就得出了这棵子树上的误判个数上界。
- 计算剪枝后目标子树的误判率上界
$$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$$
- 计算剪枝后目标子树的误判个数上界
$$E(T)=N(T)U_CF(e(T),N(T))$$
只需要计算将目标子树替换成叶子结点后的误判率上界。
- 比较剪枝前后的误判个数上界,如果满足以下不等式,则剪枝;否则,不剪枝。
$$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)
$$
因此可以剪枝
以上是关于详解决策树-剪枝十分钟机器学习系列笔记的主要内容,如果未能解决你的问题,请参考以下文章