数据挖掘面试题之决策树

决策树原理简述
决策树是一类常见的机器学习方法,它是基于树的结构进行决策的。每次做决策时选择最优划分属性,一般而言,随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一个类别,即节点的“纯度”(purity)越来越高。

决策树学习算法包含特征选择、决策树的生成与剪枝过程。决策树的学习算法通常是递归地选择最优特征,并用最优特征对数据集进行分割。开始时,构建根节点,选择最优特征,该特征有几种值就分割为几个子集,每个子集分别递归调用此方法,返回节点,返回的节点就是上一层的子节点。直到达到终止条件。(预剪枝条件等)

关于各种熵的介绍见各类熵总结

常用的决策树算法有ID3,C4.5和CART。(还有一个C5.0不过是商用版本,在C4.5的基础上做了很多改进。)

ID3:以信息增益为准则来选择划分属性。
C4.5:使用信息增益率来进行属性的选择。
CART:使用基尼系数来选择划分属性。
各类决策树的具体的算法流程见ID3,C4.5,CART决策树

信息增益率的优缺点
优点:ID3使用信息增益去对决策树进行划分,经常偏向于分支较多的特征分裂,因为具有较多属性值的特征,分裂后其信息增益通常较大。此时就会有较大的概率出现每个分支节点只包含一个样本这种情况,此时分支节点的纯度达到最大,但显然这种决策树是不具备泛化能力的,无法对新样本进行有效的预测。总结一下:信息增益对可取属性数目较多的特征有所偏好,而信息增益率减少了这种偏好可能带来的不利影响。

缺点:信息增益率偏向取值较少的特征,当特征取值较少时信息增益率求解公式分母较小,因而信息增益率比较大。所以它偏向取值较少的特征。

综合其优缺点:我们在使用信息增益率时,通常也并不是直接使用。而是先在候选特征中找出信息增益高于平均水平的特征,然后在这些特征中再选择信息增益率最高的特征。

决策树的剪枝策略
树的剪枝策略分为两种,一种为在树生成过程中的预剪枝策略,另一种为树在生成之后的后剪枝策略。具体参见之前写的文章树的剪枝策略。

树的剪枝主要是为了防止树的过拟合,提高树模型的泛化能力。(剪枝之后的分类误差不能相差太大。)

C4.5对ID3做了哪些改进
ID3算法是采用信息增益作为评价标准进行分支的决策树算法。

ID3的缺点:

对于具有很多值的属性它是非常敏感的,例如,如果我们数据集中的某个属性值对不同的样本基本上是不相同的,甚至更极端点,对于每个样本都是唯一的,如果我们用这个属性来划分数据集,它会得到很大的信息增益,但是,这样的结果并不是我们想要的。
ID3算法不能处理具有连续值的属性。
ID3算法不能处理属性具有缺失值的样本。
由于按照上面的算法会生成很深的树,所以容易产生过拟合现象。
C4.5算法主要对ID3作出了以下方面的改进:

用信息增益率来选择属性,克服了用信息增益来选择属性时偏向选择值多的属性的不足。
可以处理连续数值型属性。
使用了PEP的后剪枝策略。
缺失值的处理。处理的方式通常有三种:
赋上该属性最常见的值或者取均值;
丢弃有缺失值的样本;
根据节点的样例上该属性值出现的情况赋一个概率,比如该节点上有10个样本,其中属性A的取值有6个为“高”,4个为“低”。那么对该节点上缺失的属性A,以0.6的概率设为“高”,0.4的概率设为“低”。
C4.5的缺点:

算法低效,在构造树的过程中,需要对数据集进行多次的顺序扫描和排序(主要在于对连续特征的处理上),因而导致算法的低效。
内存受限,适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。
无论是ID3还是C4.5最好在小数据集上使用,决策树分类一般只适用于小数据。当属性取值很多时最好选择C4.5算法,ID3得出的效果会非常差。

C4.5如何处理连续数值型特征
C4.5既可以处理离散型特征,也可以处理连续型特征。对于连续分布的特征,其处理方法是:先把连续特征转换为离散特征再进行处理。虽然本质上特征的取值是连续的,但对于有限的采样数据它是离散的,如果有N个样本,那么我们就有N-1种离散化的方法。(离散属性的离散化通常是分两类,小于等于某一个分割点的为一类,大于某一个分割点的为一类。)具体分割点的选择是根据计算信息增益,选择有最大信息增益的分割点。另外,在分割之前,我们还需要对连续属性进行排序(升序),这样可以大大减少运算量。经证明,在决定连续特征的分界点时采用信息增益这个指标,而选择属性的时候才使用信息增益率这个指标能选择出最佳分类特征。

具体步骤如下:

对特征的取值进行升序排序
两个特征取值之间的中点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益。优化算法就是只计算分类属性发生改变(对于升序排序的特征取值而言,对每一个分裂点都进行计算未免太过耗时,实践证明,取那些夹在相同分类属性之间的分裂点必不会时全局最小。)的那些特征取值。
选择修正后信息增益最大的分裂点作为该特征的最佳分裂点。
计算最佳分裂点的信息增益率作为特征的信息增益率。
分裂点的信息增益修正方法:

将信息增益减去得到修正后的信息增益。其中N是连续特征的取值个数,D是训练数据数目。此修正的原因在于:当离散特征与连续特征并存时,C4.5算法倾向于选择连续特征做最佳树分裂点。

C4.5与CART的区别
两者都是决策树,但CART既可以做分类,又可以做回归,而C4.5只是用于分类。

C4.5是构造决策树来发现数据中蕴含的分类规则,是一种通过划分特征空间逼近离散函数值的方法。C4.5是基于ID3的改进算法。使用信息增益率作为划分依据。分类规则是互斥并且完备的。所谓互斥即每一条样本记录不会同时匹配上两条分类规则,所谓完备即每条样本记录都在决策树中都能匹配上一条规则。

CART本质是对特征空间进行二元划分(即CART生成的决策树是一颗二叉树),并能够对标量特征与连续特征进行分裂。在对标量特征进行划分时,分为等于某个特征属性和不等于;对连续特征进行划分时,分为大于和小于等于。并且在分类的时候是采用GINI系数作为衡量标准,而不是信息增益了;在回归时,是使用最小均方误差作为评价。

CART对于特征的利用是可以重复的,而作为分类的C4.5则是不能重复利用特征。

分类树和回归树联系区别
分类树:

以C4.5分类树为例,C4.5分类树在每次分枝时,是穷举每一个feature的每一个阈值,找到使得按照feature<=阈值,和feature>阈值分成的两个分枝的集合信息熵最小的阈值,按照该标准分枝得到两个新节点,用同样方法继续分枝直到得到类别唯一的叶子节点,或达到预设的终止条件,若最终叶子节点中的性别不唯一,则以占有最多数的类别作为该叶子节点的最终分类类别。

回归树:

回归树总体流程也是类似,区别在于,回归树的每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化均方差即(每个人的年龄-预测年龄)^2 的总和 / N。也就是被预测出错的人数越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最可靠的分枝依据。分枝直到每个叶子节点上人的年龄都唯一或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。
      回归树使用最大均方差划分节点;每个节点样本的均值作为测试样本的回归预测值。

总结:

分类树使用信息增益或增益比率来划分节点;每个节点样本的类别情况投票决定测试样本的类别。
回归树使用最小均方误差划分节点;每个节点样本的均值作为测试样本的回归预测值。
CART树对离散特征取值数目>=3对特征如何处理
因为CART树是二叉树,所以对于样本离散特征有N>=3个取值时的处理也只能有两个分支,这就要通过人为组合创建二取值序列并取GiniGain最小者作为树分叉的决策点。如某特征值具有[‘young’,’middle’,’old’]三个取值,那么二分序列会有如下3种可能性(空集和满集在CART分类中没有意义): [((‘young’,), (‘middle’, ‘old’)), ((‘middle’,), (‘young’, ‘old’)), ((‘old’,), (‘young’, ‘middle’))]。

采用CART算法,就需要分别计算按照上述List中的二分序列做分叉时的Gini系数,然后选取产生最小的GINIGain的二分序列做该特征的分叉二值序列参与树构建的递归。如果某特征取值有4个,那么二分序列组合就有7种,5个取值就有15种组合。

因此CART不适用于离散特征有过多取值可能的场景。此时,若一定要使用CART,则最好预先人为的将离散特征的取值缩减。 

那么对于二分后的左右分支,如果特征取值tuple中元素多于2个,该特征一般还是需要继续参与到子数据集的分割中去。这在一定程度上有助于提升模型的精度(一定意义上改进了C4.5完全的贪心算法,使得模型有一定的全局(局部)特征考量的性质)。

决策树对缺失值的处理方法
缺失值问题可以从四个方面来考虑

1.在进入模型开始训练之前,我们可以对缺失值做上一定的处理。

为缺失值赋上该属性最常见的值或者取均值;
丢弃有缺失值的样本;
根据节点的样例上该属性值出现的情况赋一个概率,比如该节点上有10个样本,其中属性A的取值有6个为“高”,4个为“低”。那么对该节点上缺失的属性A,以0.6的概率设为“高”,0.4的概率设为“低”。
2. 在选择分裂属性的时候,训练样本存在缺失值,如何处理?(计算分裂损失减少值时,忽略特征缺失的样本,最终计算的值乘以比例(实际参与计算的样本数除以总的样本数))

假如你使用ID3算法,那么选择分类特征时,就要计算所有特征的熵减(信息增益,Gain)。假设10个样本,特征是a,b,c。在计算a特征熵时发现,第10个样本的a特征缺失,那么就把第10个样本去掉,前9个样本组成新的样本集,在新样本集上按正常方法计算a特征的熵减。然后结果乘0.9(未缺失样本的比例),就是a特征分裂最终的熵。

3. 分类特征选择完成,对训练样本分类,发现样本特征缺失怎么办?(将该样本分配到所有子节点中,权重由1变为具有特征a的样本被划分成的子集样本个数的相对比率,计算错误率的时候,需要考虑到样本权重)

单独为属性缺失的样本划分一个分支子集。
比如该节点是根据a特征划分,但是待分类样本a特征缺失,怎么办呢?假设a特征离散,有1,2两种取值,那么就把该样本分配到两个子节点中去,但是权重由1变为相应离散值个数占样本的比例。然后计算错误率的时候,注意,不是每个样本都是权重为1,存在分数。
4. 训练完成,给测试集样本分类,有缺失值怎么办?(分类时,如果待分类样本有缺失变量,而决策树决策过程中没有用到这些变量,则决策过程和没有缺失的数据一样;否则,如果决策要用到缺失变量,决策树也可以在当前节点做多数投票来决定(选择样本数最多的特征值方向)。)

如果有单独的缺失分支,使用此分支。
把待分类的样本的特征a值分配一个最常出现的a的属性值,然后进行分支预测。
根据其他特征为该待分类样本填充一个特征a值,然后进行分支处理。
在决策树中特征a节点的分支上,遍历特征a节点的所有分支,探索可能所有的分类结果,然后把这些分类结果结合起来一起考虑,按照概率决定一个分类。
待分类样本在到达特征a节点时就终止分类,然后根据此时a节点所覆盖的叶子节点类别状况为其分配一个发生概率最高的类。
如果决策树属性用完了仍未对决策树完成划分应该怎么办
当训练集很大以及特征数量并不是很多的情况下,这种状况很容易发生。此时的解决方法一般有两种:

一种即退出模型,做特征组合、交叉等操作扩充特征。当有了足够多的特征后,便可以有效改善这种情况。但在一般情况下,树模型如果特征过多,相当容易过拟合。
另一种方法便是直接对叶子节点采用“多数表决”,即使用节点中出现最多的类别作为该节点的标签。
决策树需要进行归一化处理吗?
在之前的文章中有讲过类似的问题,这里再重复一遍。决策树是概率模型,为什么是概率模型呢,不要以为那些有贝叶斯公式、类条件概率、后验概率的模型才是概率模型。决策树其实是一种简单高效并且具有强解释性的概率模型,是给定特征条件下类的条件概率分布的一种退化表示(并不求解概率密度函数但依据训练样本可以得到类频率代替概率)。

概率模型是不需要归一化的,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。数值缩放不会影响决策树的分裂点位置。

二叉决策树与多叉决策树相比各有什么特点
二叉决策树不像多叉树那样会形成过多的数据碎片,而二叉决策树可能会得到更深的最终决策树。

决策树构建过程中较为耗时的步骤
确定最佳分割点,在该步骤中需要对特征值进行排序,计算信息增益等,非常耗时。

决策树算法主要应用于非线性模型,若已知数据集是满足线性假设的,那么我们可以直接用一个线性模型取得比较好的预测结果
决策树特征的重复选择
决策树中一个特征被选择过后依然是有可能被选择为分裂特征的。

若特征为离散特征,如果决策树为二叉树,则可以在分类的子区间继续划分,如果决策树为多叉树,通常进行一次划分。
若特征为连续特征,则可能在决策树中多次被选择。
决策树模型的优缺点
优点:

易于理解,决策树易于理解和实现。人们在通过解释后都有能力去理解决策树所表达的意义。
数据处理简单,对缺失值不敏感。对于决策树,数据的准备往往是简单或者不必要的。其他的算法模型往往要求先把数据一般化,比如去掉多余的或者空白的属性。
能够同时处理数据型变量和类别变量。其他的技术往往要求特征是单一类型的。
是一个白盒模型,如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。
易于通过静态测试来对模型进行评测。表示有可能测量该模型的可信度。
在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
如果有不相关的 feature,没什么干扰,如果数据中有不相关的 feature,顶多这个 feature 不出现在树的节点里。逻辑回归和 SVM 没有这样的天然特性(但是有相应的补救措施,比如逻辑回归里的 L1 正则化)。
缺点:

很容易在训练数据中生成复杂的树结构,造成过拟合。剪枝可以缓解过拟合。
不适合处理高维数据,当属性数量过大的时候,部分决策树就不太适用了。
对异常值(Outlier)过于敏感,很容易导致树的结构巨大的变换。
模型的更新比较复杂,每当有新的样本进来时,树的结构很有可能会发生大的改变。
采用的贪心策略无法考虑到全局的特性。
树模型的应用场景
模型应用场景可参考如下:

如果不强调模型的解释度,尽量避免单棵决策树,用集成树模型
在集成树模型中,优先推荐使用xgboost
在中小数据集上,优先选择集成树模型。大数据集上推荐神经网络
在需要模型解释度的项目上,优先使用树模型
在项目时间较短的项目上,如果数据质量低(大量缺失值、噪音等),优先使用集成树模型
在硬件条件有限及机器学习知识有限的前提下,优先选择树模型
————————————————
版权声明:本文为CSDN博主「zhaosarsa」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32742009/article/details/81840904

发布了86 篇原创文章 · 获赞 1 · 访问量 8215

猜你喜欢

转载自blog.csdn.net/a1272899331/article/details/104671325