决策树算法总结(下:CART决策树)
文章目录
- 一、CART树原理
- 二、CART分类树
- 2.1 特征选择
- 2.2 建立流程
- 2.3 连续特征和离散特征的处理
- 三、CART回归树
- 四、CART树算法的剪枝
- 4.1 剪枝的损失函数度量
- 4.2 剪枝的思路
- 4.3 CART树的交叉验证
- 4.4 CART树的剪枝算法
- 五、决策树总结
上一篇文章中,讲解了ID3决策树及C4.5决策树,但是特们仍有许多不足:比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处理分类不能处理回归等。对于这些问题, CART算法大部分做了改进。由于CART算法可以做回归,也可以做分类,我们分别加以介绍,先从CART分类树算法开始,重点比较和C4.5算法的不同点。接着介绍CART回归树算法,重点介绍和CART分类树的不同点。然后我们讨论CART树的建树算法和剪枝算法,最后总结决策树算法的优缺点。
一、CART树原理
CART 全称为 Classification And Regression Trees,即分类回归树。顾名思义,该算法既可以用于分类还可以用于回归。
克服了 ID3 算法只能处理离散型数据的缺点,CART 可以使用二元切分来处理连续型变量。二元切分法,即每次把数据集切分成两份,具体地处理方法是:如果特征值大于给定值就走左子树,否则就走右子树。对 CART 稍作修改就可以处理回归问题。先前我们使用香农熵来度量集合的无组织程度,如果选用其它方法来代替香农熵,就可以使用树构建算法来完成回归。
与ID3决策树及C4.5决策树一样,CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成。它主要用来处理分类和回归问题,下面对分别对其进行介绍。
本部分将构建两种树,第一种是分类树;第二种是回归树。
二、CART分类树
2.1 特征选择
CART分类树使用基尼指数最小化准则来选择最佳属性。
ID3算法使用了信息增益来选择特征,信息增益大的优先选择。C4.5算法采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。因此,我们希望有一种方法简化模型同时又不至于完全丢失熵模型的优点,这就是基尼系数。CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。
在分类问题中,假设有K个类别,第k个类别的概率为pkp_kpk, 则基尼系数的表达式为:
Gini(p)=∑k=∑k=1Kpk(1−pk)=1−∑k=1Kpk2Gini(p)=∑k=\sum_{k=1}^{K}p_k(1−p_k)=1-\sum_{k=1}^{K}p^2_kGini(p)=∑k=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
如果是二类分类问题,计算就更加简单了,如果属于第一个样本输出的概率是p,则基尼系数的表达式为:
Gini(p)=2p(1−p)Gini(p)=2p(1−p)Gini(p)=2p(1−p)
对于个给定的样本D,假设有K个类别, 第k个类别的数量为CkC_kCk,则样本D的基尼系数表达式为:
Gini(D)=1−∑k=1K(∣Ck∣∣D∣)2Gini(D)=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
特别的,对于样本D,如果根据特征A的某个值a,把D分成D1和D2两部分,则在特征A的条件下,D的基尼系数表达式为:
Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
其中:
- Gini(D):表示集合D的不确定性。
- Gini(A,D):表示经过A=a分割后的集合D的不确定性。
对比基尼系数表达式和熵模型的表达式,二次运算要比对数简单很多,尤其是二类分类的计算,更加简单。但是简单归简单,和熵模型的度量方式比,基尼系数对应的误差有多大呢?对于二类分类,基尼系数和熵之半的曲线如下:
从上图可以看出,基尼系数和熵之半的曲线非常接近,仅仅在45度角附近误差稍大。因此,基尼系数可以做为熵模型的一个近似替代。而CART分类树算法就是使用的基尼系数来选择决策树的特征。同时,为了进一步简化,CART分类树算法每次仅仅对某个特征的值进行二分,而不是多分,这样CART分类树算法建立起来的是二叉树,而不是多叉树。这样一可以进一步简化基尼系数的计算,二可以建立一个更加优雅的二叉树模型。
2.2 建立流程
算法从根节点开始,用训练集递归的建立CART树。
- 1)对于当前节点的数据集为D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。
- 2)计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
- 3)计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数。
- 4)在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2.
- 5)对左右的子节点递归的调用1-4步,生成决策树。
对于生成的决策树做预测的时候,假如测试集里的样本A落到了某个叶子节点,而节点里有多个训练样本。则对于A的类别预测采用的是这个叶子节点里概率最大的类别。
2.3 连续特征和离散特征的处理
1)、连续特征的处理
对于CART分类树连续值的处理问题,其思想和C4.5是相同的,都是将连续的特征离散化。唯一的区别在于在选择划分点时的度量方式不同,C4.5使用的是信息增益比,则CART分类树使用的是基尼系数。
具体的思路如下,比如m个样本的连续特征A有m个,从小到大排列为a1,a2,...,ama_1,a_2,...,a_ma1,a2,...,am,则CART算法取相邻两样本值的平均数,一共取得m-1个划分点,其中第i个划分点TiT_iTi表示为:Ti=ai+a(i+1)2Ti=\frac{a_i+a_{(i+1)}}{2}Ti=2ai+a(i+1)。对于这m-1个点,分别计算以该点作为二元分类点时的基尼系数。选择基尼系数最小的点作为该连续特征的二元离散分类点。比如取到的基尼系数最小的点为ata_tat,则小于ata_tat的值为类别1,大于ata_tat的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与ID3或者C4.5处理离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。
2)、离散特征处理
对于CART分类树离散值的处理问题,采用的思路是不停的二分离散特征。
在ID3或者C4.5,如果某个特征A被选取建立决策树节点,如果它有A1,A2,A3三种类别,我们会在决策树上一下建立一个三叉的节点。这样导致决策树是多叉树。但是CART分类树使用的方法不同,他采用的是不停的二分,还是这个例子,CART分类树会考虑把A分成{A1}和{A2,A3}, {A2}和{A1,A3}, {A3}和{A1,A2}三种情况,找到基尼系数最小的组合,比如{A2}和{A1,A3},然后建立二叉树节点,一个节点是A2对应的样本,另一个节点是{A1,A3}对应的节点。同时,由于这次没有把特征A的取值完全分开,后面我们还有机会在子节点继续选择到特征A来划分A1和A3。这和ID3或者C4.5不同,在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。
三、CART回归树
CART回归树使用平方误差最小准则。
训练回归树其实和训练分类树没有本质不同,也是自上而下,不断分裂节点的过程。不同之处在于对节点分裂的分裂准则和分裂值的选择方法上。我下面将一步步推导回归树的构建算法。
设有训练数据集D={(X1,y1),(X2,y2),…,(Xn,yn)}D=\{(X_1,y_1),(X_2,y_2),…,(X_n,y_n)\}D={(X1,y1),(X2,y2),…,(Xn,yn)}。我们知道决策树最终将数据元组划分到了多个叶子节点中,比如分类树的每个叶子就有一个类标号,作为元组的预测类。回归树的思路类似,我将数据空间划分成了mm个区域{R1,R2,…,Rm}\{R_1,R_2,…,R_m\}{R1,R2,…,Rm},实际上就是将训练元组的分区。然后赋给每个区域有一个固定的代表值CiC_iCi(类似于分类树中的类标号),这样,回归树的模型可以表示成r如下公式的形式:
f(X)=∑i=1mCiI(X∈Ri)f(X)=\sum_{i=1}^{m}C_iI(X \in R_i)f(X)=i=1∑mCiI(X∈Ri)
其中I(X∈Ri)=1I(X∈R_i)=1I(X∈Ri)=1,如果X∈RiX∈R_iX∈Ri;否则,I(X∈Ri)=0I(X∈R_i)=0I(X∈Ri)=0。这么看来,上式的含义是:先判断X属于哪个区域,然后返回这个区域的代表值。
这样,我们可以写出对于某个区域Ri回归模型的损失函数:
J(C)=∑Xj∈Ri(f(Xj)−gi)2J(C)=\sum_{X_j \in R_i}(f(X_j)-g_i)^2J(C)=Xj∈Ri∑(f(Xj)−gi)2
其中,gig_igi为这个区域的代表值(这里用gig_igi而不用CiC_iCi的原因是我要表达gig_igi是分裂中间的某个区域的代表值,而CiC_iCi为最终完成分裂之后的叶子节点的代表值),gig_igi的计算方法一般是这个区域中的元组的y值的均值(取均值时,损失函数达到最优)。
gi=1Ni∑Xj∈Riyig_i=\frac{1}{N_i}\sum_{X_j \in R_i}y_igi=Ni1Xj∈Ri∑yi
其中,NiN_iNi为这个区域内数据元组的总数。初始时,所有的数据元组都在一个区域内,我们按照J(C)J(C)J(C)计算损失函数,如果计算得到的误差值太大,不能满足要求,则寻找最佳的分裂准则(属性)和分裂值将数据集一分为二。这里的关键在于怎样的分裂准则和分裂值对于回归树来说是最佳的。其实很明显,“最佳”指我按照这样的属性和属性值将数据集一分为二后,使得分裂得到的两个子区域的误差和最小。
综上所述,回归树的计算步骤如下:
- 1)初始时,将所有训练元组放置于根节点中,计算损失函数得到误差值,倘若误差大于事先定好的参数,那么执行下面的2~4步;
- 2)选择用于分裂区域的属性A和对应的属性值s,将当前节点的数据元组划分到以下两个区域R1R_1R1,R2R_2R2中。:
R1={X∣xi≤s};R1={X∣xi>s}R_1=\{X|x_i\leq s\};R_1=\{X|x_i>s\}R1={X∣xi≤s};R1={X∣xi>s}
其中xix_ixi为元组XXX中属性AAA的值。而选择分裂属性AAA以及属性值sss的依据是使得分裂后的子区域误差值的和最小。即:
min∑Xj∈R1(f(Xj)−y1)2+∑Xj∈R2(f(Xj)−y2)2min\sum_{X_j \in R_1}(f(X_j)-y_1)^2+\sum_{X_j \in R_2}(f(X_j)-y_2)^2minXj∈R1∑(f(Xj)−y1)2+Xj∈R2∑(f(Xj)−y2)2
这一步具体执行的时候,我们遍历所有的属性以及每个属性的所有可能的划分值,分别计算他们划分数据元组之后的两个子区域的代表值y1,y2y_1,y_2y1,y2,这样就可以计算R1,R2R_1,R_2R1,R2的误差和上式,最终选择误差和最小的属性AAA和属性值sss,作为分裂依据。
四、CART树算法的剪枝
CART回归树和CART分类树的剪枝策略除了在度量损失的时候一个使用均方差,一个使用基尼系数,算法基本完全一样,这里我们一起来讲。
由于决策时算法很容易对训练集过拟合,而导致泛化能力差,为了解决这个问题,我们需要对CART树进行剪枝,即类似于线性回归的正则化,来增加决策树的泛化能力。但是,有很多的剪枝方法,我们应该这么选择呢?CART采用的办法是后剪枝法,即先生成决策树,然后产生所有可能的剪枝后的CART树,然后使用交叉验证来检验各种剪枝的效果,选择泛化能力最好的剪枝策略。
也就是说,CART树的剪枝算法可以概括为两步,第一步是从原始决策树生成各种剪枝效果的决策树,第二步是用交叉验证来检验剪枝后的预测能力,选择泛化预测能力最好的剪枝后的数作为最终的CART树。
4.1 剪枝的损失函数度量
首先我们看看剪枝的损失函数度量,在剪枝的过程中,对于任意的一刻子树T,其损失函数为:
Cα(Tt)=C(Tt)+α∣Tt∣C_{\alpha}(T_t)=C(T_t)+\alpha|T_t| Cα(Tt)=C(Tt)+α∣Tt∣
其中,ααα为正则化参数,这和线性回归的正则化一样。C(Tt)C(T_t)C(Tt)为训练数据的预测误差,分类树是用基尼系数度量,回归树是均方差度量。∣Tt∣|T_t|∣Tt∣是子树T的叶子节点的数量。
当α=0α=0α=0时,即没有正则化,原始的生成的CART树即为最优子树。当α=∞α=∞α=∞时,即正则化强度达到最大,此时由原始的生成的CART树的根节点组成的单节点树为最优子树。当然,这是两种极端情况。一般来说,ααα越大,则剪枝剪的越厉害,生成的最优子树相比原生决策树就越偏小。对于固定的ααα,一定存在使损失函数Cα(T)C_α(T)Cα(T)最小的唯一子树。
4.2 剪枝的思路
对于位于节点t的任意一颗子树Tt,如果没有剪枝,它的损失是:
Cα(Tt)=C(Tt)+α∣Tt∣C_{\alpha}(T_t)=C(T_t)+\alpha|T_t| Cα(Tt)=C(Tt)+α∣Tt∣
如果将其剪掉,仅仅保留根节点,则损失是:
Cα(T)=C(T)+αC_{\alpha}(T)=C(T)+\alpha Cα(T)=C(T)+α
当α=0α=0α=0或者ααα很小时,Cα(Tt)<Cα(T)C_α(T_t)<C_α(T)Cα(Tt)<Cα(T) , 当ααα增大到一定的程度时:
Cα(Tt)=Cα(T)C_{\alpha}(T_t)=C_{\alpha}(T)Cα(Tt)=Cα(T)
当α继续增大时不等式反向,也就是说,如果满足下式:
α=C(T)−C(Tt)∣Tt∣−1\alpha=\frac{C(T)-C(T_t)}{|T_t|-1}α=∣Tt∣−1C(T)−C(Tt)
TtT_tTt 和TTT有相同的损失函数,但是TTT节点更少,因此可以对子树TtT_tTt进行剪枝,也就是将它的子节点全部剪掉,变为一个叶子节点T。
4.3 CART树的交叉验证
由上面可知:可以计算出每个子树是否剪枝的阈值α,如果我们把所有的节点是否剪枝的值α都计算出来,然后分别针对不同的α所对应的剪枝后的最优子树做交叉验证。这样就可以选择一个最好的α,有了这个α,我们就可以用对应的最优子树作为最终结果。
4.4 CART树的剪枝算法
- 输入:CART树建立算法得到的原始决策树T。
- 输出:最优决策子树Tα。
算法如下:
- 1)初始化αmin=∞α_{min}=∞αmin=∞, 最优子树集合ω={T}ω=\{T\}ω={T};
- 2)从叶子节点开始自下而上计算各内部节点t的训练误差损失函数Cα(Tt)C_α(T_t)Cα(Tt)(回归树为均方差,分类树为基尼系数),叶子节点数∣Tt∣|T_t|∣Tt∣,以及正则化阈值α=min{C(T)−C(Tt)∣Tt∣−1,αmin}α=min\{\frac{C(T)−C(T_t)}{|T_t|−1},α_{min}\}α=min{∣Tt∣−1C(T)−C(Tt),αmin},更新αmin=αα_{min}=ααmin=α;
- 3)得到所有节点的ααα值的集合MMM;
- 4)从M中选择最大的值αkα_kαk,自上而下的访问子树ttt的内部节点,如果C(T)−C(Tt)∣Tt∣−1\frac{C(T)−C(T_t)}{|T_t|−1}∣Tt∣−1C(T)−C(Tt)时,进行剪枝。并决定叶节点ttt的值。如果是分类树,则是概率最高的类别,如果是回归树,则是所有样本输出的均值。这样得到αk对应的最优子树Tk;
- 5)最优子树集合ω=ω∪Tkω=ω∪T_kω=ω∪Tk, M=M−αkM=M−{α_k}M=M−αk;
- 6)如果M不为空,则回到步骤4。否则就已经得到了所有的可选最优子树集合ω;
- 7)采用交叉验证在ω选择最优子树TαT_αTα。
五、决策树总结
决策树优点:
- 1)简单直观,生成的决策树很直观。
- 2)基本不需要预处理,不需要提前归一化,处理缺失值。
- 3)使用决策树预测的代价是O(log2m)。 m为样本数。
- 4)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
- 5)可以处理多维度输出的分类问题。
- 6)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
- 7)可以交叉验证的剪枝来选择模型,从而提高泛化能力。
- 8) 对于异常点的容错能力好,健壮性高。
决策树缺点:
- 1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
- 2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
- 3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
- 4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
- 5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
文章有很多直接复制了决策树算法原理(下)中的总结,因为该文章写的太全了。
决策树算法总结(下:CART决策树)相关推荐
- 决策树算法原理(下)
在决策树算法原理(上)这篇里,我们讲到了决策树里ID3算法,和ID3算法的改进版C4.5算法.对于C4.5算法,我们也提到了它的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处 ...
- python实现决策树算法sklearn_python sklearn-05:决策树及随机森林
1.决策树 2.随机森林 1.决策树(decision tree) 决策树一种简单的非线性模型,用来解决回归与分类问题. 通常是重复的将训练集解释变量分割成子集的过程.决策树的节点用方块表示,用来测试 ...
- 决策树算法python实现_决策树之python实现ID3算法(例子)
1 #-*- coding: utf-8 -*- 2 from math importlog3 importoperator4 importpickle5 ''' 6 输入:原始数据集.子数据集(最后 ...
- 徒手写代码之《机器学习实战》-----决策树算法(2)(使用决策树预测隐形眼镜类型)
使用决策树预测隐形眼镜类型 说明: 将数据集文件 'lenses.txt' 放在当前文件夹 from math import log import operator 熵的定义 "" ...
- 【机器学习】Java 代码实现 CART 决策树算法
文章目录 一.决策树算法 二.CART 决策树 三.Java 代码实现 3.1 TrainDataSet 3.2 DataType 3.3 PredictResult 3.4 CartDecision ...
- 决策树算法和CART决策树算法详细介绍及其原理详解
相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...
- 【数据挖掘】决策树算法简介 ( 决策树模型 | 模型示例 | 决策树算法性能要求 | 递归创建决策树 | 树根属性选择 )
文章目录 I . 决策树模型 II . 决策树模型 示例 III . 决策树算法列举 IV . 决策树算法 示例 V . 决策树算法性能要求 VI . 决策树模型创建 ( 递归创建决策树 ) VII ...
- python决策树原理_关于决策树算法最通俗的一次Python学习教程,你肯定得看
一. 概述 前面的一篇 有一点得先说一下,决策树在优化过程中,有3个经典的算法,分别是ID3,C4.5,和CART.后面的算法都是基于前面算法的一些不足进行改进的,我们这次的Python学习教程就先跟 ...
- 决策树留一法python代码_ScikitLearn决策树算法类库使用小结
1 scikit-learn决策树算法类库介绍 scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归.分类决策树的类对应的是DecisionTree ...
- 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树
目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...
最新文章
- Linux手动启动、停止多个服务用的shell脚本
- matlab从入门到精通-常用的几种缺失值处理方法
- 环球易购选品:既然选品绕不过,那就让我们好好研究
- docker修改镜像的存储位置_Docker存储原理
- H. Fight Against Monsters
- 计算机中心述职报告诉,计算中心述职报告
- ExecutorService-10个要诀和技巧
- linux使用vim同时打开文件,VIM 在同一个窗口中同时编辑多个文件
- 大数据,数据分析,机器学习,架构等相关系统名称名词解释
- Lwip协议详解(基于Lwip 2.1.0)TCP协议 (未完待续)
- 常用的雷达信号:基于DDS的线性调频信号的产生
- c语言flag,flag是什么意思
- wintc下为什么有getchar()但屏幕却还是没有输出?
- 德州农工大学计算机专业如何,德州农工大学美国排名
- Windows7高级检索功能——搜索筛选器
- Q版京剧脸谱来喽——小生
- file:/usr/local/hive/iotmp/89de7dfe-8f26-4a6e-87b4-bacd16c2b2c8/hive_2021-11-05_05-06-07_555_3392062
- jdk11安装及网盘下载地址
- 工作Delay,应该吸取什么教训?(一)
- 给小朋友讲故事——谈谈牛顿,他是个科学家么?(音频)
热门文章
- 那个只能在win7的扫雷游戏,你能通关吗?今天用Python教大家,上号!!!
- arduino pro mini 迷你 ATmega328P 程序下载 usb-ttl reset
- 内含干货PPT下载|一站式数据管理 DMS 关键技术解读
- 360文件管理器android,360文件管理器
- 计算机科学中的计算机思维在本质上源自于,计算思维对学习计算机知识有何作用?...
- 【线上活动】材料计算训练营(量子力学、物理、化学、新能源、碳中和、生物制药、化工、新材料、催化、锂电池、半导体)
- OpenCV3编程入门(毛星云)读书笔记(一)
- 饭后Android 第四餐-BRVAH(最好用的数据适配器)(BRVAH简介,使用方法,item的点击事件,列表加载动画,添加头部、尾部,自定义ViewHolder)
- git SSH密钥生成及部署
- 易语言之编译后图标模糊的处理方案