21.决策树(ID3/C4.5/CART)

孤街浪徒 提交于 2020-12-27 06:31:10

总览

算法   功能  树结构  特征选择  连续值处理 缺失值处理  剪枝 
ID3  分类  多叉树  信息增益   不支持 不支持  不支持
C4.5  分类  多叉树  信息增益比   支持 支持 支持
CART  分类/回归  二叉树  基尼系数,均方差   支持 支持  支持

1.ID3(分类)

信息熵:随机变量不确定性的度量

$$H(D) = -\sum\limits_{k=1}^{K}\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|}$$

条件信息熵:在特征A给定的条件下对数据集D分类的不确定性

$$H(D|A) = -\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}H(D_i)=-\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}\sum\limits_{k=1}^{K}\frac{|D_{ik}|}{|D_i|}log_2(\frac{|D_{ik}|}{|D_i|})$$

信息增益:知道特征A的信息而使类D的信息的不确定减少的程度(对称)

$$I(D,A) = H(D) - H(D|A)$$

分裂标准:寻找信息增益大的特征

缺点:

  • 存在偏向于选择取值较多的特征问题
  • 仅适用于类别特征,连续值不适用
  • 没考虑缺失值处理
  • 没考虑过拟合的问题

2.C4.5(分类)

对ID3算法的改进: 

  • 信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足$I_R(D,A) = \frac{I(A,D)}{H_A(D)}$,分母为特征熵:$H_A(D) = -\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}$,其中D为样本特征输出的集合,A为特征。特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益任意偏向于取值较多的特征的问题。
  • 连续的特征离散化比如m个样本的连续特征A有m个,从小到大排列为$a_1,a_2,...,a_m$,则C4.5取相邻两样本值的平均值,一共取得m-1个划分点,其中第i个划分点$T_i = \frac{a_i+a_{i+1}}{2}$,对于这m-1个点,分别计算以该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为$a_t$,则小于$a_t$的值为类别1,大于$a_t$的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。
  • 缺失值处理:
    • 在选择分裂属性的时候,训练样本存在缺失值,如何处理?
      • 对于某一个有缺失特征值的特征A。C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值A的数据D1,另一部分是没有特征A的数据D2. 然后对于没有缺失特征A的数据集D1来和对应的A特征的各个特征值一起计算加权重后的信息增益比,最后乘上一个系数,这个系数是无特征A缺失的样本加权后所占加权总样本的比例。
    • 分类属性选择完成,对训练样本分类,发现属性缺失怎么办?
      • 可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9。
  • 在树构造过程中进行剪枝;  

缺点:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。此外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

 

3.CART(分类/回归)

(1)分类

假设有K个类别,第k个类别的概率为$p_k$

$$Gini(p) = \sum\limits_{k=1}^{K}p_k(1-p_k) = 1- \sum\limits_{k=1}^{K}p_k^2$$

如果K=2,则基尼系数为:

$$Gini(p) = 2p(1-p)$$

样本D的基尼系数:

$$Gini(D) = 1-\sum\limits_{k=1}^{K}(\frac{|C_k|}{|D|})^2$$

对于样本D,如果根据特征A的某个值,把D分成D1和D2,则在特征A的条件下,D的基尼系数为:

$$Gini(D,A) = \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)$$

连续特征处理:

  • 对于CART分类树连续值的处理问题,其思想和C4.5是相同的,都是将连续的特征离散化。唯一的区别在于在选择划分点时的度量方式不同,C4.5使用的是信息增益比,则CART分类树使用的是基尼系数。要注意的是,与ID3或者C4.5处理离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。具体参考

离散特征处理:

  • 二分离散
  • 在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},然后建立二叉树节点,一个节点是A2对应的样本,另一个节点是{A1,A3}对应的节点。同时,由于这次没有把特征A的取值完全分开,后面我们还有机会在子节点继续选择到特征A来划分A1和A3。这和ID3或者C4.5不同,在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。

分类树建立过程:参考链接

(2)回归

除了概念的不同,CART回归树和CART分类树的建立和预测的区别主要有下面两点:

  • 连续值的处理方法不同,回归使用均方差最小

   对于任意划分特征A,对应的任意划分点s两边划分成的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点。其中,c1为D1数据集的样本输出均值,c2为D2数据集的样本输出均值。

  

  • 决策树建立后做预测的方式不同

(3)剪枝

  • step1:从原始决策树生成各种剪枝效果的决策树;
  • step2:用交叉验证来检验剪枝后的预测能力,选择泛化预测能力最好的剪枝后的数作为最终的CART树。

剪枝的损失函数度量,对于任意的一棵子树T:  

其中,α为在正则化参数,$C(T_t)$为训练数据的预测误差,分类树是用基尼系数度量,回归树是均方差误差

  • 当$\alpha=0$时,没有正则化,原始生成的CART树即为最优子树
  • 当$\alpha=\infty$,即正则化强度达到最大,此时,由原始生成的CART树的根节点组成的单节点树为最优子树。
  • 对于固定的$\alpha$,一定存在使损失函数$C_\alpha(T)$最小的子树。

对于任意一个内节点t的子树$T_t$:

  • 如果没有剪枝,损失为$C_{\alpha}(T_t) = C(T_t) + \alpha |T_t|$
  • 如果剪枝,仅仅保留根节点,则损失为$C_{\alpha}(T) = C(T) + \alpha$

$\alpha$对损失值的影响:

  • 当$\alpha=0$或者很小时,$C_{\alpha}(T_t) < C_{\alpha}(T)$
  • 当$\alpha$增大到一定程度,$C_{\alpha}(T_t) = C_{\alpha}(T)$
  • 当$\alpha$继续增大,$C_{\alpha}(T_t) > C_{\alpha}(T)$

当$\alpha = \frac{C(T)-C(T_t)}{|T_t|-1}$时,$T_{t}$和T有相同的损失函数,但是T节点更少,因此可以对子树$T_t$进行剪枝,也就是将它的子节点全部剪掉,变为一个叶子节点T。 可以计算出每个子树是否剪枝的阈值$\alpha$,如果我们把所有的节点是否剪枝的值αα都计算出来,然后分别针对不同的$\alpha$所对应的剪枝后的最优子树做交叉验证。这样就可以选择一个最好的$\alpha$,有了这个$\alpha$,我们就可以用对应的最优子树作为最终结果。

CART剪枝算法:

  • 输入:CART生成树T
  • 输出:最优决策子树$T_\alpha$

step1:初始化$\alpha_{min}=\infty$, 最优子树集合$ω={T}$

step2:自下而上计算各内部节点t的训练误差损失函数$C_{\alpha}(T_t)$(回归树为均方差,分类树为基尼系数),叶子节点数$T_{t}$,以及 正则化阈值$\alpha= min\{\frac{C(T)-C(T_t)}{|T_t|-1}, \alpha_{min}\}$,更新$\alpha_{min}=\alpha$

step3:得到所有节点的$\alpha$值的集合M

step4:从M中选择最大的$\alpha_{k}$,自上而下的访问子树t的内部节点,如果$\frac{C(T)-C(T_t)}{|T_t|-1} \leq \alpha_k$时,进行剪枝。并决定叶节点t的值,如果是分类树,则是概率最高的类别,如果是回归树,则是所有样本输出的均值,这样得到$\alpha_k$对应的最优子树$T_k$。

step5:最优子树集合$\omega=\omega \cup T_k,M= M -\{\alpha_k\}$

step6:如果M不空,则回到step4,否则就已经得到了所有的可选最优子树集合$\omega$

step7:采用交叉验证在$\omega$选择最优子树$T_{\alpha}$

 

4.样本不均衡

方法一:加上类别权重和样本权重,即样本数少的类别样本权重高,在sklearn中即为iclass_weight和sample_weight两个参数。

方法二:采样,即通过采样增加少数类别样本数,或者子采样选择部分多数类别样本数,以达到类别平衡。

 

5.决策树的优缺点

优点:  

  • 计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据(对缺失值很宽容)
  • 非黑盒,可解释性
  • 轻松去除无关的属性(Gain=0)
  • 可以处理区间型变量(Interval)(训练速度视数据规模而定) 
  • 分类速度快(O(depth),针对类别型变量和次序型变量)
  • 对数据分布没有特别严格的要求 
  • 可以同时对付数据中线性和非线性的关系 
  • 可作为有效工具来帮助其他模型挑选自变量 
  • 使用信息原理对大样本的属性进行信息量分析,并计算各属性的信息量,找出反映类别的重要属性,可准确、高效地发现哪些属性对分类最有意义。(如区间型变量的分箱操作) 

缺点:   

  • 单棵决策树分类能力弱,并且对连续值变量难以处理;
  • 容易过拟合(后续出现了随机森林,减小了过拟合现象);
  • 对有时间顺序的数据,需要很多预处理的工作(连续型目标变量不太适用);
  • 当类别太多时,错误可能就会增加的比较快;
  • 在处理特征关联性比较强的数据时表现得不是太好
  • 缺乏诸如回归或聚类丰富多样的检测指标和评价方法 
  • 对training set rotation敏感,可以用pca解决或者斜决策树 
  • 对训练集数据的微小变化敏感 
  • 决策树算法对区间型自变量进行分箱操作时,无论是否考虑了顺序因素,都有可能因为分箱丧失某些重要的信息。尤其是当分箱前的区间型变量与目标变量有明显的线性关系时,这种分箱操作造成的信息损失更为明显。

 

参考文献:

【1】决策树算法原理(下)(刘建平大佬)

【2】分类回归树CART(上)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!