决策树
决策树模型呈现树状结构,可以认为是一组if-then规则的集合。在决策树当中,内部接节点是属性或者特征,叶子节点是一个类。
一、三个阶段
决策树的学习分为了三个方面:特征选择、决策树的生成、决策树的剪枝pruning
二、详细解释
决策树的学习本质上是从训练集当中总结归纳出一组分类规则。这一组分类规则应该应该记尽量和训练数据集保持一致,同时也具有一定的泛化能力,也就是避免出现过拟合现象。
要找到最优决策树是一个NP完全问题,现实当中的决策树的训练采用的是启发式的方法,用这样的方法得到的一般是次优的决策树。
1、特征选择就是从现有特征集合当中选取一个,并且对当前的训练数据集进行划分,并且划分之后的子数据集都能有比较好的额分类效果的。然后再在每一个子数据集上递归进行这个特征选择的过程,知道满足停止条件。这实际上就是决策树生成的过程。
2、但是按照上面的方法生成的决策树可能在训练数据集上的效果比较好,但是在测试数据集上的效果泛化能力交叉。造成这种问题的原因实际上就是过拟合,说白了就是和训练数据集过于相似,模型当中设定的参数过多。所以在这种情况下就需要对模型进行简化,提高模型的泛化能力。这里所说的简化实际上就是pruning。
三、特征选择和决策树构建
1、如何判断一个一个特征对于数据集具有非常好的分类能力,我们直观的可以想到,使用这个特征的某种规则进行if-then的划分,所得到的子集合具有更加清晰的类别划分,也就是能够避免所有类别混杂不清的情况。这里说到了混杂不清,实际上在信息论当中有一个概念就是描述这种混乱情况的——熵。熵的定义:假设X为离散随机变量,X的取值为:
${x_{i},i=1,2,3,...,N}$ ———— (1)
并且我们知道,X的概率分布为
$P(X=x_{i})=p_{i},i=1,2,...,N$ ———— (2)
那么随机变量X的熵定义为
$H(X)=-\sum_{i=1}^{N}p_{i}logp_{i}$ ———— (3)
举个栗子可以有一个比较直观的理解,假设是两个类,上述公式,当两个类的概率相等时,熵值最大,函数曲线是一个开口向下的抛物线。
这里也是可以理解的,如果概率相等,那么说明分布式随机的,那么对于类别的区分能力也是可想而知的,或者说根本没有区分能力,因为大家都是在吃大锅饭,没有任何区别存在。
2、有了熵的定义,对于如何选择比较好的特征便顺理成章的来了,我们所有选择的好的特征应该具有最大限度减少这种熵值的能力。如何描述这种选择某种特征前后熵值的变化,这里需要定义另一个概念,叫做条件熵。所谓条件熵,是指在某一个随机变量取值确定的情况下,数据集的熵值情况。当中这里所说的熵值实际上是多个子数据集的熵值之和,因为一个随机变量很有可能有多个取值,因此每一个取值都会得到一个子数据集,在每一个子数据集上我们都会得到一个熵值,最后将这些熵值进行相加,这里的相加是带有权重的,这个被确定的随机变量的每一个取值所占的比重。形式化的定义如下。
$H(Y|X)=\sum_{i=1}^{N}p_{i}H(Y|X=x_{i})$ ———— (4)
放到这里我们可以得到信息增益的概念,所谓信息增益是指数据集D的经验熵与在特征A确定情况下的条件熵H(D|A)之差。
$g(D|A) = H(D) - H(D|A)$ ———— (5)
举个例子来说明一下,假设有一个对学生进行分类的数据统计,总共分为五类(A,B,C,D,E),对于一个学生的描述多项内容,也就是特征表示比如学生年龄$f_{1} \in {24,25,26}$,学生是否是班干$f_{2} \in {0,1}$,学生是否获得过奖学金$f_{3} \in {0,1}$,学生成绩等级$f_{4} \in {a,b,c,d}$,学生是否发了文章$f_{5} \in{a,b,c,d}$.
按照上面的条件上的定义是说某个变量确定,假设这里的变量时是否发了文章和文章的等级,总共有$a,b,c,d$四类,那么$H(D|A)$定义为
$H(D|A) = -(p(f_{5a}*H(f_{5a}))+p(f_{5b}*H(f_{5b}))+p(f_{5c}*H(f_{5c}))+p(f_{5d}*H(f_{5d})))$, ———— (6)
其中$(f_{5a}$表示当前数据集当中$f_{5}等于a的数据所占的比例$,$H(f_{5a})$表示满足$f_{5}等于a的数据所组成的子数据集的熵值,使用上面的公式(3)进行计算。
3、有了上面的信息增益的概念实际上,我们已经明白了特征选择和决策树构建算法的关键所在。
ID3算法使用了信息增益,C4.5算法使用信息增益比。
四、决策树的剪枝
五、CART算法
上面的决策树的构建每一个if-then可能是多个判断,因为一个天亮的取值可能有多个,CART树的特定是它是一个二叉树。
CART(classification and regression tree)
1、回归树
由于这里的变量是连续的,所以回归树的目标损失函数是要让最小二乘误差最小化,而不是前面的信息增益。注意这里的目标函数值也不是类别而是一个连续的数值。
根据上面的描述,这里的平方误差实际上是两部分,因为根据某一个变量将数据集划分为了两个子集,每一个子集都可以计算出来一个平方误差。假设选择的变量是$x_{j}$,选择的切分点是s
那么我们得到了两个子集
$SubSet_{1}(j,s)={x|x^{j}<=s}$, $SubSet_{2}(j,s)={x|x^{j}>s}$
则每一个子集上我们都可以计算最小二乘误差分别为 $LSE_{1},LSE_{2}$
我们是要找满足下面的$j,s$
$[j,s] =argmin_{j,s}(SubSet_{1}(j,s)+SubSet_{2}(j,s))$
这里实际上无法穷搜,因为任何一个变量都是连续的,取值范围是无穷多个,这里使用启发式的算法,我们随机生成多个binary test [j,s],也就是随机生成一个变量,然后随机生成一个这个变量范围之内的取值,然后使用这个binary test对数据集进行划分,并且计算相应的最小二乘平方误差。
选取其中最小者。
什么时候停止?
我们可以设定一个阈值,当最小平方误差,小于这个最小阈值的时候停下来,或者设定一个回归树的最大深度,当达到最大深度的时候停止算法的运行。那么这是在当前的节点上应该是有非常多样本实例,对这些样本实例的取值进行求平均,作为在这个叶子节点上的预测值。
2、分类树
再次回到离散数据分布的情况,这里的判定指标不是前面的信息增益,而是基尼指数。所谓一个数据集的基尼指数定义为如下
$Gini(D) = 1 - \sum_{i=1}^{C}p^{2}_{i}$
其中$p_{i},i=1,2,3,...,N$表示第i类在总数据集当中所占的比重。
3、CART树的剪枝
大体思想是构建非常多的子树序列,在通过交叉验证的方式选择其中最有的子树。
如何构造子树?这里是递归构造的。对于当前T,对于其中的每一个内部节点,计算
$g(t) = \frac{C(t)-C(T_{t})}{|T_{t}-1|}$,这里的$C(t)$表示如果这里是一个节点,也就进行剪枝,将它的所有子树当中的样本点进行汇总到这里,得到的在基尼指数或者平方误差,$C(T_{t})$表示尊重原本的子树划分方式,得到的在基尼指数或者平方误差。
选取具有最小上面取值的节点,进行pruning
原理是这样的:如果可以剪枝,说明在剪枝前后基尼指数或者平方误差不应该变化过大,并且这和样本个数成正比,所以除以了样本个数。
参考资料
[1] "统计学习方法",李航
posted on 2020-03-29 18:01 lightblueme 阅读(199) 评论(0) 编辑 收藏 举报