当前位置:文档之家› 决策树,生成剪枝,CART算法

决策树,生成剪枝,CART算法

决策树1. 原理1.1 模型简介决策树是一种基本的回归和分类算法。

在分类问题中,可以认为是一系列if-then 规则的几何。

决策树学通常包括三个步骤:特征选择,决策树的生成,决策树的修剪。

定义:决策树由结点和有向边组成,内部节点表示一个特征和属性,叶子结点表示一个类。

性质:决策树路径(或者对应的if-then 规则)具有互斥且完备性:每一个实例都被一条路径或规则所覆盖,而且只被这条路径或规则所覆盖。

决策树学习:能够正确对数据集进行分类的决策树可能有多个,也可能一个也没有,我们的目的是找到一个与训练数据集矛盾较小的,同时具有很好泛化能力的决策树。

特征选择:一种是在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征,一种是在学习过程中对训练数据分割成自己的时候,选择最优的特征进行分割。

决策树生成:一般这是一个递归的规程。

决策树的剪枝:提高决策树的泛化能力。

1.2 特征选择特征选择的准则一般是:信息增益和信息增益比1.2.1 信息增益a.信息增益:信息增益大的特征具有更强的分类能力,即选择信息增益值大的特征作为最优特征。

b.信息熵:表示变量的不确定性(在得知特征X 的信息时,使得Y 的信息不确定性减少的程度),熵越大,变量的不确定性越大。

设X 是一个取有限值的离散型随机变量,其概率分布为:()i i p X x p ==则随机变量X 的熵定义为:1()log ni i i H X p p ==-∑注:若p i =0,定义0log 00=。

其中若对数以2为底,熵的单位称为比特,若以e 为底,单位称为纳特。

c.条件熵:随机变量X 在给定条件下随机变量Y 的条件熵H (Y|X )表示:X 给定条件下Y 的条件概率分布的熵 关于X 的数学期望:1(|)(|)ni i i H Y X p H Y X x ===∑其中,()i i p X x p ==。

当熵和条件熵有数据估计(特别是极大似然估计)得到时,被分别称为经验熵和经验条件熵。

信息增益:特征A 对训练数据集D 的信息增益g(D|A)定义为:(,)()(|)g D A H D H D A =-其中,()H D 为集合D 的经验熵,(|)H D A 为特征A 给定条件下D 的经验条件熵。

d.信息增益的计算方法。

设:训练数据集D ,个数为|D|。

K 个类,分别为C k..每个类内个数|C k |根据特征A ,能够将训练集划分为n 个子集:D 1,D 2,…D n 。

|D I |为该子集的样本个数。

子集D i 中属于类C k 的个数|D ik |。

则计算信息增益的公式为:数据集D 的信息熵:i 1||||()log()||||k K K C C H D D D ==-∑特征A 对数据集D 的经验条件熵: 111||||||||(|)()log()||||||||nn K i i ik ik i i i k i i D D D D H D A H D D D D D =====∑∑∑ 注:此公式意义:在特征A 作用下,将数据集D 分为多个D i 。

这时关于D 的熵等于关于D i 熵的均值。

计算信息增益。

1.2.2 信息增益比(,)(,)()R A g D A g D A H D. 其中()A H D 表示特征集D 关于特征A 的值得熵。

1.3 决策树的生成1.3.1 ID3算法a.选取特征:信息增益准则b.算法终止条件:所有特征的信息增益均很小或者没有特征可以选择。

c.算法过程: Algorithm 1 ID3输入训练数据集D ,特征集A ,阈值E 输出决策树T 1:若D 中所有实例属于同一类C k ,则T 为单节点树,将C k 作为该结点类标记,返回T 。

2若A=∅,则T 为单节点树,将D 中实例数最多的类作为该结点类标记,返回T 。

3:否则,计算A 中各特征对D 的信息增益,选取信息增益最大的特征A g 。

4:如果特征A g 的信息增益小于E ,则T 为单结点树,将实例数最多的类作为该结点的类标记,返回T 。

5:否则,对A g 将训练集划分为多个D i ,创建子结点。

每个D i 中实例 数最多的类作为该子结点的类标记。

返回此时构建的树T 。

6: 对每一个子结点,以D i 为训练集,{A-A g }为特征集,递归调用上述5个步骤,得到字数T i ,返回T i .1.3.2 C4.5算法算法过程与ID3算法类似。

不同的是该算法将信息增益比作为特征选择的准则。

1.4 决策树剪枝原理:极小化决策树整体的损失函数。

方法:设:树T 的叶结点个数为|T|,T 是树T 的一个叶结点,并且包含N t 个样本点。

其中k 类的样本点个数为N tk 。

则,决策树的损失函数定义为:||a t 1()()||T t t C T N H T a T ==+∑其中,1()log()K tk tk t k t tN N H T N N ==-∑。

上式中,N t 的意义:假设我们最后的分类结果是为每个样本都分配了一个叶子节点,则此时的经验熵为0(1log1=0)。

然而极端情况基本是不存在的。

我们一般都会有类别数量的限制。

想像这样的一个情况,对于前i 个类我们为其每个分配一个样本,后面所有的样本归为一个类,此时损失可能比较小.但是这样的分类完全没有意义(单叶子节点过拟合,后面的欠拟合)。

所以在每个叶子节点的经验熵前面乘以一个系数N t 。

放大欠拟合部分的损失,以平衡损失函数。

当然如果仅仅这样做,并不能防止过拟合,还应该加上正则项来防止过拟合。

对于上式般令C (T )等于左边项,表示模型对训练数据的预测误差。

第二项为正则项,避免过拟合,|T|可以看做是对模型复杂度的度量。

树的剪枝算法:Algorithm 2 树的剪枝算法输入树T ,参数a 输出修剪后的决策树T 1:计算每个结点的经验熵 2 递归的从树的叶结点向上回缩,计算前后整体树的损失函数值,如果减小或相等则剪枝。

3: 返回2,直至不能继续为止1.4.1 REP(错误率降低剪枝) 上面所讲的方法叫做错误率降低剪枝该算法以bottom-up 的方式遍历所有的子树,对于完全决策树中的每一个非叶子节点的子树,我们尝试着把它替换成一个叶子节点,该叶子节点的类别我们用子树所覆盖训练样本中存在最多的那个类来代替,这样就产生了一个简化决策树,然后比较这两个决策树在测试数据集中的表现,如果简化决策树在测试数据集中的错误比较少,那么该子树就可以替换成叶子节点。

直至没有任何子树可以替换使得测试数据集的表现得以改进时,算法就可以终止。

1.4.2 PEP悲观错误剪枝该方法基于训练数据的误差评估,因此不用单独找剪枝数据集。

但训练数据也带来错分误差偏向于训练集,因此需要加入修正1/2。

是自上而下的修剪。

具有T个节点的树的误差率衡量为:其中,e(t)表示节点t之下的训练集的误判的个数。

N(t)表示节点t之下的训练集的总个数。

PEP算法流程:INOUT :TREEOUTPUT: PRUNING TREEPROCESS:For all nodes:自顶向下逐层遍历:If 剪枝前子树的错误数- 剪枝后叶子错误数>剪枝前分类错误个数的标准差删除该节点所在分支END FOR其中标准差的计算:子树的错误个数经过验证可以近似看成是二项分布,就可以根据二项分布的标准差公式算出标准差。

B(N,e)的二项分布,根据公式,均值为Ne,方差为Ne (1-e)。

N为子树样本总个数。

子树中有N的实例,就是进行N次试验,每次实验的错误的概率为e。

例子:那么根据e的公式e=(7+0.5×3)/ 16 = 8.5/16 = 0.53根据二项分布的标准差公式,标准差为(16×0.53×(1-0.53))^0.5 = 2.00子树的错误数为“所有叶子实际错误数+0.5调整值” =7 + 0.5×3 = 8.5把子树剪枝后,只剩下T4,T4的错误数为7+0.5=7.5这样, 8.5-2 < 7.5,因此不满足剪枝标准,不能用T4替换整个子树。

/p/794d08199e5e1.5 CART算法1.5.1 CART生成CART树假设决策树是二叉树。

剪枝标准同样是损失函数最小。

使用基尼系数选择最优特征,选择基尼系数小得特征作为最优特征。

假设有k 个类,则概率分布的基尼系数定义为:=1p (1)Kk k k G p p -∑()=二分类问题的概率分布基尼系数为:()2(1)G p p p =- (j )在决策树问题中,利用基尼系数进行特征选择的原理是:1212()()D D G G D G D D D+(D,A )=其中G(D 1),G(D 2)的计算方法利用式(j):来计算的。

Algorithm 3 CART 生成算法输入训练数据集D ,算法终止条件 输出CART 决策树T 1: 在每个结点处,计算现有特征A 对该数据集的基尼系数。

因为CART 是二叉树,然而有的特征却有多个值,根据A=a 可以将训练数据集分成两个不同的子集,应分别计算A=a 时的基尼系数2 在所有特征A 以及A 所有可能的切分点中,选择基尼系数最小的特征及此时A 的取值a 为最优的切分点,从此结点生成两个子结点,将数据集分到不同的子结点中去3:递归调用上述两个步骤,直到满足终止条件,返回决策树T算法终止条件是样本个数小于预定阈值或只有同一类,样本集的基尼系数小于预定阈值,没有更多特征。

1.5.2 CART 剪枝(代价复杂度剪枝ccp )剪枝的前提是剪枝后损失函数不增大:根据子树的损失函数公式:C a (T )=C (T )+a|T|其中,T 为任意子树,C (T )为对训练数据的预测误差(如基尼系数),|T|为树的叶结点个数,a>=0为参数,C a (T )为参数是a 时的子树T 的整体损失。

a 的意义在于权衡对训练数据的拟合程度与模型的复杂度。

cpp 主要思想,不同的a ,可剪枝的情况也不一样,所以该方法就是计算出所有不同的情况,然后利用交叉验证的方法来选择最优的模型。

对整体树T 的任意内部节点t,设以t 为单节点树的子树损失函数为:C a (t );且由损失函数公式得:C a (t )=C (t )+a ;以t 为根节点的子树T t 的损失函数为:C a(T t)=C(T t)+a|T t|易知:C a(T t)与C a(t)的大小关系关于a的形式为:当a等于0或者充分小时,C a(T t)<C a(t);当a增大到等于g(t)=C(t)−C(T t)时,C a(T t)=C a(t);|T t|−1当a继续增大,则有:C a(T t)>C a(t);关于统计学习方法这本书中P73页,g(t)表示剪枝后整体损失的减小程度,而我们每次剪枝反而是剪去g(t)最小的,解释:我们知道要想使剪枝后的损失减小,a的取值应该大于等于g(t),而我们剪枝的过程是需要满足a逐渐增大(一方面模拟下面算法中a逐渐增大的过程,以得到所有情况下的最有剪枝策略;随着a的不断增大,总会有一颗子树该剪枝,而其他子树不需要剪枝,这样随着a的增大,才会不断的剪枝,最后回溯到整棵树的根节点。

相关主题