文章目录

  • 一、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∑K​pk​(1−pk​)=1−k=1∑K​pk2​

如果是二类分类问题,计算就更加简单了,如果属于第一个样本输出的概率是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∑m​Ci​I(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​=Ni​1​Xj​∈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)&lt;Cα(T)C_α(T_t)&lt;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决策树)相关推荐

  1. 决策树算法原理(下)

    在决策树算法原理(上)这篇里,我们讲到了决策树里ID3算法,和ID3算法的改进版C4.5算法.对于C4.5算法,我们也提到了它的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处 ...

  2. python实现决策树算法sklearn_python sklearn-05:决策树及随机森林

    1.决策树 2.随机森林 1.决策树(decision tree) 决策树一种简单的非线性模型,用来解决回归与分类问题. 通常是重复的将训练集解释变量分割成子集的过程.决策树的节点用方块表示,用来测试 ...

  3. 决策树算法python实现_决策树之python实现ID3算法(例子)

    1 #-*- coding: utf-8 -*- 2 from math importlog3 importoperator4 importpickle5 ''' 6 输入:原始数据集.子数据集(最后 ...

  4. 徒手写代码之《机器学习实战》-----决策树算法(2)(使用决策树预测隐形眼镜类型)

    使用决策树预测隐形眼镜类型 说明: 将数据集文件 'lenses.txt' 放在当前文件夹 from math import log import operator 熵的定义 "" ...

  5. 【机器学习】Java 代码实现 CART 决策树算法

    文章目录 一.决策树算法 二.CART 决策树 三.Java 代码实现 3.1 TrainDataSet 3.2 DataType 3.3 PredictResult 3.4 CartDecision ...

  6. 决策树算法和CART决策树算法详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

  7. 【数据挖掘】决策树算法简介 ( 决策树模型 | 模型示例 | 决策树算法性能要求 | 递归创建决策树 | 树根属性选择 )

    文章目录 I . 决策树模型 II . 决策树模型 示例 III . 决策树算法列举 IV . 决策树算法 示例 V . 决策树算法性能要求 VI . 决策树模型创建 ( 递归创建决策树 ) VII ...

  8. python决策树原理_关于决策树算法最通俗的一次Python学习教程,你肯定得看

    一. 概述 前面的一篇 有一点得先说一下,决策树在优化过程中,有3个经典的算法,分别是ID3,C4.5,和CART.后面的算法都是基于前面算法的一些不足进行改进的,我们这次的Python学习教程就先跟 ...

  9. 决策树留一法python代码_ScikitLearn决策树算法类库使用小结

    1 scikit-learn决策树算法类库介绍 scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归.分类决策树的类对应的是DecisionTree ...

  10. 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树

    目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...

最新文章

  1. Linux手动启动、停止多个服务用的shell脚本
  2. matlab从入门到精通-常用的几种缺失值处理方法
  3. 环球易购选品:既然选品绕不过,那就让我们好好研究
  4. docker修改镜像的存储位置_Docker存储原理
  5. H. Fight Against Monsters
  6. 计算机中心述职报告诉,计算中心述职报告
  7. ExecutorService-10个要诀和技巧
  8. linux使用vim同时打开文件,VIM 在同一个窗口中同时编辑多个文件
  9. 大数据,数据分析,机器学习,架构等相关系统名称名词解释
  10. Lwip协议详解(基于Lwip 2.1.0)TCP协议 (未完待续)
  11. 常用的雷达信号:基于DDS的线性调频信号的产生
  12. c语言flag,flag是什么意思
  13. wintc下为什么有getchar()但屏幕却还是没有输出?
  14. 德州农工大学计算机专业如何,德州农工大学美国排名
  15. Windows7高级检索功能——搜索筛选器
  16. Q版京剧脸谱来喽——小生
  17. file:/usr/local/hive/iotmp/89de7dfe-8f26-4a6e-87b4-bacd16c2b2c8/hive_2021-11-05_05-06-07_555_3392062
  18. jdk11安装及网盘下载地址
  19. 工作Delay,应该吸取什么教训?(一)
  20. 给小朋友讲故事——谈谈牛顿,他是个科学家么?(音频)

热门文章

  1. 那个只能在win7的扫雷游戏,你能通关吗?今天用Python教大家,上号!!!
  2. arduino pro mini 迷你 ATmega328P 程序下载 usb-ttl reset
  3. 内含干货PPT下载|一站式数据管理 DMS 关键技术解读
  4. 360文件管理器android,360文件管理器
  5. 计算机科学中的计算机思维在本质上源自于,计算思维对学习计算机知识有何作用?...
  6. 【线上活动】材料计算训练营(量子力学、物理、化学、新能源、碳中和、生物制药、化工、新材料、催化、锂电池、半导体)
  7. OpenCV3编程入门(毛星云)读书笔记(一)
  8. 饭后Android 第四餐-BRVAH(最好用的数据适配器)(BRVAH简介,使用方法,item的点击事件,列表加载动画,添加头部、尾部,自定义ViewHolder)
  9. git SSH密钥生成及部署
  10. 易语言之编译后图标模糊的处理方案