决策树是一种基本的分类与回归方法。这里主要讨论决策树用于分类。
决策树模型是描述对样本进行分类的树形结构。树由结点和有向边组成:
决策树从根结点到子结点的的有向边代表了一条路径。决策树的路径是互斥并且是完备的。
用决策树分类时,对样本的某个特征进行测试,根据测试结果将样本分配到树的子结点上。此时每个子结点对应该特征的一个取值。
递归地对样本测试,直到该样本被划分叶结点。最后将样本分配为叶结点所属的类。
决策树的优点:可读性强,分类速度快。
决策树学习通常包括3个步骤:
决策树模型可以认为是if-then
规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
决策树将特征空间划分为互不相交的单元,在每个单元定义一个类的概率分布,这就构成了一个条件概率分布。
决策树的每一条路径对应于划分中的一个基本单元。
设某个单元 内部有 个样本点,则它定义了一个条件概率分布 。
单元上的条件概率偏向哪个类,则该单元划归到该类的概率较大。即单元的类别为:
决策树所代表的条件概率分布由各个单元给定条件下类的条件概率分布组成。
决策树的学习目标是:根据给定的训练数据集构造一个决策树模型,使得它能够对样本进行正确的分类。
决策树最优化的策略是:损失函数最小化。决策树的损失函数通常是正则化的极大似然函数。
选择最优决策树的问题是个 NP
完全问题。一般采用启发式方法近似求解这个最优化问题,这时的解为次最优的。
决策树学习的算法通常递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类。
这一过程对应着特征空间的划分,也对应着决策树的构建。
决策树生成算法:
构建根结点:将所有训练数据放在根结点。
选择一个最优特征,根据这个特征将训练数据分割成子集,使得各个子集有一个在当前条件下最好的分类。
如此递归下去,直至所有训练数据子集都被基本正确分类,或者没有合适的特征为止。
上述生成的决策树可能对训练数据有很好的分类能力,但是对于未知的测试数据却未必有很好要的分类能力,即可能发生过拟合的现象。
决策树的生成对应着模型的局部最优,决策树的剪枝则考虑全局最优。
如果学习任意大小的决策树,则可以将决策树算法视作非参数算法。但是实践中经常有大小限制(如限制树的高度、限制树的叶结点数量),从而使得决策树成为有参数模型。
特征选择的关键是:选取对训练数据有较强分类能力的特征。若一个特征的分类结果与随机分类的结果没有什么差别,则称这个特征是没有分类能力的。
通常特征选择的指标是:信息增益或者信息增益比。这两个指标刻画了特征的分类能力。
对于分布 ,熵为 。
定义数据集 的经验熵为: 。
其中:
样本的类别分别为 。
类别 的样本的数量为 ,所有样本的总数为 。
因此有: 。
是概率 的估计。
就是熵 的估计。它刻画了数据集 中样本的类别分布情况。
对于特征 ,定义数据集 在 上的经验熵为: 。
其中:
特征 的取值范围为 。
属性 的样本的数量为 。
因此有:
是概率 的估计。
刻画了数据集 中的样本在属性 上的取值分布情况。
对于特征 ,其条件熵为: 。
定义数据集 关于特征 的经验条件熵为:
其中:
属性 且类别为 的样本的数量为 ,所有样本的总数为 。
因此有: 。
是条件熵 的估计。它刻画了数据集 中,属性 中的那些样本中的类别的分布情况。
是条件熵 的估计。
特征 对训练数据集 的信息增益 定义为:集合 的经验熵 与关于特征 经验条件熵 之差。即: 。
由于熵 也称作互信息,因此信息增益也等于训练数据集中类与特征的互信息。
决策树学习可以应用信息增益来选择特征。给定训练集 和特征 :
不同的特征往往具有不同的信息增益。
以信息增益作为划分训练集的特征选取方案,存在偏向于选取值较多的特征的问题。
公式 中:
当极限情况下 ,特征 在每个样本上的取值都不同,即 。
此时特征 将每一个样本都划分到不同的子结点。即: 。
由于 ,因此有: 。
即: 取值为 0 或者 1 。因此有: 。
最终使得 。
条件熵的最小值为 0,这意味着该情况下的信息增益达到了最大值。
然而很显然这个特征 显然不是最佳选择,因为它并不具有任何分类能力。
可以通过定义信息增益比来解决该问题。
特征 对训练集 的信息增益比 定义为:信息增益 与关于特征 的熵 之比:
表征了特征 对训练集 的拆分能力。
因为 只考虑样本在特征 上的取值,而不考虑样本的标记 ,所以这种拆分并不是对样本的分类。
信息增益比本质上是对信息增益乘以一个加权系数:
决策树有两种常用的生成算法:
ID3
生成算法。C4.5
生成算法。ID3
生成算法和 C4.5
生成算法只有树的生成算法,生成的树容易产生过拟合:对训练集拟合得很好,但是预测测试集效果较差。
ID3
生成算法核心是在决策树的每个结点上应用信息增益准则选择特征,递归地构建决策树。
从根结点开始,计算结点所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征划分出子结点。
再对子结点递归地调用以上方法,构建决策树。
直到所有特征的信息增益均很小或者没有特征可以选择为止,最后得到一个决策树 。
如果不设置特征信息增益的下限,则可能会使得每个叶子都只有一个样本点,从而划分得太细。
ID3
生成算法:
输入:
输出:决策树
算法步骤:
若 中所有样本均属于同一类 ,则 为单结点树,并将 作为该结点的类标记,算法终止。
若 ,则 为单结点树,将 中样本数最大的类 作为该结点的类标记,算法终止。
否则计算 ,选择信息增益最大的特征 :
若 ,则置 为单结点树,将 中样本数最大的类 作为该结点的类标记,算法终止 。
若 ,则对 特征的每个可能取值 ,根据 将 划分为若干个非空子集 。
将 中样本数最大的类作为该子集的标记,构建子结点。
对第 个子结点, 以 为训练集, 以 为特征集,递归地调用前面的步骤来构建子树。
C4.5
生成算法与 ID3
算法相似,但是 C4.5
算法在生成过程中用信息增益比来选择特征。决策树生成算法生成的树往往对于训练数据拟合很准确,但是对于未知的测试数据分类却没有那么准确。即出现过拟合现象。
过拟合产生得原因是决策树太复杂。解决的办法是:对决策树剪枝,即对生成的决策树进行简化。
决策树的剪枝是从已生成的树上裁掉一些子树或者叶结点,并将根结点或者其父结点作为新的叶结点。
剪枝的依据是:极小化决策树的整体损失函数或者代价函数。
决策树生成算法是学习局部的模型,决策树剪枝是学习整体的模型。即:生成算法仅考虑局部最优,而剪枝算法考虑全局最优。
设树 的叶结点个数为 。设 为树的叶结点,该叶结点有 个样本点,其中属于 类的样本点有 个, 。
这意味着: 。
令 为叶结点 上的经验熵,令 为参数,则决策树 的损失函数定义为:
其中: 。
令 ,则: 。
其中 为正则化项, 表示预测误差。
意味着 ,即每个结点 内的样本都是纯的,即单一的分类。
决策树划分得越细致,则 的叶子结点越多。当叶结点的数量等于样本集的数量时,树 的每个叶子结点只有一个样本点。此时每个叶结点内的样本都是纯的,从而 。
这样的决策树其实是没有什么实用价值的,所以必须使用正则化项来约束决策树的复杂程度。
参数 控制预测误差与模型复杂度之间的关系。
决策树剪枝的准则是:考虑当 确定时, 最小化。这等价于正则化的极大似然估计。
决策树的剪枝算法:
输入:
输出: 修剪后的决策树
算法步骤:
对树 每个结点 ,计算其经验熵 。
递归地从树的叶结点向上回退:
设一组叶结点回退到父结点之前与之后的整棵树分别为 与 ,对应的损失函数值分别为 与 。若 , 则进行剪枝,将父结点变成新的叶结点。
递归回退直到不能继续为止,得到损失函数最小的子树 。
CART:classfification and regression tree
:学习在给定输入随机变量 条件下,输出随机变量 的条件概率分布的模型。
CART
假设决策树是二叉树:
是
与 否
。其中:左侧分支取 是
,右侧分支取 否
。CART
树与ID3
决策树和 C4.5
决策树的重要区别:
CART
树是二叉树,而后两者是N
叉树。
由于是二叉树,因此 CART
树的拆分不依赖于特征的取值数量。因此CART
树也就不像ID3
那样倾向于取值数量较多的特征。
CART
树的特征可以是离散的,也可以是连续的。
而后两者的特征是离散的。如果是连续的特征,则需要执行分桶来进行离散化。
CART
树处理连续特征时,也可以理解为二分桶的离散化。
CART
算法分两步:
CART
生成算法有两个生成准则:
CART
回归树:用平方误差最小化准则。CART
分类树:用基尼指数最小化准则。一棵CART
回归树对应着输入空间的一个划分,以及在划分单元上的输出值。
设输出 为连续变量,训练数据集 。
设已经将输入空间划分为 个单元 ,且在每个单元 上有一个固定的输出值 。则CART
回归树模型可以表示为:
其中 为示性函数。
如果已知输入空间的单元划分,基于平方误差最小的准则,则CART
回归树在训练数据集上的损失函数为:
根据损失函数最小,则可以求解出每个单元上的最优输出值 为 : 上所有输入样本 对应的输出 的平均值。
即: ,其中 表示单元 中的样本数量。
定义 上样本的方差为 ,则有: 。则CART
回归树的训练集损失函数重写为: ,其中 为训练样本总数。
定义样本被划分到 中的概率为 ,则 。由于 是个常数,因此损失函数重写为:
其物理意义为:经过输入空间的单元划分之后,CART
回归树的方差,通过这个方差来刻画CART
回归树的纯度。
问题是输入空间的单元划分是未知的。如何对输入空间进行划分?
设输入为 维: 。
然后寻求最优切分变量 和最优切分点 。即求解:
其意义为:
首先假设已知切分变量 ,则遍历最优切分点 ,则到:
其中 和 分别代表区域 和 中的样本数量。
然后遍历所有的特征维度,对每个维度找到最优切分点。从这些(切分维度,最优切分点)
中找到使得损失函数最小的那个。
依次将输入空间划分为两个区域,然后重复对子区域划分,直到满足停止条件为止。这样的回归树称为最小二乘回归树。
CART
回归树生成算法:
输入:
输出: CART
回归树
步骤:
选择最优切分维度 和切分点 。
即求解:
用选定的 划分区域并决定响应的输出值:
其中 和 分别代表区域 和 中的样本数量。
对子区域 递归地切分,直到满足停止条件。
最终将输入空间划分为 个区域 ,生成决策树: 。
CART
分类树采用基尼指数选择最优特征。
假设有 个分类,样本属于第 类的概率为 。则概率分布的基尼指数为:
基尼指数表示:样本集合中,随机选中一个样本,该样本被分错的概率。基尼指数越小,表示越不容易分错。
样本被选错概率 = 样本被选中的概率 * 样本被分错的概率 。
对于给定的样本集合 ,设属于类 的样本子集为 ,则样本集的基尼指数为:
其中 为样本总数, 为子集 的样本数量。
对于最简单的二项分布,设 ,则其基尼系数与熵的图形见下图。
可以看到基尼系数与熵一样,也是度量不确定性的度量。
对于样本集 , 越小,说明集合中的样本越纯净。
若样本集 根据特征 是否小于 而被分为两个子集: 和 ,其中:
则在特征 的条件下,集合 的基尼指数为:
其中 为样本总数, 分别子集 的样本数量。它就是每个子集的基尼系数的加权和,权重是每个子集的大小(以子集占整体集合大小的百分比来表示)。
一棵CART
分类树对应着输入空间的一个划分,以及在划分单元上的输出值。
设输出 为分类的类别,是离散变量。训练数据集 。
设已经将输入空间划分为 个单元 ,且在每个单元 上有一个固定的输出值 。则CART
分类树模型可以表示为:
其中 为示性函数。
如果已知输入空间的单元划分,基于分类误差最小的准则,则CART
分类树在训练数据集上的损失函数为:
根据损失函数最小,则可以求解出每个单元上的最优输出值 为 : 上所有输入样本 对应的输出 的众数。
即: 。
问题是输入空间的单元划分是未知的。如何对输入空间进行划分?
类似CART
回归树,CART
分类树遍历所有可能的维度 和该维度所有可能的取值 ,取使得基尼系数最小的那个维度 和切分点 。
即求解: 。
CART
分类树的生成算法:
输入:
输出: CART
决策树
步骤:
选择最优切分维度 和切分点 。
即求解: 。
它表示:遍历所有可能的维度 和该维度所有可能的取值 ,取使得基尼系数最小的那个维度 和切分点 。
用选定的 划分区域并决定响应的输出值:
其中 和 分别代表区域 和 中的样本数量。
对子区域 递归地切分,直到满足停止条件。
最终将输入空间划分为 个区域 ,生成决策树: 。
CART
分类树和CART
回归树通常的停止条件为:
前面讨论的CART
分类树和CART
回归树都假设特征均为连续值。
实际上CART
树的特征可以为离散值,此时切分区域定义为:
连续的特征也可以通过分桶来进行离散化,然后当作离散特征来处理。
CART
树的剪枝是从完全生长的CART
树底端减去一些子树,使得CART
树变小(即模型变简单),从而使得它对未知数据有更好的预测能力。定义CART
树 的损失函数为(): 。其中:
对固定的 ,存在使 最小的子树,令其为 。可以证明 是唯一的。
令从生成树 开始剪枝。对 任意非叶结点 ,考虑:需不需要对 进行剪枝?
可以证明:
令 ,此时 与 有相同的损失函数值,但是 的结点更少。
因此 比 更可取,于是对 进行剪枝。
对 内部的每一个内部结点 ,计算 。
它表示剪枝后整体损失函数增加的程度(可以为正,可以为负)。则有:
因为 是个内部结点,所以 ,因此有:
对 内部的每一个内部结点 ,计算最小的 :
设 对应的内部结点为 ,在 内减去 ,得到的子树作为 。
令 ,对于 ,有: 。
对于 ,有:
对于 剪枝,得到的子树的损失函数一定是减少的。
它也是所有内部结点剪枝结果中,减少的最多的。因此 是 内的最优子树。
对任意一个非 内部结点的剪枝,得到的子树的损失函数有可能是增加的,也可能是减少的。
如果损失函数是减少的,它也没有 减少的多。
如此剪枝下去,直到根结点被剪枝。
上述剪枝的思想就是用递归的方法对树进行剪枝:计算出一个序列 ,同时剪枝得到一系列最优子树序列 是 时的最优子树。
上述剪枝的结果只是对于训练集的损失函数较小。
需要用交叉验证的方法在验证集上对子树序列进行测试,挑选中出最优子树。
交叉验证的本质就是为了挑选超参数 。
验证过程:用独立的验证数据集来测试子树序列 中各子树的平方误差或者基尼指数。
由于 对应于一个参数序列 ,因此当最优子树 确定时,对应的区间 也确定了。
CART
剪枝由两步组成:
从生成算法产生的决策树 底端开始不断的剪枝:
用交叉验证的方法在独立的验证集上对子树序列进行测试,挑选中出最优子树。
CART
剪枝算法:
输入:CART
算法生成的决策树
输出: 最优决策树
算法步骤:
初始化:
自下而上的对各内部结点 计算 : 。
自下而上地访问内部结点 : 若有 ,则进行剪枝,并确定叶结点 的输出,得到树 。
令 。
若 不是由根结点单独构成的树,则继续前面的步骤。
采用交叉验证法在子树序列 中选取最优子树 。
CART
剪枝算法的优点是:不显式需要指定正则化系数 。
CART
剪枝算法自动生成了一系列良好的超参数 ,然后利用验证集进行超参数选择。
虽然传统剪枝算法也可以用验证集来进行超参数选择,但是CART
剪枝算法的效率更高。
因为CART
剪枝算法只需要搜索超参数 的有限数量的区间即可,而传统剪枝算法需要搜索整个数域 。
现实学习任务中常常会遇到连续属性,此时可以使用连续属性离散化技术将连续特征转换为离散特征。
最常用的离散化技术为二分法bi-partition
:
给定样本集 和连续属性 ,假设该属性在 中出现了 个不同的取值。
将这些值从小到大进行排列,记作 。
选取 个划分点,依次为: 。
然后就可以像离散属性值一样来考察这些划分点,选取最优的划分点进行样本集和的划分。
这也是 C4.5
算法采取的方案。
事实上划分点的数量可以是任意正整数,划分点的位置也可以采取其它的形式。
事实上,划分点的数量、划分点的位置都是超参数,需要结合验证集、具体问题来具体分析。
现实任务中经常会遇到不完整样本,即样本的某些属性值缺失。
如果简单地放弃不完整样本,仅使用无缺失值的样本来进行学习,则是对数据信息的极大浪费。
这里有两个问题:
给定训练集 和属性 , 令 表示 中在属性 上没有缺失的样本子集。则可以仅根据 来判断属性 的优劣 。
假定属性 有 个可能的取值 。令:
表示: 中在属性 上取值为 的样本的子集
表示: 中属于第 类的样本子集(一共有 个分类)。
根据定义有:
为每个样本 赋予一个权重 ,定义:
其物理意义为:
将信息增益的计算公式推广为: 。
其中: 。
基于权重的样本划分:
如果样本 在划分属性 上的取值已知,则:
如果样本 在划分属性 上的取值未知,则:
直观地看,基于权重的样本划分就是让同一个样本以不同的概率分散到不同的子结点中去。
C4.5
使用了该方案。由于决策树使用平行于坐标轴的拆分,使得它对于一些很简单的问题很费力。
比如:当 时为正类;否则为反类。这种拆分边界并不平行于坐标轴,使得决策树会用许多层的拆分来逼近这个边界。
解决方案是:多变量决策树multivariate decision tree
。
多变量决策树中,内部结点不再是针对某个属性,而是对属性的线性组合。即:每个内部结点是一个 的线性分类器。其中:
与传统的单变量决策树不同,在多变量决策树的学习过程中,不是为每内部结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器。