决策树是一类常见的机器学习方法,它是基于树的结构进行决策的。每次做决策时选择最优划分属性,一般而言,随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一个类别,即节点的“纯度”(purity)越来越高。
决策树学习算法包含特征选择、决策树的生成与剪枝过程。决策树的学习算法通常是递归地选择最优特征,并用最优特征对数据集进行分割。开始时,构建根节点,选择最优特征,该特征有几种值就分割为几个子集,每个子集分别递归调用此方法,返回节点,返回的节点就是上一层的子节点。直到达到终止条件。(预剪枝条件等)
关于各种熵的介绍见各类熵总结
常用的决策树算法有ID3,C4.5和CART。(还有一个C5.0不过是商用版本,在C4.5的基础上做了很多改进。)
各类决策树的具体的算法流程见ID3,C4.5,CART决策树
优点:ID3使用信息增益去对决策树进行划分,经常偏向于分支较多的特征分裂,因为具有较多属性值的特征,分裂后其信息增益通常较大。此时就会有较大的概率出现每个分支节点只包含一个样本这种情况,此时分支节点的纯度达到最大,但显然这种决策树是不具备泛化能力的,无法对新样本进行有效的预测。总结一下:信息增益对可取属性数目较多的特征有所偏好,而信息增益率减少了这种偏好可能带来的不利影响。
缺点:信息增益率偏向取值较少的特征,当特征取值较少时信息增益率求解公式分母较小,因而信息增益率比较大。所以它偏向取值较少的特征。
综合其优缺点:我们在使用信息增益率时,通常也并不是直接使用。而是先在候选特征中找出信息增益高于平均水平的特征,然后在这些特征中再选择信息增益率最高的特征。
树的剪枝策略分为两种,一种为在树生成过程中的预剪枝策略,另一种为树在生成之后的后剪枝策略。具体参见之前写的文章树的剪枝策略。
树的剪枝主要是为了防止树的过拟合,提高树模型的泛化能力。(剪枝之后的分类误差不能相差太大。)
ID3算法是采用信息增益作为评价标准进行分支的决策树算法。
ID3的缺点:
C4.5算法主要对ID3作出了以下方面的改进:
C4.5的缺点:
无论是ID3还是C4.5最好在小数据集上使用,决策树分类一般只适用于小数据。当属性取值很多时最好选择C4.5算法,ID3得出的效果会非常差。
C4.5既可以处理离散型特征,也可以处理连续型特征。对于连续分布的特征,其处理方法是:先把连续特征转换为离散特征再进行处理。虽然本质上特征的取值是连续的,但对于有限的采样数据它是离散的,如果有N个样本,那么我们就有N-1种离散化的方法。(离散属性的离散化通常是分两类,小于等于某一个分割点的为一类,大于某一个分割点的为一类。)具体分割点的选择是根据计算信息增益,选择有最大信息增益的分割点。另外,在分割之前,我们还需要对连续属性进行排序(升序),这样可以大大减少运算量。经证明,在决定连续特征的分界点时采用信息增益这个指标,而选择属性的时候才使用信息增益率这个指标能选择出最佳分类特征。
具体步骤如下:
分裂点的信息增益修正方法:
将信息增益减去得到修正后的信息增益。其中N是连续特征的取值个数,D是训练数据数目。此修正的原因在于:当离散特征与连续特征并存时,C4.5算法倾向于选择连续特征做最佳树分裂点。
两者都是决策树,但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树是二叉树,所以对于样本离散特征有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.在进入模型开始训练之前,我们可以对缺失值做上一定的处理。
2. 在选择分裂属性的时候,训练样本存在缺失值,如何处理?(计算分裂损失减少值时,忽略特征缺失的样本,最终计算的值乘以比例(实际参与计算的样本数除以总的样本数))
假如你使用ID3算法,那么选择分类特征时,就要计算所有特征的熵减(信息增益,Gain)。假设10个样本,特征是a,b,c。在计算a特征熵时发现,第10个样本的a特征缺失,那么就把第10个样本去掉,前9个样本组成新的样本集,在新样本集上按正常方法计算a特征的熵减。然后结果乘0.9(未缺失样本的比例),就是a特征分裂最终的熵。
3. 分类特征选择完成,对训练样本分类,发现样本特征缺失怎么办?(将该样本分配到所有子节点中,权重由1变为具有特征a的样本被划分成的子集样本个数的相对比率,计算错误率的时候,需要考虑到样本权重)
4. 训练完成,给测试集样本分类,有缺失值怎么办?(分类时,如果待分类样本有缺失变量,而决策树决策过程中没有用到这些变量,则决策过程和没有缺失的数据一样;否则,如果决策要用到缺失变量,决策树也可以在当前节点做多数投票来决定(选择样本数最多的特征值方向)。)
当训练集很大以及特征数量并不是很多的情况下,这种状况很容易发生。此时的解决方法一般有两种:
在之前的文章中有讲过类似的问题,这里再重复一遍。决策树是概率模型,为什么是概率模型呢,不要以为那些有贝叶斯公式、类条件概率、后验概率的模型才是概率模型。决策树其实是一种简单高效并且具有强解释性的概率模型,是给定特征条件下类的条件概率分布的一种退化表示(并不求解概率密度函数但依据训练样本可以得到类频率代替概率)。
概率模型是不需要归一化的,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。数值缩放不会影响决策树的分裂点位置。
二叉决策树不像多叉树那样会形成过多的数据碎片,而二叉决策树可能会得到更深的最终决策树。
确定最佳分割点,在该步骤中需要对特征值进行排序,计算信息增益等,非常耗时。
决策树中一个特征被选择过后依然是有可能被选择为分裂特征的。
优点:
缺点:
模型应用场景可参考如下:
https://www.cnblogs.com/end/p/3328379.html