引言
本文是统计学习方法第二版的读书笔记。主要学习了决策树的生成算法。
决策树主要优点是模型具有可读性,分类速度快。
建议先看下机器学习入门——决策树图解(附代码)
决策树模型与学习
决策树模型
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部节点和叶节点。内部节点表示一个特征或属性,叶节点表示一个类。
上图是一个决策树的示意图,圆和方框分别表示内部结点和叶结点。
决策树与if-then规则
可以将决策树看成一个if-then规则的集合。由决策树的根节点到叶节点的每一条路径构建一条规则;路径上内部节点的特征对应着规则的条件,而叶节点对应着规则的结论。 决策树对应的if-then规则集合具有一个重要的性质:互斥并且完备。即每个实例都被一条规则所覆盖,而且只被一条规则所覆盖。覆盖是指实例的特征满足规则的条件。
决策树与条件概率分布
决策树还表示给定特征条件下类的条件概率分布。
上图(a)表示了特征空间的一个划分,1x1的大正方形表示特征空间。这个正方形被4个小矩形分隔,每个小矩形表示一个单元,也就是决策树的一个规则。取值为单元的集合,这里假设的取值为。小矩形中的数字表示单元的类。
当决策树满足上面这条规则时,得到的划分就如下图所示:
决策树学习
假设给定训练数据集
其中,为输入实例(特征向量),为特征个数,为类标记, ,为样本容量。
决策树学习的目标是根据给定的训练数据构建一个决策树模型,是它能够实例进行正确的分类。
决策树学习本质上是从训练数据中归纳出一组分类规则。能对训练数据进行正确分类的决策树可能有多个,也可能一个都没有。我们需要一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力。
决策树学习用损失函数表示这一目标。决策树学习的损失函数通常是正则化的极大似然函数。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。该过程对应着特征空间的划分,也对应着决策树的构建。
开始,构建根节点,将所有训练数据都放在根节点。选择一个最优特征,按照该特征将训练数据分隔成子集,使得各个子集有一个在当前条件下最好的分类。
若这些子集已经能被基本正确分类,那么构建叶节点,将这些子集分到所对应的叶节点中去; 如果还有子集不能被基本正确分类,那么针对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点。
如果递归地进行下去,直到所有训练数据子集都被基本正确分类,或没有适合的特征为止。这样就生成了一颗决策树。
以上方法生成的决策树可能对训练数据有很好的分类能力,但对未知的测试数据却未必有很好的分类能力,即可能发生过拟合现象。我们需要对已生成的树自下而上进行剪枝,将树变得更简单,从而使它具有更好的泛化能力。
如果特征数量很多,也可以在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。
可以看出,决策树学习算法包含特征选择、决策树的生成与决策树的剪枝过程。
决策树学习常用的算法有ID3、C4.5与CART。
特征选择
特征选择问题
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。通常特征选择的准则是信息增益或信息增益比。
下面通过一个例子来说明特征选择问题。下面是一个由15个样本组成的贷款申请训练数据。数据包含贷款申请人的4个特征:年龄,有3个可能值;有工作,有2个可能值;有自己的房子,有2个可能值;以及信贷情况,有3个可能值。
最后一列是类别,是否同意贷款。
希望通过所给的训练数据学习一个贷款申请的决策树,用来对未来的贷款申请进行分类,当新客户提出贷款申请时,根据申请人的特征利用决策树决定是否批准贷款申请。
首先要做的是特征选择,即决定用哪个特征来划分特征空间。直观上,如果一个特征具有更好的分类能力,按照这一特征将训练数据分割成子集,使得各个子集在当前条件下有最好的分类,那么就应该选择这个特征。信息增益(information gain)就能够很好地表示这一直观的准则。
信息增益
在信息论中,熵(entropy)表示随机变量不确定性的度量。设是一个取有限个值的离散随机变量,其概率分布为
则随机变量的熵定义为
在上式中,若,则定义。通常上式的对数以为底或以为底(自然对数),这时熵的单位为别称作比特或纳特。由定义可知,熵只依赖于的分布,而与的取值无关,所以也将的熵记为,即
熵越大,随机变量的不确定性越大。当随机变量只取两个值,例如时,即的分布为:
熵为
这时,熵随概率的曲线如图所示
当或时,随机变量完全没有不确定性。当时,,熵取最大值,随机变量不确定性最大。
条件熵表示在已知随机变量的条件下随机变量的不确定性。定义为给定条件下的条件概率分布的熵对的数学期望
这里
当熵和条件熵中的概率由极大似然估计得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。
信息增益表示得知特性的信息而使得类的信息不确定性减少的程度。
特征对训练数据集的信息增益定义为集合的经验熵与特征给定条件下的经验条件熵之差,即
一般地,熵与条件熵之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
给定训练集和特征,经验熵表示对数据集进行分类的不确定性。而经验条件熵表示在特征给定的条件下对数据集进行分类的不确定性。 那么它们的差,即信息增益,就表示由于特征而使得对数据集的分类的不确定性减少的程度。显然,信息增益依赖于特征,不同的特征往往具有不同的信息增益。信息增益大的特征具有更强的分类能力。
那么就得到根据信息增益准则的特征选择方法:对训练数据集(或子集),计算每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。
设训练数据集为,表示样本个数。设有个类,为属于类的样本个数,所有类别的样本个数之和等于样本总数,即。设特征有个不同的取值,根据特征的取值将划分为个子集,为的样本个数,有。 子集中属于类的样本集合为,为的样本个数。
于是就可以表示信息增益的算法了:
- 计算数据集的经验熵
- 计算特征对数据集的经验条件熵(其实就是的加权和)
- 计算信息增益
对例子中给出的训练数据集,根据信息增益准则来选择最优特征。
首先计算经验熵,根据每个类别的占比计算即可:
然后计算各特征对数据集的信息增益。分别以表示年龄、有工作、有自己的房子和信贷情况4个特征,分别是中(年龄)取值为青年、中年和老年的样本子集。
以为例,表示年龄取值为青年的情况
总共有5个,其中3个类别为否;2个类别为是。把样本子集代入公式中,得
哈哈,这里巧了,和是一样的,但是还要乘以一个权重,这个权重就是年龄为青年的样本数量占总样本数量的比重。这里是。
同理可以计算出和。
此时计算特征对数据集的信息增益就好理解了,为下式:
同理可计算
最后,比较各特征的信息增益。由于特征(有自己的房子)的信息增益最大,所以选择特征作为最优特征。
信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比(information gain ratio)可以对这一问题进行校正。这是特征选择的另一准则。
特征对训练数据集的信息增益比定义为其信息增益与训练数据集关于特征的值的熵之比,即
其中,,是特征的取值个数。
决策树的生成
ID3算法
输入:训练数据集,特征集阈值;
输出:决策树
- 若中所有实例属于同一类,则为单节点树,并将类作为该节点的类标记,返回;
- 若为空集,则为单节点树,并将中实例数最大的类作为该节点的类标记,返回;
- 否则,按上面介绍的算法计算中各特征对的信息增益,选择信息增益最大的特征;
- 如果的信息增益小于阈值(设置阈值防止分的过细),则置为单节点树,并将中实例数最大的类作为该节点的类标记,返回;
- 否则,对的每一可能值,依将分割为若干非空子集,将中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树,返回;
- 对第个子节点,以为训练集,以为特征集,递归地调用步1~5,得到子树,返回。
C4.5算法
C4.5算法除了在生成的过程中使用信息增益比来选择特征,其他过程和ID3算法是一样的。
在这两个算法中通过设定阈值来控制生成的树的深度或宽度,这种做法称为预剪枝。还有一种做法是生成决策树以后,再进行剪枝,叫做后剪枝。
决策树的剪枝
上面介绍的决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。 解决这个问题的办法是考虑降低决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中将已生成的树进行简化的过程称为剪枝。剪枝从已生成的树上裁掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数来实现。
决策树损失函数
其中
树的叶节点个数为,呢是树的叶节点,该叶节点有个样本点,其中类的样本点有个。为叶节点上的经验熵,为参数,是对树规模的一个惩罚。
表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,当叶子节点的熵越小,也就是损失越小,代表混乱程度越低,分类的时候越好分;
表示模型复杂度。当叶子节点数越大,说明决策树越复杂,泛化能力越差。较大的促使选择较简单的树。当意味着只考虑模型与训练数据的拟合程度,不考虑复杂度。
剪枝,就是当确定时,选择损失函数最小的模型。决策树生成算法学习局部的模型,而决策树剪枝学习整体的模型。
下面介绍剪枝算法。简单来说就是如果减去某个分支,使该分支变成叶子节点,得到的新树对应的损失函数更小,那么就可以剪枝,否则不能剪枝。
树的剪枝算法
- 计算每个节点的经验熵
- 递归地从树的根节点向上回缩
- 如果一组叶节点回缩到父节点之后和之前的整体树分别为与,对应的损失函数分别是与,若,则进行剪枝,将父节点变成新的叶节点
- 返回步骤2,直到不能继续为止,得到损失函数最小的子树
CART算法
分类与回归树(classification and regression tree,CART)模型是应用广泛的决策树学习方法。既可以用于分类也可以用于回归。
它生成的决策树是一颗二叉树。上面介绍的ID3算法和C4.5算法中,如果其中一个特征有多个(大于两个)类别,那么就要分多个分支。但是CART算法不管有多少个类别,只分成两部分。
还是以这个数据为例,如果以有工作这个特征来分,只有两个分支,是和否;但是如果以年龄来分,此时有三个分支了,要怎么分呢,其实很简单,可以左边分支是青年(或中年、老年),右边是非青年(或非中年、非老年)。只能从这个三个里面选择一种作为分类的依据,CART此时是通过基尼指数来判断选择哪个分支作为分类的依据。
基尼指数
分类问题中,假设有个类,样本点属于第个类的概率为,则概率分布的基尼指数定义为
这里用到了
对于二分类问题,若样本点属于第1个类的概率是,则概率分布的基尼指数为
对于给定的样本集合,其基尼指数为
如果样本集合根据特征是否取某一可能值被分割成和两部分,即
则在特征的条件下,集合的基尼指数定义为
基尼指数表示集合的不确定性,基尼指数表示经分割后集合的不确定性。基尼指数越大,不确定性就越大。
CART生成算法
根据训练数据集,从根节点开始,递归地对每个节点进行以下操作,构建二叉决策树:
- 设节点的训练数据集为,计算现有特征对该数据集的基尼指数。此时,对每个特征,对其可能取的每个值,根据样本点对的测试为“是”或“否”将分割为和两部分,利用式(5.15)计算时的基尼指数。
- 在所有可能的特征以及它们所有可能的切分点中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。根据最优特征和最优切分点,从现节点生成两个子节点,将训练数据集依特征分配到两个子节点中去。
- 对两个子节点递归地调用步骤1,2,直到满足停止条件
- 生成CART决策树
其中算法停止计算的条件是节点中的样本数小于预定阈值,或样本集的基尼指数小于预定阈值,或没有更多特征。
还是通过这个例子来熟悉一下吧,应用CART算法生成决策树。
和上文一样,分别以表示年龄、有工作、有自己的房子和信贷情况4个特征,并以表示年龄的值为青年、中年和老年,以表示有工作和有自己的房子的值为是和否,以表示信贷情况的值为非常好、好和一般。
先求特征的基尼指数
表示值为青年,以该值将数据集分为青年和非青年两部分。其中青年部分有5个样本,非青年部分有10个样本。在年龄为青年中类别为否的有3个;为是的有2个。 二在非青年中类别为是的有7个;为否的有3个。根据式(5.15)和式(5.13),得:
同理求得
由于和相等且最小,所以和都可以选作的最优切分点。
求特征和的基尼指数:
由于和只有一个切分点(它们都只能分出两个分支),所以它们就是最优切分点。
再求特征的基尼指数:
最小,所以为的最优切分点。
在几个特征中,最小,所以选择特征作为最优特征,作为最优切分点。
于是根节点生成两个子节点,一个是叶节点。
对另一个节点继续使用以上方法在中选择最优特征及其最优切分点,结果是。并且依据计算可知,所得节点都是叶节点。
参考
- 李航.统计学习方法第二版