决策树模型是一种描述对实例进行分类的树形结构,决策树由结点和有向边组成。其中结点有两种类型:内部结点和叶节点。内部结点表示一个特征或属性,叶节点表示一个类。
在分类问题中,就表示基于特征对实例进行分类的过程。用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果将实例分配到其子节点。每一个子节点对应着特征的一个取值。如此递归的对实例进行测试分配,直至达到叶节点,最后将实例分到叶节点的类中。决策树的主要优点是模型具有可读性、分类速度快。
它可以认为是if-else规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。学习时利用训练数据根据损失函数最小化的原则建立决策树模型,预测时,对新的数据利用决策树进行分类。
决策树学习通常包含3个步骤:1.特征选择 2.决策树的生成 3.决策树的修剪。
决策树还表示给定特征条件下类的条件概率分布,这一条件概率分布定义在特征空间的一个划分上,将特征空间划分为互不相交的单元区域,并在每个单元定义一个类的概率分布就构成了一个条件概率分布。决策树的一条路径对应于划分的一个单元。决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成。假设X为所表示特征的随机变量,Y为表示类的随机变量,那么这个条件概率分布可以表示为P(Y|X),X的取值范围为给定划分下单元的集合,Y取值于类的集合。
决策树学习的目标是根据给定的训练数据集合构建一个决策树模型,使它能够对实例进行正确的分类。
决策树学习的本质是从训练数据中归纳出一组分类规则,而与训练数据不相矛盾的决策树(即能够对训练数据进行正确分类的)可能有多个,也可能一个也没有。决策树学习是由训练数据集估计条件概率模型,我们选择的条件概率模型应该不仅对训练数据由很好的拟合,而且对未知数据由很好的预测(好的泛化能力)。
决策树学习的策略是以损失函数为目标函数的最小化,损失函数通常是正则化的极大似然函数。当损失函数确定以后,学习问题就变为在损失函数意义下选择最优决策树的问题。选择最优决策树是NP难问题,所以通常采用启发式方法,近似求解这一最优化问题,这样的得到的决策树是次最优的。
决策树学习算法通常是一个递归的选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个在当前条件下最好的分类。若这些子集已经能够被基本正确分类,就将这些分到所对应的叶节点中去,若还不能够正确分类,就对这些子集继续选择最优特征,对其进行分割构建相应的结点。如此递归下去,直至所有训练数据子集都被正确分类或者直到没有合适的特征为止。最后每个子集都被分到叶节点上有了明确的类别,就生成了一颗决策树。
构建树的停止条件:
1.当前结点所有样本都属于同一类别。
2.当前结点的所有属性值都相同,无法根据属性对数据进行划分。
3.结点为空。
但是这种方法可能会产生过拟合,我们需要对已经生成的树自下而上进行剪枝,去掉过于细分的叶节点,从而使它具有更好的泛化能力。如果特征数量很多,也可以在决策树学习开始的时候进行特征选择,只留下对训练数据有足够分类能力的特征。
决策树表示一个条件概率分布,深浅不同的决策树对应着不同复杂度的概率模型。决策树的生成只考虑局部最优对应于模型的局部选择,相对地,剪枝对应于模型的全局选择,考虑全局最优。
特征选择的准则是信息增益(ID3),信息增益比(C4.5)或基尼指数(CART)。特征选择是决定用哪个特征来划分特征空间,其准则是选择能够使各个子集在当前条件下具有最好的划分的特征,信息增益能够很好地表示这一直观的准则。
决策树学习应用信息增益准则选择特征,特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵与在给定特征A条件下D的经验条件熵H(D|A)之差,即:
而什么是熵呢?在信息论与概率统计中,熵是表示随机变量不确定性的度量,X是一个取值为有限个的离散随机变量,其概率分布为, 则随机变量X的熵的定义为:
熵取值越大,随机变量不确定性越大。熵取值越小,数据越纯。可以看出,当概率值都相等时,熵的取值最大,最不稳定。当概率取值时,熵的值为零。
条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性,定义为给定X条件下Y的条件概率分布的熵对X的数学期望:
而当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的就为经验熵与经验条件熵。
信息增益的解释:
信息增益表示得知特征X的信息而使得类Y的信息不确定减少的程度。一般地,熵H(Y)与条件熵H(Y|X)之差称为互信息,信息增益等价于训练数据集中类与特征的互信息。经验熵H(D)表示对数据集D进行划分的不确定性,而经验条件熵H(D|A)表示在特征A给定的条件下对数据集D进行分类的不确定性。所以它们的差,即信息增益就表示使用特征A对数据集D进行分类的不确定性减少的程度。所以我们就要选择能够使数据的不确定程度减少最多的特征,即信息增益最大的特征。显然,对于数据集D而言,不同的特征往往具有不同的信息增益,信息增益大的特征具有更强的分类能力。
算法2.1 :信息增益的算法:
(1)计算数据集D的经验熵H(D):
(2)计算特征A对数据集D的经验条件熵H(D|A):
(3)计算信息增益:
其中训练数据集为D,|D|为样本容量。设有K个类,为属于类的样本数。设特征A有n个不同的取值,根据特征A的取值将D划分为n个子集,为的样本的个数。记子集中属于类的样本的集合为,为的样本个数。
ID3算法的核心是在决策树的各个结点上应用信息增益准则选择特征,递归的构建决策树。具体为:从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为该节点的特征,根据该特征的不同区直建立子节点;在对子节点递归地调用以上方法,直到所有特征的信息增益均很小或者没有特征可以选择为止,最后得到一个决策树。ID3相当于用极大似然法进行概率模型的选择。
C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进。
以信息增益最为划分训练数据集的准则存在的问题?
信息增益偏向于选择取值较多的特征进行划分。比如学号这个特征,每个学生都有一个不同的学号,如果根据学号对样本进行分类,则每个学生都属于不同的类别,这样是没有意义的。
C4.5在生成过程中,用信息增益比来选择特征,可以校正这个问题。
特征A对训练数据集D的信息增益比定义为其信息增益g(D,A)与训练数据集D关于特征A的值的熵之比,即
其中,n是特征A取值的个数。(当特征A的取值越多时,特征A的熵越大)。
决策树生成算法递归地产生决策树,直到不能继续下去为止,这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,容易出现过拟合现象。原因在于学习时完全考虑的是如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。
解决这个问题的方法称为剪枝,即对已生成的树进行简化。具体地,就是从已生成的树熵裁剪掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点。
决策树的剪枝通过极小化损失函数整体来实现。设树T的叶节点个数为|T|,t是树T的叶节点,该叶节点上有个样本点,其中k类的样本点有个,k=1,2,...,K,为叶节点t上的经验熵,为参数,则决策树学习的损失函数可以定义为
其中经验熵为:
将中第一项记作,则.
是模型与训练数据的拟合程度,而表示模型复杂度。参数控制两者之间的影响,较大的促使选择较简单的模型,较小的促使选择较复杂的模型。
对于固定的,一定存在使得损失函数最小的子树,将其表示为。在损失函数最小的意义下是最优的。容易验证这样的子树是唯一的。当大时,最优子树偏小,相反,当小时,最优子树偏大。极端情况时,当=0时,整体树是最优的,即只考虑模型与训练数据的拟合程度,不考虑模型的复杂度。当时,根节点组成的单节点树是最优的。
该损失函数的极小化等价于正则化的极大似然估计。所以利用损失函数最小化原则进行剪枝就是用正则化的极大似然估计进行模型选择。
可以看出,决策树的生成只考虑了通过提高信息增益对训练数据进行更好的拟合,而剪枝通过优化损失函数还考虑了减小模型复杂度。
算法4.1:树的剪枝算法:
(1)根据生成的树T计算每个结点的经验熵。
(2)递归地从树的叶节点向上回缩。设一组叶节点回缩到其父结点之前与之后的整体树分别为和,其对应的损失函数分别是与,如果:
则进行剪枝,即将该父结点变为新的叶节点。
(3)返回(2),直至不能继续为止,得到损失函数最小的子树。
CART(classification and regression tree):分类与回归树,既可以用于分类也可以用于回归。
CART实在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。CART假设决策树是二叉树,这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
决策树的生成就是递归地构建二叉树的过程,对回归树用平方误差最小准则,对分类树用基尼指数最小化准则。在这里我将主要介绍分类树。对于给定的样本集合D,其基尼指数为:
Gini(D)表示集合D中随即变量的不确定性程度,其中是D中属于第k类的样本子集,K是类的个数。基尼指数越小表示数据的纯度越高,反之其值越大,样本集合的不确定性也就越大,与熵类似。当时,G(p)取得最大值,此时随机变量最不确定。
需要说明的是CART是个二叉树,也就是当使用某个特征划分样本集合只有两个集合:1. 等于给定的特征值 的样本集合D1 , 2 不等于给定的特征值 的样本集合D2,实际上是对拥有多个取值的特征的二值处理。
举个例子:
假设现在有特征 “学历”,此特征有三个特征取值: “本科”,“硕士”, “博士”,
当使用“学历”这个特征对样本集合D进行划分时,划分值分别有三个,因而有三种划分的可能集合,划分后的子集如下:
对于上述的每一种划分,都可以计算出基于 划分特征= 某个特征值 将样本集合D划分为两个子集的纯度:
因而对于一个具有多个取值(超过2个)的特征,需要计算以每一个取值作为划分点,对样本D划分之后子集的纯度Gini(D,Ai),(其中Ai 表示特征A的可能取值)。
然后从所有的可能划分的Gini(D,Ai)中找出Gini指数最小的划分,这个划分的划分点,便是使用特征A对样本集合D进行划分的最佳划分点。
算法5.1:CART生成算法
(1)计算现有特征对数据集的基尼指数,对每一个特征A,对其可能取的每个值a,计算A=a时的基尼指数。
(2)在所有可能的A以及它所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。根据其将数据分配到两个子节点中去。
(3)对两个子节点递归地调用(1)(2),直至满足停止条件。
算法的停止条件是节点中的样本个数小于阈值,或样本集的基尼指数小于预定阈值,或者没有更多的特征。
剪枝算法由两部组成:首先从生成算法产生的决策树底端开始不断剪枝,直到的根节点,形成一个子树序列,然后通过交叉验证法在独立的验证数据集上对子集序列进行测试,从中选择最优的子树。
1.剪枝:形成一个子树序列
剪枝的过程中,计算子树的损失函数:
T为任一子树,C(T)为对训练数据的预测误差。用递归的方式对树进行剪枝,将从小增大,,产生一系列的区间,i=0,1,...,n;对应着剪枝得到的最优子树序列,i=0,1,...,n。序列中的子树为嵌套的。
具体过程为,从整体树开始剪枝,对中的任意内部结点t,以t为单节点树的损失函数为:
而以t为根节点的子树的损失函数为:
当=0或充分小时,显然有不等式
当逐渐增大时,总有在某一个处有:
当继续增大时,不等式反向。所以当,与t有相同的损失函数值,而t有更少的节点数,所以t更可取,此时可以对进行剪枝。所以,我们对中的每一个内部结点t,计算,它表示剪枝后整体损失函数减少的程度。我们选择g(t)最小的结点t,在中减去该,,并对叶节点t以多数表决法决定其类,裁剪后的子树作为,同时将该g(t)设为,为的最优子树。如此剪枝下去,直到得到根节点。
2.在剪枝得到的子树序列中通过交叉验证选择最优子树.
利用独立的验证数据集,测试子树序列中各棵子树的平方误差或基尼指数,最小的决策树被认为是最优的决策树。而且由于每一个子树都对应着一个参数。所以当最优子树确定后,最优的参数也就确定了,从而得到最有决策树。