机器学习——决策树

1 历史

  决策树算法起源于E.B.Hunt等人于1966年提出,但真正让决策树成为机器学习主流算法的还是Quinlan(罗斯.昆兰)大神。昆兰在1979年提出了ID3算法,掀起了决策树研究的高潮。现在最常用的决策树算法是C4.5是昆兰在1993年提出的。为什么叫C4.5?因为昆兰提出ID3后,掀起了决策树研究的高潮,然后ID4,ID5等名字被占用,因此昆兰只好让自己对ID3的改进叫做C4.0,而C4.5是C4.0的改进。

2 前言

  决策树是一种基本的分类和回归方法。决策树呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。

  学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。

  决策树学习通常包括三个步骤:

    $\cdot$特征选择

    $\cdot$决策树生成

    $\cdot$决策树剪枝

3 决策树的基本概念

  • 决策树就是一棵树,一颗决策树包含一个根节点、若干个内部结点和若干个叶结点;
  • 叶结点对应于决策结果,其他每个结点则对应于一个属性测试;
  • 每个结点包含的样本集合根据属性测试的结果被划分到子结点中;
  • 根结点包含样本全集,从根结点到每个叶子结点的路径对应了一个判定测试序列。

  下面直接上个图,让大家看下决策树是怎样决策的(以二元分类为例),图中红线表示给定一个样例(表中数据)决策树的决策过程:

  

4 特征选择及算法

  特征选择在于选取对训练数据具有分类能力的特征。

  特征选择的基本方法有三种:

    ID3的信息增益、C4.5的信息增益比、CART的基尼系数

4.1 信息增益

   设训练数据集为$D$,$|D|$表示其样本容量,即样本个数。设有 $K$个类$C_{k}$,$k=1,2,3...,K$,$|C_{k}|$为属于类$C_{k}$的样本个数,$\sum \limits _{k=1}^{K} |C_{k}|=|D|$。设特征 $ $有$n$个不同的取值,${a_{1},a_{2},...a_{n}}$,根据特征 $A$的取值将 $D$划分为 $n$个子集${D_{1},D_{2},...D_{n}}$,$|D_{i}|$为$D_{i}$的样本个数,$\sum \limits_{i=1}^{n} |C_{i}|=|D|$。记子集$D_{i}$中属于类$C_{k}$的样本的集合为$D_{ik}$,即$D_{ik}=D_{i}\cap C_{k}$,$|D_{ik}|$为$D_{ik}$的样本个数。

  信息增益算法步骤如下:

  输入:训练数据集和特征$A$;

  输出:特征$A$对训练数据集D的信息增益$g(D,A)$.

  (1)计算数据集$D$的经验熵$H(D)$

    $H(D)=-\sum \limits_{k=1}^{K} \frac{|C_{k}|}{|D|}log_{2}\frac{|C_{k}|}{|D|}$

  (2)计算特征$A$对数据集$D$的经验条件熵$H(D|A)$

    $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}|}$

  (3)计算信息增益

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

  例子:对所给训练数据集D,根据信息增益准则选择最优特征。

表5.1 贷款申请样本数据表

ID年龄有工作有自己的房子信贷情况类别
1 青年 一般
2 青年
3 青年
4 青年 一般
5 青年 一般
6 中年 一般
7 中年
8 中年
9 中年 非常好
10 中年 非常好
11 老年 非常好
12 老年
13 老年
14 老年 非常好
15 老年 一般

解:

  首先计算经验熵$H(D)$.

    $H(D)=-\frac{9}{15}log_{2} \frac{9}{15}-\frac{6}{15}log_{2} \frac{6}{15}=0.971$

  然后计算个特征对数据集D的信息增益。分别以$A_{1},A_{2},A_{3},A_{4}$表示年龄、有工作、有自己的房子、信贷情况4个特征,则

  (1)计算年龄对数据集D的信息增益。

    $g(D,A_{1})=H(D)-[\frac{5}{15}H(D_{1}) +\frac{5}{15}H(D_{2})+\frac{5}{15}H(D_{3})]$

    $=0.971-[\frac{5}{15}(-\frac{2}{5}log_{2}\frac{2}{5}-\frac{3}{5}log_{2}\frac{3}{5})+\frac{5}{15}(-\frac{3}{5}log_{2}\frac{3}{5}-\frac{2}{5}log_{2}\frac{2}{5})+\frac{5}{15}(-\frac{4}{5}log_{2}\frac{4}{5}-\frac{1}{5}log_{2}\frac{1}{5})]$

    $=0.971-0.888=0.083$

   这里$D_{1},D_{2},D_{3}$分别是D中$A_{1}$(年龄)取值为青年,中年,老年的样本子集。

  (2)计算有无工作对数据集D的信息增益。

    $g(D,A_{2})=H(D)-[\frac{5}{15}H(D_{1}) +\frac{10}{15}H(D_{2})]$

    $0.971-[\frac{5}{15}*0+\frac{10}{15}(-\frac{4}{10}log_{2}\frac{4}{10}-\frac{6}{10}log_{2}\frac{6}{10})]$

    $=0.324$

  (3)计算有无自己的房子对数据集D的信息增益。

     $g(D,A_{3})=0.917-0.551=0.420$

   (4)计算信贷情况对数据集D的信息增益。

     $g(D,A_{4})=0.917-0.608=0.363$

  最后,比较各特征的信息增益情况,由于特征$A_{3}$的信息增益值最大,所以选择特征$A_{3}$作为最优特征。

4.2 ID3算法

  输入:训练数据集$D$,特征$A$,阈值$ε$。
  输出:决策树$T$

  1. 若$D$中所有实例属于同一类$C_{k}$,则$T$为单结点树,并将类$C_{k}$作为该结点的类标记,返回$T$;
  2. 若$𝐴=\phi$ ,则$T$为单结点树,并将$D$中实例数最大的类$C_{k}$作为该结点的类标记,返回$T$;
  3. 否则,计算$A$中各特征$D$的信息增益,选择信息增益最大的特征$A_{g}$;                                                                                                                         $\begin{align*} \\ & A_{g} = \arg \max_{A} g \left( D, A \right) \end{align*}$        
  4. 如果$A_{g}$的信息增益小于阈值$ε$,则置$T$为单结点树,并将$D$中实例数量最大的类$C_{k}$作为该结点的类标记,返回$T$;
  5. 否则,对$A_{g}$的每一个可能值$a_{i}$,依$A_{g}=a_{i}$将$D$分割为若干非空子集$D_{i}$,将$D_{i}$中实例数对大的类作为标记,构建子结点,由结点及其子结点构成树$T$,返回$T$;
  6. 对第$i$个子结点,以$D_{i}$为训练集,以$A-\left\{A_{g}\right\}$为特征集,递归地调用步1~步5,得到子树$T_{i}$,返回$T_{i}$。

   例子:对于表5.1的训练数据集,利用ID3算法建立决策树

  由于特征$A_{3}$的信息增益值最大,所以选择特征$A_{3}$作为根节点的特征。它将训练数据集划分成两个子集$D_{1}$ ($A_{3}$的取值为“是”),$D_{2}$ ($A_{3}$的取值为“否”)。这里由于$D_{1}$只有同一个类的样本点,所以它成为一个叶节点,节点的类标记为"是"。

  对$D_{2}$则需要从特征$A_{1}$(年龄),特征$A_{2}$(有工作),特征$A_{4}$(信贷情况)选择新的特征。

  计算各个特征的信息增益:

    $g(D_{2},A_{1})=H(D)-H(D_{2}|A_{1})=0.918-0.667=0.251$

    $g(D_{2},A_{2})=H(D)-H(D_{2}|A_{2})=0.918$

    $g(D_{2},A_{4})=H(D)-H(D_{2}|A_{4})=0.474$

   选择信息增益最大的特征$A_{2}$(有工作)作为节点的特征,由于$A_{2}$有两个取值,从这一节点引出两个子节点:一个对应“是”,包含3个样本,他们属于同一类,所以这是一个叶节点,类标记为“是”;另一个对一个对应“否”,包含6个样本,他们也属于同一类,所以这是一个叶节点,类标记为“否”。

4.3 信息增益比

  ID3采用信息增益的方式很快就被人发现有问题,在相同条件下,取值比较多的特征比取值少的特征信息增益大,即信息增益作为标准容易偏向于取值较多的特征。如一个变量有2个值,各为1/2,另一个变量为3个值,各为1/3,其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。

  所以在C4.5中,引入信息增益比$g_R(X,Y)$,它是信息增益和特征熵的比值。表达式如下:

    $g_R(D,A)=\frac{g(A,D)}{H_A(D)}$

  其中$D$为样本特征输出的集合,$A$为样本特征,对于特征熵$H_A(D)$, 表达式如下:

    $H_A(D) = -\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}$

  其中$n$为特征$A$的类别数(取值的个数),$D_i$为特征$A$的第$i$个取值对应的样本个数,$|D|$为样本个数。

4.4 C4.5算法

  C4.5算法整体结构和ID3基本一样,只有在特征选择的时候换成了信息增益比

  输入:训练数据集$D$,特征$A$,阈值$ε$。
  输出:决策树$T$

  1. 若$D$中所有实例属于同一类$C_{k}$,则$T$为单结点树,并将类$C_{k}$作为该结点的类标记,返回$T$;
  2. 若$𝐴=\phi$ ,则$T$为单结点树,并将$D$中实例数最大的类$C_{k}$作为该结点的类标记,返回$T$;
  3. 否则,计算$A$中各特征$D$的信息增益,选择信息增益比最大的特征$A_{g}$;     
  4. 如果$A_{g}$的信息增益小于阈值$ε$,则置$T$为单结点树,并将$D$中实例数量最大的类$C_{k}$作为该结点的类标记,返回$T$;
  5. 否则,对$A_{g}$的每一个可能值$a_{i}$,依$A_{g}=a_{i}$将$D$分割为若干非空子集$D_{i}$,将$D_{i}$中实例数对大的类作为标记,构建子结点,由结点及其子结点构成树$T$,返回$T$;
  6. 对第$i$个子结点,以$D_{i}$为训练集,以$A-\left\{A_{g}\right\}$为特征集,递归地调用步1~步5,得到子树$T_{i}$,返回$T_{i}$。

4.5 基尼系数

  在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。

  无论是ID3还是C4.5,都是基于信息论的熵模型的,涉及大量的对数运算,比较耗时。CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。

  具体的,在分类问题中,假设有$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$

  对于二分类问题,若样本点属于第一个类的概率是$p$,则概率分布的基尼指数为

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

  若样本集合$D$根据特征$A$是否取得某一可能值$a$被分割成$D_{1}$和$D_{2}$两部分则在特征$A$的条件下,集合$D$的基尼指数定义为

    $Gini(D,A)=\frac{|D_{1}|}{|D|}Gini(D_{1})+ \frac{|D_{2}|}{|D|}Gini(D_{2})$

4.6 CART算法

  输入:训练集$D$,基尼系数的阈值$\varepsilon_1$,样本个数阈值$\varepsilon_2$。

  输出:决策树$T$。

  我们的算法从根节点开始,用训练集递归的建立CART树。

  1. 对于当前节点的数据集为$D$,如果样本个数小于阈值$\varepsilon_2$或者没有特征,则返回决策子树,当前节点停止递归;
  2. 计算样本集$D$的基尼系数,如果基尼系数小于阈值$\varepsilon_1$,则返回决策树子树,当前节点停止递归;
  3. 计算当前节点现有的各个特征的各个特征值对数据集$D$的基尼系数;
  4. 在计算出来的各个特征的各个特征值对数据集$D$的基尼系数中,选择基尼系数最小的特征$A$和对应的特征值$a$。根据这个最优特征和最优特征值,把数据集划分成两部分$D_{1}$和$D_{2}$,同时建立当前节点的左右节点,做节点的数据集为$D_{1}$,右节点的数据集为$D_{2}$;
  5. 对左右的子节点递归的调用1-4步,生成决策树;

   例子:对于表5.1的训练数据集,利用CART算法建立决策树。

   :首先计算各特征的基尼指数,选择最优特征以及最优划分点。分别以$A_{1},A_{2},A_{3},A_{4}$表示年龄、有工作、有自己的房子和信贷情况4个特征。以1,2,3表示年龄为青年、中年、老年,以1、2表示有工作和有自己房子的值为是和否,以1、2、3表示信贷情况的值为非常好、好、一般。

  求特征$A_{1}$的基尼指数:

    $Gini(D,A_{1}=1)=\frac{5}{15}(2\times\frac{2}{5}\times(1-\frac{2}{5}) ) +\frac{10}{15}(2\times\frac{7}{10}\times(1-\frac{7}{10}))=0.44 $

    $Gini(D,A_{1}=2)=0.48$

    $Gini(D,A_{1}=3)=0.44$

  由于$Gini(D,A_{1}=1)$和$Gini(D,A_{3}=1)$相等且最小,所以都可以作为最优切分点。

  求特征$A_{2}$和求特征$A_{3}$的基尼指数的基尼指数:

    $Gini(D,A_{2}=1)=0.32$

    $Gini(D,A_{3}=1)=0.27$

  由于特征$A_{2}$和特征$A_{3}$只有一个切分点,所以他们就是最优切分点。

  求特征$A_{4}$的基尼指数:

    $Gini(D,A_{4}=1)=0.36$

    $Gini(D,A_{4}=2)=0.47$

    $Gini(D,A_{4}=3)=0.32$

  由于$Gini(D,A_{4}=3)$最小,所以$A_{4}=3$为$A_{4}$的最优切分点。

  由于在$A_{1},A_{2},A_{3},A_{4}$几个特征中,$Gini(D,A_{3}=1)=0.27$最小,所以选择特征$A_{3}$为最优特征,$A_{3}=1$为其最优切分点。于是根节点生成两个子节点,一个是叶节点。对另外一个子节点使用上述方法在$A_{1},A_{2},A_{4}$中选择最优特征以及最优切分点,结果是$A_{2}=1$。依此计算所有节点都是叶节点。

5 决策树的剪枝

  决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。

可以通过剪枝的方式降低决策树的复杂度,剪枝类型分为预剪枝、后剪枝。

  • 预剪枝:是在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点产生。预剪枝方法虽然简单但实用性不强,因为很难精确的判断何时终止树的生长。
  • 后剪枝:是在决策树构建完成之后,对那些置信度不达标的节点子树用叶子结点代替,该叶子结点的类标号用该节点子树中频率最高的类标记。后剪枝方法又分为两种:
    1. 把训练数据集分成树的生长集和剪枝集(参考周志华老师的西瓜书上介绍的剪枝方法)。
    2. 使用同一数据集进行决策树生长和剪枝。常见的后剪枝方法有CCP(Cost Complexity Pruning)、REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、MEP(Minimum Error Pruning)。 C4.5算法采用PEP(Pessimistic Error Pruning)剪枝法。PEP剪枝法由Quinlan提出,是一种自上而下的剪枝法,根据剪枝前后的错误率来判定是否进行子树的修剪。CART采用的是CCP(Cost Complexity Pruning)的剪枝法策略。

5.1 树的剪枝算法

  输入:决策树$T$,参数$\alpha$。
  输出:修剪后的子树$T_{\alpha}$。
    1、计算每个结点的经验熵。
    2、递归地从树的叶结点向上回缩。
        设一组叶结点回缩到其父结点之前与之后的整体树分别为$T_{B}$与$T_{A}$,其对应的损失函数值分别是$C_{\alpha} \left( T_{B} \right)$,如果

      $C_{\alpha}\left( T_{A} \right) \leq C_{\alpha} \left( T_{B} \right) $

        则进行剪枝,即将父结点变为新的叶结点。
    3、返回2,直到不能继续为止,得到损失函数最小的子树$T_{\alpha}$。

   假设$X$与$Y$分别为输入和输出变量,并且$Y$是连续变量,给定训练数据集

     $D = {(x_{1},y_{1}), (x_{2},y_{2}),\cdots,(x_{N},y_{N}) }$

   可选择第$j$个变量$x_{j}$及其取值$s$作为切分变量和切分点,并定义两个区域

     $R_{1}(j,s) =\{ x|x_{j}\leq s\},R_{2}( j,s) =\{x|x_{j}>s\} $

  最优切分变量$x_{j}$及最优切分点$s$

    $j,s = \arg \min_{j,s}[\min_{c_{1}}\sum_{x_{i}\in R_{1} (j,s)}( y_{i}- c_{1} )^{2} + \min_{c_{2}} \sum_{x_{i} \in R_{2} (j,s)} ( y_{i} - c_{2} )^{2}]$

  其中,$c_{m}$是区域$R_{m}$上的回归决策树输出,是区域$R_{m}$上所有输入实例$x_{i}$对应的输出$y_{i}$的均值

    $c_{m} = ave( y_{i} | x_{i} \in R_{m}), m=1,2$

   对每个区域$R_{1}$和$R_{2}$重复上述过程,将输入空间划分为 $M$个区域$R_{1},R_{2},\cdots,R_{M}$,在每个区域上的输出为$c_{m},m=1,2,\cdots,M$,最小二乘回归树

     $f(x) = \sum_{m=1}^{M} c_{m} I( x \in R_{m})$

5.2 最小二乘回归树生成算法

  输入:训练数据集$D$

  输出:回归树$𝑓(𝑥)$

  1.选择最优切分变量$x_{j}$与切分点$s$

    $j,s = \arg \min_{j,s} [ \min_{c_{1}} \sum_{x_{i} \in R_{1} (j,s)}( y_{i} - c_{1})^{2}+\min_{c_{2}} \sum_{x_{i} \in R_{2}(j,s)}( y_{i} - c_{2})^{2}]$

  2.用最优切分变量$x_{j}$与切分点$s$划分区域并决定相应的输出值。

    $R_{1}(j,s) = \{x|x_{j}\leq s\},R_{2}(j,s) = \{x|x_{j}> s\}$

    $c_{m} = \dfrac{1}{N} \sum_{x_{i} \in R_{m}( j,s)} y_{i}, \quad m=1,2$

  3.继续对两个子区域调用步骤1.和2.,直到满足停止条件

  4.将输入空间划分为$M$个区域$R_{1},R_{2},\cdots,R_{M}$,生成决策树

    $f(x)= \sum_{m=1}^{M} c_{m} I (x\in R_{m}) $

5.3 CART剪枝算法

  输入:CART决策树 $T_{0}$
  输出:最优决策树$T_{\alpha}$

  1.设 $k=0, T=T_{0}$

  2.设$\alpha=+\infty$。

  3.自下而上地对各内部结点$t$ 计算 $C\left(T_{t}\right),\left| T_{t} \right|$,以及

    $g(t) = \dfrac{C( t ) - C (T_{t})} { | T_{t} | -1 }$

    $\alpha = \min ( \alpha, g( t ) )$

      其中, $T_{t}$表示以$t$为根结点的子树,$C\left(T_{t}\right)$是对训练数据的预测误差,$\left| T_{t} \right|$是$T_{t}$的叶结点个数。

  4.自下而上地访问内部结点$t$,如果有 $g\left(t\right)=\alpha$,则进行剪枝,并对叶结点 $t$ 以多数表决法决定其类别,得到树$T$。

  5.设$k=k+1, \alpha_{k}=\alpha, T_{k}=T$。

  6.如果$T$ 不是由根结点单独构成的树,则回到步骤4。

  7.采用交叉验证法在子树序列$T_{0},T_{1},\cdots,T_{n}$中选取最优子树$T_{\alpha}$。

参考文献

1.信息论基础

2.决策树(Decision Tree)-决策树原理

3.决策树(decision tree)(一)—构造决策树方法

4.机器学习实战(三)——决策树

posted @ 2021-05-30 20:46  图神经网络  阅读(876)  评论(0编辑  收藏  举报
Live2D