决策树学习笔记
对于李航统计学习方法中决策树的学习想从一下几个角度进行整理:
1.决策树介绍
2.熵,信息增益,信息增益率,基尼指数
3.决策树的生成算法(ID3,C4.5,CART)
4.决策树的减枝
1.决策树介绍
1.1 决策树的模型:
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部节点和叶节点,内部节点表示一个特征或属性,叶节点表示一个类。分类的时候,从根节点开始,当前节点设为根节点,当前节点必定是一种特征,根据实例的该特征的取值,向下移动,直到到达叶节点,将实例分到叶节点对应的类中。
1.2 决策树分类的if-then规则
决策树的属性结构其实对应着一个规则集合:由决策树的根节点到叶节点的每条路径构成的规则组成;路径上的内部特征对应着if条件,叶节点对应着then结论。决策树和规则集合是等效的,都具有一个重要的性质:互斥且完备。也就是说任何实例都被且仅被一条路径或规则覆盖。
1.3 决策树学习
决策树的学习本质是归纳出一组分类规则,规则可能有多个,目的是为了获得一个与训练数据矛盾较小的树,同时有很好的泛化能力。从另一个角度看,学习也是基于训练数据集估计条件概率模型。
决策树的损失函数通常是正则化的极大似然函数,学习的策略是以损失函数为目标函数的最小化。从所有的决策树中选取最有决策树是NP问题,常采用启发式方法近似求解这一问题。(启发式的方法?SMO算法等,后期整理)
其对应的三个步骤:
- 特征选择
- 模型生成
- 决策树的剪枝
学习算法通常为递归选择最优特征、根据特征训练数据进行分割,使各个子集有一个最好分类过程,这一过程对应着特征空间的划分。开始,构建很结点,将所有训练数据都放在根结点中按照这一特征将训练数据些子集已经能够被基本正确分类,那么构建叶结点,并将这些自己分到所对应的叶结点中去:如果还有子集不能被基本正确分类,那么就对这些自己选择新的最优特征,继续对去进行分割,构建相应的结点。然后一直递归下去,知道所有训练数据子集被基本正确分类,或者没有合适的特征为止。
2.熵,信息增益,信息增益率
2.1 熵
熵表示随机变量不确定性的度量,熵越大,不确定性越大。对于一个可能有n中取值的随机变量X,其概率分布为:
其熵为:
由定义值,X的熵与X无关,只与分布有关,所以也可以将X的熵记作H(p),即:
设有随机变量(X,Y),其联合分布为:
条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性,定义为在X给定的条件下,Y的田间概率分布对X的数学期望:
这里,
当熵和条件熵中的概率由极大似然估计得到时,所对应的熵与条件熵分别称为经验熵和经验条件熵
2.2 信息增益
信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
定义:特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即:
给定数据集D和特征A,经验熵H(D)表示对数据集的不确定性。经验条件熵H(D|A)表示在特征A给定的条件下的数据集D进行分类的不确定性。此时信息增益表示由于特征A而使得对数据集D的分类的不确定性减少的程度,对于数据集D,信息增益大的特征具有更强的分类能力。
2.3 信息增益比
信息增益的值是相对于训练数据集而言的,当H(D)大的时候,信息增益值往往会偏大,这样对H(D)小的特征不公平。改进的方法是信息增益比。(比如说某些情况对人的身份证号,日期这些特征进行分类的时候,其H(D),和g(D|A)都比较大,但是对于这些特征进行分类显然是没有意义的,采用信息增益比相当于是对分支过多的情况进行惩罚)
3.决策树生成算法
3.1 ID3算法
从根节点开始,计算所有可能的特征的信息增益,选择信息增益最大的特征作为当前节点的特征(怎么进行选择,对每一个特征进行计算?是否对应于boosting tree中的exact greedy、approximate、weighted quantile sketch中选择划分点的方式一样?),由特征的不同取值建立空白子节点,对空白子节点递归调用此方法,直到所有特征的信息增益小于阀值或者没有特征可选为止。ID3相当于用极大似然法进行概率模型的选择。 (ID3的缺点是倾向于选取值较多的特征进行划分)
3.2 C4.5生成算法
C4.5在生成的过程中,用信息增益比来选择特征
决策树减枝
决策树很容易发生过拟合,过拟合的原因在于学习的时候过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法就是简化已生成的决策树,也就是剪枝。决策树对应模型的局部选择,减枝对应着模型全局选择。
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。
设决策树T的叶节点有|T|个,t是某个叶节点,t有Nt个样本点,其中归入k类的样本点有Ntk个,Ht(T)为叶节点t上的经验熵,α≥0为参数,则损失函数可以定义为:
其中经验熵Ht(T)为:
表示叶节点t所代表的类别的不确定性。损失函数对它求和表示所有被导向该叶节点的样本点所带来的不确定的和的和。我没有多打一个“的和”,第二个是针对叶节点t说的。
在损失函数中,将右边第一项记作:
则损失函数可以简单记作:
C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T|表示模型复杂度,参数α≥0控制两者之间的影响,α越大,模型越简单,α=0表示不考虑复杂度。
剪枝,就是当α确定时,选择损失函数最小的模型。子树越大C(T)越小,但是α|T|越大,损失函数反映的是两者的平衡。
决策树的生成过程只考虑了信息增益或信息增益比,只考虑更好地拟合训练数据,而剪枝过程则考虑了减小复杂度。前者是局部学习,后者是整体学习。
树的剪枝算法:从每个叶节点往上走,走了后如果损失函数减小了,则减掉叶节点,将父节点作为叶节点。如图:
新叶节点到底应该选择原来的叶节点中的哪一种类别呢?(极大似然估计法?)
3.3 CART算法
分类与回归树(CART)模型同样由特征选取、树的生成和剪枝组成,既可以用于分类也可以用于回归。CART假设决策树是二叉树,内部节点特征的取值为是和否,对应一个实例的特征是否是这样的。决策树递归地二分每个特征,将输入空间划分为有限个单元。
CART生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选取,生成二叉树。
3.3.1 回归树
回归树与分类树在数据集上的不同就是数据集的输出部分不是类别,而是连续变量。
假设输入空间已经被分为M个单元 ,分别对应输出值Cm,于是回归树模型可以表示为:
回归树的预测误差:
那么输出值就是使上面误差最小的值,也就是均值:
难点在于怎么划分,一种启发式的方法(暴力搜索):
遍历所有输入变量,选择第j个变量和它的值s作为切分变量和切分点,将空间分为两个区域:
然后计算两个区域的平方误差,求和,极小化这个和,具体的,就是:
当j最优化的时候,就可以将切分点最优化:
递归调用此过程,这种回归树通常称为最小二乘回归树
3.3.2 分类树
与回归树算法流程类似,只不过选择的是最优切分特征和最优切分点,并采用基尼指数衡量。基尼指数表达的是在一个样本集合中随机选中一个样本被分错的概率。基尼指数定义:
对于给定数据集D,其基尼指数是:
Ck是属于第k类的样本子集,K是类的个数。Gini(D)反应的是D的不确定性(与熵类似),分区的目标就是降低不确定性。
D根据特征A是否取某一个可能值a而分为D1和D2两部分:
则在特征A的条件下,D的基尼指数是:
设节点的当前数据集为D,对D中每一个特征A,对齐每个值a根据D中样本点是否满足A==a分为两部分,计算基尼指数。对所有基尼指数选择最小的,对应的特征和切分点作为最优特征和最优切分点,生成两个子节点,将对应的两个分区分配过去,然后对两个子节点递归。(基尼指数越小,数据的纯度越高)
CART减枝
在上面介绍的损失函数中,当α固定时,一定存在使得损失函数最小的子树,记为复杂度=Tα,α偏大Tα就偏小。设对α递增的序列,对应的最优子树序列为Tn,子树序列第一棵包含第二棵,依次类推。
从T0开始剪枝,对它内部的任意节点t,只有t这一个节点的子树的损失函数是:
以t为根节点的子树的损失函数是:
当α充分小,肯定有:
这个不等式的意思是复杂模型在复杂度影响力小的情况下损失函数更小。当α增大到某一点,这个不等式的符号会反过来。
只要 ,损失函数值就相同,但是t更小,所以t更可取,于是把Tt减枝掉,为此,对每一个t,计算
表示损失函数的减少程度,从T中剪枝掉g(t)最小的Tt,取新的
α=g(t),直到根节点。这样就得到了一个子树序列,对此序列用独立的验证数据集交叉验证,选取最优子树,减枝完毕。
两种剪枝策略的区别在哪儿?
对于第一中剪枝的方法,提前确定了α的值,即得到的最优子树是在给定值下的最优子树,有一种提前确定了树的复杂度。所以得到的不一定是模型的最优子树,对于第二种剪枝的方法,不断改变α的值,最后得到的模型比第一种模型更好?