机器学习 决策树基础 ID3、C4.5、CART

news2024/10/5 21:20:41

文章目录

  • 参考
  • 决策树指标
    • 基尼系数
      • 基础公式
      • 公式理解
      • 引入划分后的公式
      • 划分后公式的理解
    • 信息熵、信息增益
      • 如何理解信息熵
    • 两种指标的对比
  • 划分策略
    • ID3
      • 定义
      • 举例
        • 计算各属性的信息增益
        • 选取最优属性作划分
        • 对子节点作递归划分
        • 生成结果
      • ID3的缺点
    • C4.5
      • 信息增益率
      • 优化
      • 缺点
    • CART
      • CART相较于前两者的改进
      • CART的特点
      • 节点划分依据
      • CART分类树举例
        • 2种取值的离散值
        • 多种取值的离散值
        • 连续值
      • CART回归树举例
      • 停止条件
      • 剪枝策略
        • 预剪枝
        • 后剪枝
  • 总结

参考

  • b站视频 【决策树、随机森林】附源码!!超级简单,同济大佬手把手带你学决策树
  • 决策树模型及案例(Python)
  • 决策树之基尼系数 该文章的公式理解可能不对,但提供了思路。
  • 【概率论】1-4:事件的的并集(Union of Events and Statical Swindles) 并集的概率

决策树指标

决策树有多种可选的形态,那么如何确定哪种决策树是更好的呢?有两种指标可以使用:

  • 基尼系数
  • 信息熵、信息增益

基尼系数

基础公式

基尼系数是一种评估决策树好坏的指标。他反映了决策树对样本分类的离散情况。假设样本集合为T,分为了若干个类别,每个类别在样本集合T中占的比例为 p i p_i pi。它的计算公式如下:
gini ⁡ ( T ) = 1 − ∑ p i 2 \operatorname{gini}(T)=1-\sum p_{i}^{2} gini(T)=1pi2

举个例子,假设某个员工的样本集合里都是离职员工,所以该集合只有"离职员工"一个类别,其出现的频率是100%。所以该系统的基尼系数为 1 − 1 2 = 0 1-1^2=0 1120,表示该系统没有混乱,或者说该系统的“纯度”很高。而如果样本中一半是离职员工,另一半是未离职员工,那么类别个数为2,每个类别出现的频率都为50%,所以其基尼系数为 1 − ( 0. 5 2 + 0. 5 2 ) = 0.5 1-(0.5^2+0.5^2)=0.5 10.520.520.5,其混乱程度很高。

公式理解

如何理解这个公式的含义?我们举个例子,假设有个贷款人员的样本集合,有贷款人员是否违约的二分类问题,1表示违约,0表示不违约。现在问:任取两个样本,它们属于同一类别的概率是多少?两个样本同属第一个类别的概率为 P 1 = p 1 2 P_1=p_1^2 P1=p12,同属第二个类别的概率为 P 2 = p 2 2 P_2=p_2^2 P2=p22。所以,两个样本同属一个类别的概率如下:
P r ( P 1 ∪ P 2 ) = P r ( P 1 ) + P r ( P 2 ) − P r ( P 1 ∩ P 2 ) = P r ( P 1 ) + P r ( P 2 ) 两个样本不可能同时都属于多个类别 = p 1 2 + p 2 2 \begin{aligned} Pr(P_1 \cup P_2)&=Pr(P_1)+Pr(P_2)-Pr(P_1 \cap P_2) \\ &=Pr(P_1)+Pr(P_2) \qquad \text{两个样本不可能同时都属于多个类别} \\ &=p_1^2+p_2^2 \end{aligned} Pr(P1P2)=Pr(P1)+Pr(P2)Pr(P1P2)=Pr(P1)+Pr(P2)两个样本不可能同时都属于多个类别=p12+p22
所以,两个样本不属于同一类别的概率为 1 − P r ( P 1 ∪ P 2 ) = 1 − p 1 2 − p 2 2 = g i n i ( T ) 1-Pr(P_1 \cup P_2)=1-p_1^2-p_2^2=gini(T) 1Pr(P1P2)=1p12p22=gini(T)在二分类问题中,基尼系数的含义就是随机采样的两个样本不属于同一类别的概率

该说法在多分类问题中一样成立。参考【概率论】1-4:事件的的并集(Union of Events and Statical Swindles)给出的公式:


图中的并集元素项都等于0,所以任取两个样本,都属于同一类别的概率为 Pr ⁡ ( ⋃ i = 1 n A i ) = ∑ i = 1 n Pr ⁡ ( A i ) = ∑ i = 1 n p i 2 \operatorname{Pr}\left(\bigcup_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{A}_{\mathrm{i}}\right)=\sum_{\mathrm{i}=1}^{\mathrm{n}} \operatorname{Pr}\left(\mathrm{A}_{\mathrm{i}}\right)=\sum_{\mathrm{i}=1}^{\mathrm{n}}p_i^2 Pr(i=1nAi)=i=1nPr(Ai)=i=1npi2。所以任取两个样本,不属于同一类别的概率为 1 − ∑ i = 1 n p i 2 1-\sum_{\mathrm{i}=1}^{\mathrm{n}}p_i^2 1i=1npi2,该说法得证。在多分类问题中,基尼系数的含义也是同样的

引入划分后的公式

当引入某个用于划分样本空间的条件(如“满意度<5”)时,分类后的基尼系数公式如下,其中S1、S2为划分后的两类各自的样本量, g i n i ( T 1 ) gini(T_1) gini(T1) g i n i ( T 2 ) gini(T_2) gini(T2)为两类各自的基尼系数。

gini ⁡ ( T ) = S 1 S 1 + S 2 gini ⁡ ( T 1 ) + S 2 S 1 + S 2 gini ⁡ ( T 2 ) \operatorname{gini}(T)=\frac{S_{1}}{S_{1}+S_{2}} \operatorname{gini}\left(T_{1}\right)+\frac{S_{2}}{S_{1}+S_{2}} \operatorname{gini}\left(T_{2}\right) gini(T)=S1+S2S1gini(T1)+S1+S2S2gini(T2)

举个例子,一个初始样本中有1000个员工,其中已知有400人离职,600人不离职,划分前该系统的基尼系数为 1 − ( 0. 4 2 + 0. 6 2 ) = 0.48 1-(0.4^2+0.6^2)=0.48 10.420.620.48
下面采用两种方式决定根节点:一是根据“满意度<5”进行分类;二是根据“收入<10000元”进行分类。

划分方式1:以“满意度<5”为根节点进行划分,如下图所示,1000个员工中,200个人是满意度<5的,另外有800个人满意度>=5。计算过程如下。

  • T1的基尼系数: g i n i ( T 1 ) = 1 − ( 1 2 + 0 2 ) = 0 gini(T_1)=1-(1^2+0^2)=0 gini(T1)112020
  • T2的基尼系数: g i n i ( T 2 ) = 1 − ( 0.2 5 2 + 0.7 5 2 ) = 0.375 gini(T_2)=1-(0.25^2+0.75^2)=0.375 gini(T2)10.2520.7520.375
  • 综上,划分后的基尼系数就是
    gini ⁡ ( T ) = 200 1000 × 0 + 800 1000 × 0.375 = 0.3 \begin{aligned} \operatorname{gini}(T)&= \frac{200}{1000} \times 0+ \frac{800}{1000} \times 0.375= 0.3 \end{aligned} gini(T)=1000200×0+1000800×0.375=0.3

划分方式2:以“收入<10000元”为根节点进行划分,如下图所示,1000个员工中,有400个人收入小于10000元,另外600人收入>=10000元计算过程如下。

T1的基尼系数: g i n i ( T 1 ) = 1 − ( 0.2 5 2 + 0.7 5 2 ) = 0.375 gini(T1)=1-(0.25^2+0.75^2)=0.375 giniT110.2520.7520.375
T2的基尼系数: g i n i ( T 2 ) = 1 − ( 0. 5 2 + 0. 5 2 ) = 0.5 gini(T2)=1-(0.5^2+0.5^2)=0.5 giniT210.520.520.5

  • 综上,划分后的基尼系数就是
    gini ⁡ ( T ) = 400 1000 × 0.375 + 600 1000 × 0.5 = 0.45 \begin{aligned} \operatorname{gini}(T)&= \frac{400}{1000} \times 0.375+ \frac{600}{1000} \times 0.5= 0.45 \end{aligned} gini(T)=1000400×0.375+1000600×0.5=0.45

可以看到,划分前的基尼系数为0.48,以“满意度<5”为根节点进行划分后的基尼系数为0.3,而以“收入<10000元”为根节点进行划分后的基尼系数为0.45。基尼系数越低表示系统的混乱程度越低(纯度越高),区分度越高,越适合用于分类预测,因此这里选择“满意度<5”作为根节点

划分后公式的理解

如何理解划分后的基尼系数公式?在划分前,样本空间是全集。划分将决策树的分为了若干个树节点,每个树节点相当于一个样本空间子集。所以公式中将各个划分样本计算基尼系数后,按权重相加的方式,相当于计算每个划分样本空间基尼系数的加权和

信息熵、信息增益

这里建议阅读原文决策树模型及案例(Python),对某个样本空间X计算信息熵的公式为:
H ( X ) = − ∑ p i log ⁡ 2 ( p i ) ( i = 1 , 2 … … n ) H(X)=-\sum p_{i} \log _{2}\left(p_{i}\right) \quad\left(i=1,2 \ldots \ldots{ }{\text n}\right) H(X)=pilog2(pi)(i=1,2n)
进行某种变量A划分后(比如“满意度<5”),信息熵的计算公式如下。则根据变量A划分后的信息熵又称为条件熵。
H A ( X ) = S 1 S 1 + S 2 H ( X 1 ) + S 2 S 1 + S 2 H ( X 2 ) H_{A}(X)=\frac{S_{1}}{S_{1}+S_{2}} H\left(X_{1}\right)+\frac{S_{2}}{S_{1}+S_{2}} H\left(X_{2}\right) HA(X)=S1+S2S1H(X1)+S1+S2S2H(X2)

什么是信息增益?为了衡量不同划分方式降低信息熵的效果,还需要计算分类后信息熵的减少值(原系统的信息熵与分类后系统的信息熵之差),该减少值称为熵增益或信息增益,其值越大,说明分类后的系统混乱程度越低,即分类越准确。

假设某样本的初始信息熵为 H ( X ) = 0.97 H(X)=0.97 H(X)=0.97

  • 按照某划分后,信息熵为 H A ( X ) = 0.65 H_A(X)=0.65 HA(X)=0.65,那么信息增益为 0.97 − 0.65 = 0.32 0.97-0.65=0.32 0.970.65=0.32
  • 如果按照另一个划分后,信息熵为 H B ( X ) = 0.3 H_B(X)=0.3 HB(X)=0.3,此时信息增益为 0.97 − 0.3 = 0.67 0.97-0.3=0.67 0.970.3=0.67
  • 对比两种划分,显然后者的划分能带来更多的信息增益,所以后者划分更好。

如何理解信息熵

参考信息熵为什么要定义成-Σp*log§?。

有从需求出发解释的,Intuitive explanation of entropy回答者认为,这是为了定义一种指标,能否符合给定的需要,最终选中了对数函数。

有从事件的意外性(suprise值)与信息含量解释的,越低发生的事件通常包含越高的信息量,反之亦然。但这种解释只能是抽象的,并不严格。

我的理解是,在通信场景中,你需要为各种符号(A、B、C等等符号)作编码,通常使用二进制编码。各种符号的出现频率不一样,有的符号出现频繁,其它的符号出现得较少。为了让总编码数较低,你可以为出现频繁的符号分配较少的编码,再为出现稀少的符号分配较多的编码,就可以达到更少的平均编码长度。

那么最优编码时,根据6.信息论(一):信息量、熵和最优编码:

经过上面的证明可知,小明只需要用前缀编码,且码长满足 l o g r 1 p i log_r{\frac{1}{pi}} logrpi1便可获得最优的编码长度。

可知,某符号的最优编码长度其实就是suprise值,而他们的概率加权和=最优平均编码长度=信息熵的公式

两种指标的对比

基尼系数涉及平方运算,而信息熵涉及相对复杂的对数函数运算,因此,目前决策树模型默认使用基尼系数作为建树依据,运算速度会较快。

划分策略

有一些常见的策略,可以用来生成决策树,比如ID3, c4.5 and CART。接下来本章会逐个介绍这三个算法。

ID3

ID3是相对容易理解的策略,它使用信息熵来衡量决策树的划分好坏,并根据信息增益来找出最佳的划分方式。ID3全称为Iterative Dichotomiser 3,翻译成中文就是"迭代二叉树第3代",可见这个算法是有迭代过程的。那么读者可以思考:

  1. 该算法在一轮迭代中会做什么行为?
  2. 迭代的终止条件是什么?

定义

本节总结自 决策树算法–ID3算法。

首先了解该迭代算法的定义。假设有一个数据集D,包含了若干样本,每个样本有若干个属性 { A , B , C . . . } \left\{ A,B,C... \right\} {A,B,C...},以及标签值。那么,我们首先能计算出数据集D的信息熵 E n t r o p y ( D ) Entropy(D) Entropy(D)

接下来,我们要尝试从所有属性中找出一个属性,对数据集D作划分,并选择能带来最大信息增益的那个属性。
我们先看向属性A(A有k个值, [ a 1 , a 2 , . . . , a k ] [a_1, a_2, ..., a_k] [a1,a2,...,ak]),属性A能将数据集D划分为若干个子集,我们去计算划分后的信息增益:
g a i n ( D ∣ A ) = E n t r o p y ( D ) − E n t r o p y ( D ∣ A ) gain(D|A)=Entropy(D)-Entropy(D|A) gain(DA)=Entropy(D)Entropy(DA)
这样,就能知道使用属性A划分数据集能够降低多少信息熵,减少"不确定性"。依次所有属性的信息增益 g a i n ( D ∣ A ) , g a i n ( D ∣ B ) , . . . gain(D|A),gain(D|B),... gain(DA),gain(DB),...然后选择最大值的那个属性,便是这轮迭代的划分最优选。

然后,对每个子集继续迭代,直到没有特征选择,或者标签完全一样了为止,这边是迭代的终止条件了。

用更结构化的语言来描述算法

  1. 从根节点开始,计算所有属性的信息增益,选择信息增益最大的属性作为节点的划分特征;
  2. 由该特征的不同取值建立子节点;
  3. 再对子节点递归1-2步,构建决策树;
  4. 直到没有属性可以选择或类别完全相同为止,得到最终的决策树。

举例

本节总结来自深入浅出理解决策树算法(二)-ID3算法与C4.5算法

接下来用示例进一步解释ID3算法。假设数据集有一批西瓜样本,每个西瓜有属性{色泽, 根蒂, 敲声, …},标签为"好瓜"(取值是或否)。如下图所示,分割线上半部分的样本,其标签"好瓜"都为是,分割线下半部分的样本,其标签"好瓜"都为否。

正例(好瓜)占 8/17,反例占 9/17 ,根结点的信息熵为。
Ent ⁡ ( D ) = − ∑ k = 1 2 p k log ⁡ 2 p k = − ( 8 17 log ⁡ 2 8 17 + 9 17 log ⁡ 2 9 17 ) = 0.998 \operatorname{Ent}(D)=-\sum_{k=1}^{2} p_{k} \log _{2} p_{k}=-\left(\frac{8}{17} \log _{2} \frac{8}{17}+\frac{9}{17} \log _{2} \frac{9}{17}\right)=0.998 Ent(D)=k=12pklog2pk=(178log2178+179log2179)=0.998

计算各属性的信息增益

接下来,计算当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感}中每个属性的信息增益。

先选择色泽属性计算信息增益。色泽有3个可能的取值:{青绿,乌黑,浅白}

  • D1(色泽=青绿) = {1, 4, 6, 10, 13, 17},正例 3/6,反例 3/6
  • D2(色泽=乌黑) = {2, 3, 7, 8, 9, 15},正例 4/6,反例 2/6
  • D3(色泽=浅白) = {5, 11, 12, 14, 16},正例 1/5,反例 4/5

3 个分支结点的信息熵
Ent ⁡ ( D 1 ) = − ( 3 6 log ⁡ 2 3 6 + 3 6 log ⁡ 2 3 6 ) = 1.000 Ent ⁡ ( D 2 ) = − ( 4 6 log ⁡ 2 4 6 + 2 6 log ⁡ 2 2 6 ) = 0.918 Ent ⁡ ( D 3 ) = − ( 1 5 log ⁡ 2 1 5 + 4 5 log ⁡ 2 4 5 ) = 0.722 \begin{array}{l} \operatorname{Ent}\left(D^{1}\right)=-\left(\frac{3}{6} \log _{2} \frac{3}{6}+\frac{3}{6} \log _{2} \frac{3}{6}\right)=1.000 \\ \operatorname{Ent}\left(D^{2}\right)=-\left(\frac{4}{6} \log _{2} \frac{4}{6}+\frac{2}{6} \log _{2} \frac{2}{6}\right)=0.918 \\ \operatorname{Ent}\left(D^{3}\right)=-\left(\frac{1}{5} \log _{2} \frac{1}{5}+\frac{4}{5} \log _{2} \frac{4}{5}\right)=0.722 \end{array} Ent(D1)=(63log263+63log263)=1.000Ent(D2)=(64log264+62log262)=0.918Ent(D3)=(51log251+54log254)=0.722

那么我们可以知道属性色泽的信息增益是:
Gain ⁡ ( D ,  色泽  ) = Ent ⁡ ( D ) − ∑ v = 1 3 ∣ D v ∣ ∣ D ∣ Ent ⁡ ( D v ) = 0.998 − ( 6 17 × 1.000 + 6 17 × 0.918 + 5 17 × 0.722 ) = 0.109. \begin{aligned} \operatorname{Gain}(D, \text { 色泽 }) & =\operatorname{Ent}(D)-\sum_{v=1}^{3} \frac{\left|D^{v}\right|}{|D|} \operatorname{Ent}\left(D^{v}\right) \\ & =0.998-\left(\frac{6}{17} \times 1.000+\frac{6}{17} \times 0.918+\frac{5}{17} \times 0.722\right) \\ & =0.109 . \end{aligned} Gain(D, 色泽 )=Ent(D)v=13DDvEnt(Dv)=0.998(176×1.000+176×0.918+175×0.722)=0.109.

同理,我们可以求出其它属性的信息增益,分别如下:
Gain ⁡ ( D , 根蒂 ) = 0.143 ; Gain ⁡ ( D , 敲声 ) = 0.141 ; Gain ⁡ ( D , 纹理 ) = 0.381 ; Gain ⁡ ( D , 脐部 ) = 0.289 ; Gain ⁡ ( D , 触感 ) = 0.006. \begin{array}{l} \operatorname{Gain}(D, \text {根蒂})=0.143 ; \operatorname{Gain}(D, \text {敲声})=0.141 ; \\ \operatorname{Gain}(D, \text {纹理})=0.381 ; \operatorname{Gain}(D, \text {脐部})=0.289 ; \\ \operatorname{Gain}(D, \text {触感})=0.006 . \end{array} Gain(D,根蒂)=0.143;Gain(D,敲声)=0.141;Gain(D,纹理)=0.381;Gain(D,脐部)=0.289;Gain(D,触感)=0.006.
于是我们找到了信息增益最大的属性纹理,它的Gain(D,纹理) = 0.381最大。

选取最优属性作划分

于是我们选择的划分属性为“纹理”,根据"纹理"可以将原数据集划分为3个子集,如图,根节点下有三个子结点:

对子节点作递归划分

对于这三个子节点,我们可以递归的使用刚刚找信息增益最大的方法进行选择特征属性,

比如对于第一个子节点,D1(纹理=清晰) = {1, 2, 3, 4, 5, 6, 8, 10, 15},第一个分支结点可用属性集合{色泽、根蒂、敲声、脐部、触感},基于 D1各属性的信息增益,分别求得如下:
Gain ⁡ ( D 1 , 色泽  ) = 0.043 ; Gain ⁡ ( D 1 , 根蒂  ) = 0.458 ; Gain ⁡ ( D 1 , 敲声  ) = 0.331 ; Gain ⁡ ( D 1 , 脐部  ) = 0.458 ; Gain ⁡ ( D 1 , 触感  ) = 0.458. \begin{array}{l} \operatorname{Gain}\left(D^{1} \text {, 色泽 }\right)=0.043 ; \operatorname{Gain}\left(D^{1}\text {, 根蒂 }\right)=0.458 ; \\ \operatorname{Gain}\left(D^{1} \text {, 敲声 }\right)=0.331 ; \operatorname{Gain}\left(D^{1} \text {, 脐部 }\right)=0.458 ; \\ \operatorname{Gain}\left(D^{1} \text {, 触感 }\right)=0.458 . \end{array} Gain(D1色泽 )=0.043;Gain(D1根蒂 )=0.458;Gain(D1敲声 )=0.331;Gain(D1脐部 )=0.458;Gain(D1触感 )=0.458.
其中根蒂,脐部,触感三个特征属性的信息增益相等并且最大,于是我们可以选择其中的任意一个。

其它俩个子结点同理,然后得到新一层的结点,再递归的由信息增益进行构建树即可

生成结果

我们最终的决策树如下:

ID3的缺点

从上面求解信息增益的公式中,其实可以看出,信息增益准则其实是对可取值数目较多的属性有所偏好。
什么意思呢?假如我们把数据集中的“编号”也作为一个候选划分属性。我们可以算出“编号”的信息增益是0.998。因为每一个样本的编号都是不同的,信息熵为0。也就是说,来了一个预测样本,你只要告诉我编号,其它特征就没有用了,这样生成的决策树显然不具有泛化能力。

于是,我们就引入了信息增益率来选择最优划分属性,接下来要介绍C4.5算法了。

C4.5

本节参考决策树(上)-ID3、C4.5、CART 、深入浅出理解决策树算法(二)-ID3算法与C4.5算法

这次我们每次进行选取特征属性的时候,不仅会考虑ID3算法的信息增益,还会考虑信息增益率这个指标。

信息增益率

先看信息增益率的公式如下。可以看出,信息增益率=信息增益/IV(a),其中IV(a)称为属性a的固定值
Gain ⁡ ratio ⁡ ( D , a ) = Gain ⁡ ( D , a ) IV ⁡ ( a ) \operatorname{Gain} \operatorname{ratio}(D, a)=\frac{\operatorname{Gain}(D, a)}{\operatorname{IV}(a)} Gainratio(D,a)=IV(a)Gain(D,a)
而固定值的公式如下,该特征的形式和信息熵相似,所以读者可将其视作“特征熵”。
IV ⁡ ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ \operatorname{IV}(a)=-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \log _{2} \frac{\left|D^{v}\right|}{|D|} IV(a)=v=1VDDvlog2DDv
这个函数的递增性有如下特点:

  • 当属性a的取值越多,集合会划分更多,固定值也倾向于变大。但是笔者不知道如何证明这一点,所以只能从下文的举例得到一个直观的感受。
  • 当属性a的取值固定时,集合划分越平均,固定值会越大。这个在之前分析信息熵公式时就说明了。

举个例子,在上文的西瓜样本案例中,三种属性的固定值分别如下:

  • IV(触感) = 0.874 ( V = 2 )
  • IV(色泽) = 1.580 ( V = 3 )
  • IV(编号) = 4.088 ( V = 17)

可以看出,属性"编号"会将集合划分成很多个子集,其特征熵很大。而属性"触感"只是将集合划分为两份,其特征熵很小。由此读者能感受到,当选取该属性时,分成的V类别数越大,IV(a)就越大。

优化

信息增益率指标受到固定值的影响,会对可取值较少的特征有所偏好,而这在一定程度上会削减对增益率的偏好。比如某种属性的增益率较低,但它的固定值也很小,使其在增益率排序中靠前,从而被选中。我们虽然会关注固定值,但不应该过于关注它。虽然你可以引入超参数权重,去平衡两者的影响,但实际上你难以确定权重多大才合适。

所以,C4.5并不会直接选择信息增益率最高的属性,而是使用一个启发式方法:先从候选划分特征中找到信息增益高于平均值的特征,这样保证好的特征被选中。再从中选择增益率最高的。这样避免出现编号特征这种极端的情况。

缺点

C4.5规避了ID3的一些缺点,但自己也并不是完美的。

CART

本节参考决策树学习笔记、决策树-CART回归树、决策树(上)-ID3、C4.5、CART、决策树算法–CART分类树算法

CART相较于前两者的改进

ID3 和 C4.5 虽然在对训练样本集的学习中可以尽可能多地挖掘信息,但是其生成的决策树分支、规模都比较大。相比之下,CART算法能规避这些缺点:

  1. 使用二分法来划分节点,这样就只会生成二叉树。相比于前两种算法,能减少决策树分支数。
  2. 设置了一些递归停止条件,防止决策树规模过度生长。
  3. 使用预剪枝、后剪枝策略,适当降低决策树的规模,防止过拟合。

CART的特点

在学习CART前,请记住以下几个关键点:

  1. CART既能是分类树,又能是回归树。这取决于标签的性质:如果标签是"有无贷款"这种离散值,那么构建的是分类树;如果标签是"年龄"这种连续值,那么构建的是回归树。
  2. 当CART是分类树时,采用GINI值作为节点分裂的依据;当CART是回归树时,采用样本的最小方差作为节点分裂的依据。
  3. CART是一棵二叉树。这个特性是不变的。即使属性有多个可选值的离散值,或者是连续值,也都有对应的处理方式。

CART分类树的算法步骤与前两者类似。算法从根节点开始,用训练集递归建立CART分类树。然后迭代完成以下步骤:

  1. 判断是否停止递归。
    • 对于当前节点的数据集为 D D D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归;
    • 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归 ;
  2. 计算当前节点现有各个特征的各个值的基尼指数,
  3. 在计算出来的各个基尼系数中,选择基尼系数最小的特征A及其对应的取值a作为最优特征和最优切分点。该切分点会将本节点的数据集划分成两部分 D 1 D_1 D1 D 2 D_2 D2,同时生成当前节点的两个子节点,其中左节点的数据集为 D 1 D_1 D1,右节点的数据集为 D 2 D_2 D2
  4. 对左右的子节点递归调用1-4步,生成CART分类树;

对生成的CART分类树做预测时,假如测试集里的样本落到了某个叶子节点,而该节点里有多个训练样本。则该测试样本的类别为这个叶子节点里概率最大的类别

节点划分依据

CART树使用基尼系数类评估划分的好坏,基尼系数作为一种评价指标,在上一章已经阐述过原理,这里再列出一次公式。基尼指数反映的是从样本集D中随机抽取两个样本,其类别标记不一致的概率,因此Gini(D)越小越好。
Gini ⁡ ( D ) = ∑ k = 1 ∣ Y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ Y ∣ p k 2 \begin{aligned} \operatorname{Gini}(D) & =\sum_{k=1}^{|\mathcal{Y}|} \sum_{k^{\prime} \neq k} p_{k} p_{k^{\prime}} \\ & =1-\sum_{k=1}^{|\mathcal{Y}|} p_{k}^{2} \end{aligned} Gini(D)=k=1Yk=kpkpk=1k=1Ypk2
进而,使用属性α划分后的基尼指数如下公式,意思是各个子集基尼系数的加权和。
 GiniIndex  ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Gini ⁡ ( D v ) \text { GiniIndex }(D, a)=\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Gini}\left(D^{v}\right)  GiniIndex (D,a)=v=1VDDvGini(Dv)

CART分类树举例

下面我们举例来进一步说明分类树的步骤。

在上述图中,共10条数据,拖欠贷款者属于"标签",是离散值。而属性有3个,分别是:

  1. 有房情况(离散属性且2种取值)
  2. 婚姻状况(离散属性且有3种取值)
  3. 年收入(连续属性)

那么,对于这些属性该如何进行Gini系数的计算以及划分呢?

2种取值的离散值

首先来看有房情况这个属性,因为该属性只有“是”“否”两种取值,所以其Gini系数比较容易计算,那么按照它划分后的Gini指数计算如下:

多种取值的离散值

接下来对婚姻状况进行计算,我们发现婚姻状况一共有三种取值:单身、已婚、离异,又因为Cart分类树只能是二叉树,所以我们只能对多种取值的属性进行组合。

连续值

最后对年收入属性进行计算。年收入属性为连续值,Cart分类树又是如何对连续值属性进行处理的呢?

做法是:将连续特征离散化,假设 n 个样本的连续特征 A 有 m 个取值,C4.5/Cart 将其排序并取相邻两样本值的平均数共 m-1 个划分点,分别计算以该划分点作为二元分类点时的信息增益/Gini系数,并选择信息增益最大/Gini系数最小的点作为该连续特征的二元离散分类点。

以下图为例

  • 属性"年收入"的可选值有 60 , 70 , 75 , . . . , 220 {60,70,75,...,220} 60,70,75,...,220,在它们中间两两设立若干个候选划分点,分别是 65 , 62 , 80 , . . . 172 {65,62,80,...172} 65,62,80,...172
  • 然后,对于每个划分点,计算其将节点分为左右两部分后的基尼值。如图中深绿色框所示,以97为划分点后,左节点分到6个实例,右节点分到4个实例,基尼值为0.300。
  • 在所有划分点中,97所对应的基尼值最低,所以选择它为划分点。

Cart分类树对于连续值的处理其实和C4.5算法对于连续值的处理类似,只不过Cart使用Gini指数,C4.5使用信息增益率

CART回归树举例

当构建回归树时,使用样本方差最小值作为评估指标。回归方差计算公式如下,样本方差公式应该是很熟悉的了,就是计算每个样本与平均值的平方,再求和。方差越大,表示该节点的数据越分散,预测的效果就越差。
S S = σ 2 = ∑ i ∈ I ( x i − μ ) 2 = ∑ i ∈ I x i − n μ 2 SS=\sigma^{2}=\sum_{i \in I}\left(x_{i}-\mu\right)^{2}=\sum_{i \in I} x_{i}-n \mu^{2} SS=σ2=iI(xiμ)2=iIxinμ2
那么如何计算某属性的划分增益呢?由根节点的方差和减去左右节点的方差和,公式如下。其中 S S T = ∑ i ∈ I ( x i − μ ) 2 S S_{T}=\sum_{i \in I}\left(x_{i}-\mu\right)^{2} SST=iI(xiμ)2是根节点的方差和, S S L S S_{L} SSL S S R S S_{R} SSR是左右节点的方差和。
 Gain  = S S T − ( S S L + S S R ) \text { Gain }=S S_{T}-\left(S S_{L}+S S_{R}\right)  Gain =SST(SSL+SSR)

举个例子,对于数据集如下,如何计算它的增益?
 密度   含糖率  0.697 0.460 0.774 0.376 0.634 0.264 0.608 0.318 0.556 0.215 0.403 0.237 0.481 0.149 0.437 0.211 0.666 0.091 \begin{array}{|l|l|} \hline \text { 密度 } & \text { 含糖率 } \\ \hline 0.697 & 0.460 \\ \hline 0.774 & 0.376 \\ \hline 0.634 & 0.264 \\ \hline 0.608 & 0.318 \\ \hline 0.556 & 0.215 \\ \hline 0.403 & 0.237 \\ \hline 0.481 & 0.149 \\ \hline 0.437 & 0.211 \\ \hline 0.666 & 0.091 \\ \hline \end{array}  密度 0.6970.7740.6340.6080.5560.4030.4810.4370.666 含糖率 0.4600.3760.2640.3180.2150.2370.1490.2110.091
首先计算“含糖率”的方差和 S S T S S_{T} SST,然后依次选取“密度”各属性值作为分割点计算左右节点的方差和,当 G a i n Gain Gain达到最大时,得到最优分割点。

通常情况下在依次分割中 S S T S S_{T} SST的值是固定的,所以只要找 S S L + S S R S S_{L}+S S_{R} SSL+SSR的最小值即可。

停止条件

决策树节点停止分裂的一般性条件:

  1. 最小节点数
    当节点的数据量小于一个指定的数量时,不继续分裂。有两点原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。
  2. 熵或者基尼值小于阀值
    由上述可知,熵和基尼值的大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度数,节点停止分裂。
  3. 决策树的深度达到指定的条件
    节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。
  4. 所有特征已经使用完毕,不能继续进行分裂
    被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点。

剪枝策略

为了限制树的规模,可以使用剪枝策略。它分为预剪枝和后剪枝。

预剪枝

预剪枝就是在节点划分之前先进行估计,如果当前节点的划分不能带来决策树泛化性能的提升则停止划分并将当前节点标记为叶节点。

后剪枝

后剪枝是先从训练集中生成一颗完整的决策树,然后自底向上的对非叶节点进行考察,然后根据一定的规则决定是否应将该节点变为叶节点。后剪枝一般需要用到验证集

有三种后剪枝算法,代价复杂度剪枝、代价复杂度剪枝、悲观剪枝。第一种较为经典,是在CART树中提出的。建议还是看原文决策树学习笔记的“3.2 后剪枝”一章

总结

3种决策树的比较如下,可见CART树的能力是比较全面的,不仅支持连续值、缺失值、剪枝算法,还能构建分类树和回归树。

本文先讲解了决策树的评估指标,再循序渐进地介绍了3种决策树。对于每种决策树,不仅介绍了算法过程,还举例说明。本文每一章都引用了其它参考文献,并按照笔者的理解进行拼凑,以便读者更顺利地学习。虽然本文篇幅较长,实际上3种决策树的创新点并不很多,只要记住关键点就能理解。

其实算法面试基本不会考吧?可是反正我也失业了,就随着性子学知识吧。这辈子就这样了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下使用C语言创建定时器并周期和网络调试助手通信

在Windows C下采用timeSetEvent函数来设置定时器 关于timeSetEvent的函数原型及注释如下所示&#xff1a; MMRESULT timeSetEvent(UINT uDelay, // 定时事件的触发周期&#xff0c;单位为毫秒UINT uResolution, // 定时事件的精度&#xff0c;单位…

161-183-mysql-高级篇-事务-锁-mvcc

116-mysql-事务篇-锁&#xff1a; 推荐网站 mysql学习网站&#xff1a;https://www.bilibili.com/video/BV1iq4y1u7vj?p109&vd_source39a1ba1654411bc9ab90f6f2926600b7 mysql&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/ 算法&#xff1a;https://www.cs.us…

我看世界杯——来自一个“假”球迷视角

世界杯还有一个星期就要结束了&#xff0c;说实话&#xff0c;我之前是一场球都没有&#xff0c;对足球知道也甚少&#xff0c;妥妥一个假球迷了。这次世界杯感觉离自己特别近&#xff0c;身边的很多朋友都在看&#xff0c;也不乏赌球的小伙伴&#xff0c;自己的感悟也比较深&a…

电机定子模态的空间特征

对于电机定子模态而言&#xff0c;通常不是按传统的阶次顺序&#xff08;按频率从小到大&#xff09;来描述它们&#xff0c;而是按空间节点数的顺序来描述&#xff0c;这在很大程度上是因为受激励的电磁力波的振型的影响。 1、传统模态阶次表示方式 传统模态阶次的顺序都是按…

安卓期末大作业——个人简历APP源码和设计报告

Android课程需求文档 设计题目&#xff1a; 个人简历APP 学生姓名&#xff1a; 学号&#xff1a; 1&#xff0e;Smart.apk功能设计说明 Android真机运行进入该app。背景音乐服务播放正常&#xff0c;并设置可通过右上角按钮关闭musicservice&#xff1b; 1通过viewpager实…

Jenkins+SonarQube 代码质量检测详解

一、SonarQube 概述 1、SonarQube 简介 Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。 Sonar Qube通过插件机制,Sonar可以集成不同的测试工具,代码分析工具…

【JavaWeb开发-Servlet】将项目打包部署在本地

Servlet与JSP进阶十&#xff1a;Web应用程序打包与发布&#xff08;war包&#xff09;_小枯林的博客-CSDN博客_servlet项目如何打成war包本篇博客主要内容是&#xff1a; ●如何使用Eclipse打war包&#xff1b; ●打好的war包如何发布&#xff1b;访问演示&#xff1b; ●解决u…

如何使用ChatGPT辅助AI绘画?

如何使用ChatGPT辅助AI绘画&#xff1f; AI自动化内容生成&#xff08;AIGC&#xff09;是一种利用人工智能技术生成新内容的方法。它可以快速、自动、准确地从大量原始数据中生成新内容&#xff0c;大大提高了内容创作效率。AIGC 使用机器学习算法&#xff0c;自动识别文本特…

【MySQL】触发器

目录 概述 操作-创建触发器 操作-NEW与OLD 其他操作 注意事项 概述 介绍 触发器&#xff0c;就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据 库服务器上的SQL片段&#xff0c;但是触发器无需调用&#xff0c;当对数据库表中的数据执…

微信小程序|前端技术主要框架分析

1.框架 微信提供了一套自己的用于开发小程序的前端框架,和目前主流的前端框架相比,其既有类似的地方,也有特殊的地方。 特殊的地方在于其只能在微信小程序开发工具内使用,并做了相对严格的使用和配置限制,开发者必须按照其规定的用法来使用。一些外部的框架和插件在小程…

apis-day7综合案例

apis-day7综合案例-小兔鲜案例注册 需求①&#xff1a; 发送验证码 用户点击之后&#xff0c;显示 05秒后重新获取 时间到了&#xff0c;自动改为 重新获取 需求②&#xff1a; 用户名验证&#xff08;注意封装函数 verifyxxx&#xff09; 正则 /1{6,10}$/ 如果不符合要求…

非零基础自学Golang 第1章 走进Go 1.1 Go编程语言概述 1.1.3 使用Go 语言的项目

非零基础自学Golang 文章目录非零基础自学Golang第1章 走进Go1.1 Go编程语言概述1.1.3 使用Go 语言的项目第1章 走进Go 1.1 Go编程语言概述 1.1.3 使用Go 语言的项目 Go语言在2009年首次公开发布后受到越来越多的开发者的关注&#xff0c;Go语言社区不断壮大&#xff0c;开源…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Deep Learning Task Tips

文章目录一、深度学习步骤回顾二、常规指导三、训练过程中Loss很大3.1 原因1&#xff1a;模型过于简单3.2 原因2&#xff1a;优化得不好3.3 原因1 or 原因2 &#xff1f;四、训练过程Loss小。测试过程Loss大4.1 原因1&#xff1a;过拟合 Overfitting4.2 原因2&#xff1a;Misma…

windows 10 HBase保姆级安装教程

安装HDFS 将下载好的hadoop-2.6.5.zip解压到自己的磁盘文件&#xff0c;将解压后的文件夹hadoop-2.6.5重命名为hadoop&#xff1b; 解压hadoopbin.zip&#xff0c;将解压后的文件夹打开&#xff0c;里面的文件复制到上一步的hadoop文件夹下的bin文件&#xff0c;直接覆盖同名文…

蓝牙模块HC-05使用指南

概述 HC-05蓝牙模块是一种基于蓝牙协议的简单无线通信设备。该模块基于BC417单芯片蓝牙IC&#xff0c;符合蓝牙v2.0标准&#xff0c;支持UART和USB接口。 具有两种工作模式&#xff1a;命令响应工作模式和自动连接工作模式。 当模块处于命令响应工作模式&#xff08;或者AT模…

文件传输利器Croc

概述 一般而言&#xff0c;Linux系统是没有用户界面的&#xff0c;所有操作都是在命令行里。 然后在安装搭建集群&#xff0c;如分布式的Hadoop集群时&#xff0c;经常需要在多个Server之间传输文件。两个server之间的文件传输&#xff0c;一般会想到FTP或SSH两种方式。使用F…

监控系列(二)Dem对接Prometheus+grafana显示

一、概括 本篇不涉及达梦数据库搭建以及Dem的搭建&#xff0c;操作环境需提前准备prometheus以及grafana的搭建&#xff0c;请跳转到前文查看整体的对接流程如图所示 二、Dem对接prometheus 前提 需确保当前Dem&#xff0c;已有集群纳入监管 配置Dem的监控机器数据指标 prome…

第十九章 Bellman-Ford算法(由SPFA算法逆推BF,独特解读,超级详细)

第十九章 Bellman-Ford算法一、SPFA算法回顾&#xff1a;二、Bellman-Ford算法1、算法推导&#xff1a;1、算法模板&#xff1a;三、例题&#xff1a;1、问题&#xff1a;2、模板&#xff1a;3、分析&#xff1a;一、SPFA算法回顾&#xff1a; 我们在第18章中利用dijkstra算法…

【多数据源动态切换】Spring Boot中实现多数据源动态切换效果(1):通过继承AbstractRoutingDataSource类实现

在Spring Boot中&#xff0c;可以通过多种方式实现多数据源的动态切换效果&#xff0c;本篇介绍第一种实现方案。 一 AbstractRoutingDataSource Spring Boot提供了org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 这个类&#xff0c;其中#determineC…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园花卉销售系统ef5ox(1)

做毕业设计一定要选好题目。毕设想简单&#xff0c;其实很简单。这里给几点建议&#xff1a; 1&#xff1a;首先&#xff0c;学会收集整理&#xff0c;年年专业都一样&#xff0c;岁岁毕业人不同。很多人在做毕业设计的时候&#xff0c;都犯了一个错误&#xff0c;那就是不借鉴…