0、背景
决策树是机器学习、数据挖掘领域一个非常常用的算法,网上相关的资料也是一大堆,原理很容易理解,但是要真正熟练运用和领悟还是需要花点功夫。本人近期有过一些面试,因此针对性地复习了一下,这里就总结一下决策树的一些原理和面试中遇到的相关问题。
1、基础知识
1.1 熵
熵其实是物理里的一个概念,代表一个系统的混乱程度,在信息论里用于表示一个随机变量不确定性的度量,熵越大,不确定性越高。假设 是一个离散分布的随机变量,取值有限,那么 的熵可以表示为 从定义可知, ,右边等号成立当且仅当
1.1.1 条件熵
假设有随机变量 ,其联合概率分布为 ,条件熵 表示在已知随机 的条件下随机变量 的不确定性,随机变量 给定的条件下随机变量 的条件熵 ,给出定义
1.1.2 联合熵
联合概率分布 的经验熵
1.1.3 交叉熵
关于样本集有两个分布 和 , 是真实分布, 是非真实分布,如果用非真实分布 来编码真实分布 ,
1.1.4 KL散度
用于衡量两个分布 的相似度 可以看到,KL散度是交叉熵和经验熵的差值。
1.2 信息增益
特征 对训练数据集 的信息增益 ,定义为集合 的经验熵 与特征 在给定条件下 的经验条件熵 之差 ,一般地,熵 和条件熵 之差称为互信息,在决策树里,信息增益等价于训练数据集中类别和特征的互信息。
1.3 信息增益率
特征 对训练数据集 的信息增益率 定义为其信息增益 与训练数据集 关于特征 的值的熵 之比,即 其中, 是特征 取值的个数
1.4 Gini指数
分类问题中,假设有 个类,样本点属于第 类的概率为 。则概率分布的基尼指数为 基尼指数 代表集合 的不确定性,基尼指数 表示经 分割后集合 的不确定性,基尼指数值越大,样本集合的不确定性也越大。
2、决策树
决策树顾名思义它是一个树状结构的东西,通俗理解其实就是一套if else 规则,常用于分类,一个样本进来,经过层层if else规则之后最终落到哪个叶子节点,就属于该节点所在的类别。决策树的由特征选择、树的生成、树的剪枝三步组成。
常见的决策树算法有ID3,C4.5,CART
2.1 ID3算法
ID3算法的核心是在决策树各个节点上用信息增益准则选择特征,递归地构建决策树。具体地,从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该结点的不同取值建立子节点,在对子结点递归调用上述方法,构建决策树,直到所有特征的信息增益均很小活没有特征可以选择位置,最后得到决策树。ID3相当于是用极大似然法进行概率模型的选择。
算法流程
输入:训练数据集 D,特征集 A,阈值
输出:决策树 T
(1). 若
中所有实例都属于同一类
,则
为单结点树,并将类
作为该结点的类标记,返回
;
(2). 若
=
,则将数据集
中样本数量最多的类别
作为该结点的类标记,返回
;
(3). 否则按前面提到的计算信息增益的方法,计算特征集
中各个特征对
的信息增益,选择信息增益最大的特征
;
(4). 如果
的信息增益小于阈值
,则
为单结点树,并将
中实例数最大的类别
作为该结点的类标记,返回
;
(5). 否则,对
的每一个取值
,依
=
,将
分割为若干个不相交的非空集合
,将
中实例数最大的类作为标记,构造子结点,由结点和子结点构建树
,返回
;
(6). 对第
个子结点,以
为训练集,以
-
为特征集,递归调用(1) - (5),得到子树
,返回
注意:
- ID3算法只能处理离散特征
- 特征在不同层级之间不能反复使用
- 使用信息增益来做特征选择,容易导致偏向于选择属性值多的特征,从直观上也能理解,一个特征属性值越多,包含的信息也就越多,用它来做分裂结点,数据集的不确定性降低地更快。
2.2 C4.5算法
C4.5算法流程和ID3一模一样,只是在选择分裂的时候用信息增益率来做特征选择,在这里不再赘述。
注意:
- C4.5 算法相比于ID3 算法,它既能处理离散特征也能处理连续特征
- 使用信息增益率做特征选择,避免了偏向选择属性值较多的问题
- C4.5 在处理连续数值型属性时,通过对数据排序之后找到类别不同的分割线作为切分点,根据切分点把连续属性特征转为布尔型,从而将连续型变量转换多个取之区间的离散型变量
- C4.5 一般来说也是多叉树
2.3 CART算法
CART全称是分类与回归树(Classify and Regression Tree),顾名思义,既可以用于分类也可以用于回归,CART假设树的二叉树,内部节点特征取值为 “是” 和 “否”,左边是取值为 “是” 的分支,右边是取值为 “否” 的分支。
CART算法由两步组成:
(1)、决策树的生成:基于训练数据生成决策树,生成的决策树要尽量大
(2)、决策树的剪枝:用验证数据集对已生成的决策树进行剪枝并选择最优子树,用损失函数最小作为选择标准。
2.3.1 回归树的生成
算法2.3.1 (最小二乘回归树)
输入:数据集
,特征集合
输出:回归树
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域,并决定每个子区域上的输出值,构建二叉决策树
(1). 选择最优的切分变量
和切分点
,求解
遍历变量
,对固定的切分变量
,扫描切分点
,找到使得上式最小的
(2). 用固定的
划分区域,并决定相应的输出值
(3). 继续对两个子区域调用(1),(2),直到满足停止条件。
(4). 将输入空间分成
个区域
,生成决策树
2.3.2 分类树的生成
分类树用基尼指数做特征选择,同时决定该特征的最优二值切分点。
在特征
的条件下,集合
的基尼指数定义为
(1). 设结点的训练数据集为
,计算现有特征对该数据集的基尼系数,此时,对每一个特征
,对其可能取的每个值
,根据样本点对
的测试为 “是” 或者 “否”,将
分割成
两部分,利用
式计算
=
的基尼系数。
(2). 在所有的可能
以及他们所有可能的切分点
中,选择基尼指数最小的特征及其对应的切分点作为最优特征和最优切分点,依最优特征和最优切分点,从现结点生成两个子节点,将训练数据集依特征分配到两个子节点中去。
(3). 对两个子节点递归调用 (1)、(2),直至满足停止条件
(4). 生成CART决策树
注意:
- CART既可以做分类也可以做回归
- 不同于ID3、C4.5可以是多叉树,CART只能是二叉树
- ID3和C4.5的特征是不能在不同层级之间复用的,而CART可以
- C4.5通过剪枝来平衡模型的准确性和泛化能力,而CART直接利用全部数据发现所有可能的树进行对比
2.4 决策树的剪枝
决策树生成算法递归地生成决策树,直到满足停止条件,这种情况下,对于训练集的数据会有较好的预测,但是对于测试集往往效果不理想,容易产生过拟合,因此要对决策树进行剪枝,简化树状结构,提高泛化能力。
剪枝分为预剪枝和后剪枝。
预剪枝:在树的构建生长阶段进行剪枝,如果结点满足信息Gini指数小于阈值或者该结点的样本树量少于多少,则不对该结点继续细分。
后剪枝:在树完全生长后再从叶子结点逐个往上剪枝,利用测试集数据验证剪枝前后,树的损失函数是否有变化。如果剪枝后损失函数减小,那说明剪枝是提高了模型泛化能力,否则不能剪枝。
这里介绍一下李航老师《统计学习方法》里的剪枝方法。
决策树的剪枝往往是通过最小化决策树整体的损失函数来实现。设树
的叶子结点个数为
,
是树
的叶子结点,该叶子结点有
个样本,其中第
类的样本个数为
,
为叶子结点
上的经验熵,
为参数,则决策树定义的损失函数可以定义为:
其中经验熵为
损失函数里,我们记右端第一项为
此时有
(4) 式中
表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,
表示模型的复杂度,参数
控制两者之间的影响,可以看到,当
较大时,会促使选择较简单的模型,
会比较小,而
较大时,会偏向于选择较为复杂的模型。
剪枝,就是在确定
的时候选择损失函数最小的子树,当
确定时,子树越大,对训练数据拟合越好,但是模型越复杂,相反,子树越小,对训练数据拟合差一些,但是模型相对简单。因此损失函数表示了对两者的平衡。
算法 2.4.1 (树的剪枝算法)
输入:生成算法产生的整个树
,参数
输出:修剪后的子树
(1). 计算每个结点的经验熵
(2). 递归地从树的叶子结点向上回缩,设一组叶结点回缩到其父节点之前与之后的树分别为
和
,其对应的损失函数值分别为
,如果
,则进行剪枝,将父节点变成叶子结点
(3). 返回 (2),直到不能进行剪枝为止,得到损失函数最小的子树
3、常见面试题
1.简述决策树的原理
2.简述决策树的构建过程
3.信息增益率有什么优缺点?
是对信息增益的一种改进,对属性值多的样本做一下惩罚,避免分类的时候偏向于优先划分属性值多的特征;
另外如果样本中某一个特征下的值没有重复的,ID3中使用信息增益更偏向于将每个样本各自分为一类,这样的方式是不合理的,用信息增益率可以避免这个问题。
4.如何对决策树进行剪枝?
预剪枝和后剪枝
5.为什么决策树需要进行剪枝?
防止过拟合
6.C4.5对ID3做了哪些改进?
将信息增益改成了信息增益率;可以处理连续型特征
7.C4.5决策树算法如何处理连续数值型属性?
通过对数据排序之后找到类别不同的分割线作为切分点,根据切分点把连续属性特征转为布尔型,从而将连续型变量转换多个取之区间的离散型变量
8.C4.5与CART的区别
C4.5只能做分类,CART既可以做分类也可以做回归,分类的时候用Gini指数,回归的时候用平方差。
C4.5可以是多叉树,而CART只能是二叉树
C4.5的特征在每个层级之间不会复用,CART的每个特征可以复用。
C4.5通过剪枝来平衡模型的准确性和泛化能力,而CART直接利用全部数据发现所有可能的树进行对比
9.简述一下分类树和回归树
10.CART如何生成回归树?
11.CART树对离散特征取值数目>=3的特征如何处理?
因为CART树是二叉树,所以对于样本的有N>=3个取值的离散特征的处理时也只能有两个分支,这就要通过组合人为的创建二取值序列并取GiniGain最小者作为树分叉决策点。如某特征值具有[‘young’,’middle’,’old’]三个取值,那么二分序列会有如下3种可能性(空集和满集在CART分类中没有意义):
[((‘young’,), (‘middle’, ‘old’)), ((‘middle’,), (‘young’, ‘old’)), ((‘old’,), (‘young’, ‘middle’))]
采用CART算法,就需要分别计算按照上述List中的二分序列做分叉时的Gini指数,然后选取产生最小的GINIGain的二分序列做该特征的分叉二值序列参与树构建的递归。
12.决策树对缺失值如何处理?
- 如何在属性值缺失的情况下进行划分属性的选择?(比如“色泽”这个属性有的样本在该属性上的值是缺失的,那么该如何计算“色泽”的信息增益?)
- 给定划分属性,若样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?(即到底把这个样本划分到哪个结点里?)
第一个问题只需要对缺失属性值的样本进行统计,计算该属性值不缺失的样本比例
,在计算信息增益时乘上
即可
第二个问题若样本
在划分属性
上取值缺失,则将
同时划入所有子节点,只不过此时要调整样本
的权重,换句话说就是让这个样本以不同的概率划分到不同的子节点中。
详细参考:https://blog.csdn.net/zhaomengszu/article/details/80775554
13.如果决策树属性用完了仍未对决策树完成划分应该怎么办?
多数表决
14.如何避免决策树的过拟合?
剪枝、减少特征、增加样本
15.决策树需要进行归一化处理吗?
不需要,因为决策树是一种概率模型,它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。数值缩放不会影响决策树的分裂点位置。
16.常用的决策树一定是二叉树吗?二叉决策树与多分支决策树相比各有什么特点?
不一定。C4.5和ID3都是多叉树,
17.你认为在一棵决策树构建过程中较为耗时的步骤是什么?
选取划分属性
18.你正在一个时间序列数据集上工作,开始用决策树算法,因为你知道它在所有类型数据上的表现都不错。后来,你尝试了时间序列回归模型,并得到了比决策树模型更高的精度。这种情况会发生吗?为什么?
19.决策树在选择特征进行分类时一个特征被选择过后,之后还会选择到这个特征吗?
ID3和C4.5的特征在层级之间不重复,但CART是会复用的
20.和其他模型比,决策树有哪些优点和缺点?
- 简单直观,生成的决策树很直观。
- 基本不需要预处理,不需要提前归一化,处理缺失值。
- 使用决策树预测的代价是O( )。 m为样本数。
- 既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
- 可以处理多维度输出的分类问题。
- 相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
- 可以交叉验证的剪枝来选择模型,从而提高泛化能力。
- 对于异常点的容错能力好,健壮性高。
我们再看看决策树算法的缺点:
- 决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
- 决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
- 寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
- 有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
- 如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
参考资料:
[1]. https://www.zhihu.com/question/41252833
[2]. 《统计学习方法》-- 李航
[3]. https://blog.csdn.net/qq_32742009/article/details/81840904