机器学习最易懂之决策树(DecisionTree)模型详解与python代码实现

0 前言

决策树,也可以称为判定树,是一种最基本的算法,可以用于分类,也可以用于回归(本文主要讲用于分类的)。用于分类主要是借助每一个叶子节点对应一种属性判定,通过不断的判定导出最终的决策;用于回归则是用均值函数进行多次二分,用子树中数据的均值进行回归。决策树的思想和我们日常思考问题的方式相同,首先考虑自己觉得最重要的因素,再考虑次要的因素,而这的因素就对应机器学习中的特征。例如,我们要判断一个西瓜的好坏,在进行判断时,通常会进行一系列的判断或者子决策:

  • 我们先看看西瓜是什么颜色的,青绿色的西瓜一般都是好瓜,如果不是青绿色,大概率是不好的西瓜;
  • 然后再看看西瓜的根蒂是什么形态,如果是蜷缩的,那么大概率是好瓜;
  • 最后再听听敲西瓜的声音,如果是浊响,那么一般是好瓜。
    将上诉过程用树形图表示出来:
    在这里插入图片描述
    如上,决策的形式用树的形式进行示意和编码,就形成了决策树。

1 决策树模型

分类决策树模型是一种描述对实例进行分类的树形结构。
决策树的组成部分:

  • 结点:
    • 内部结点:内部结点表示一个特征或属性,例如上图中的色泽、根蒂、敲声等。
    • 叶节点:叶节点表示一个类别,例如上图中的好瓜,当然上面的例子是一个二分类问题,决策树也可以用于多分类。
  • 有向边:表示对于特征的值,例如上图的对于色泽的属性值是青绿。

用决策树进行分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子节点进行下一个特征的测试;如此递归地对实例进行测试并分配,直至达到叶节点;最后将实例分到叶节点的类别中。
可以将决策树看成一个if-then规则的集合(早期人工智能几乎都是if-then的规则结构)。其实决策树在进行判断时也是if-then的结构。

2 决策树模型的学习

决策树学习,假设给定训练数据集
D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) D={(\boldsymbol{x}_1,y_1),(\boldsymbol{x}_2,y_2),...,(\boldsymbol{x}_N,y_N)}
其中, x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( n ) ) \boldsymbol{x}_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)}) 为输入实例,即一个特征向量,n为特征个数, x i ( j ) x_i^{(j)} 表示第i个实例的第j个特征的取值; y i { 1 , 2 , . . . , K } y_i\in \{1,2,...,K\} 是类别标记,一个有K个类别;N是训练集实例的个数。
学习的目标是:根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。

  决策树学习在本质上是从训练数据中归纳出一组分类规则。与训练数据集不相矛盾的决策树(能对训练数据进行正确分类的决策树)可能有多个,也可能一个也没有。我们需要的是一个与训练数据集矛盾较小的决策树,同时具有很好的泛化能力。决策树模型的目标函数(损失函数)是正则化的极大似然函数,需要最小化目标函数。当损失函数确定以后,学习问题就变为在损失函数意义下选择最优决策树的问题。但是从所有可能的决策树种选取最优决策树是NP完全问题,所以现实中决策树学习算法通常采用启发式方法,近似求解这一最优化问题,这样得到的决策树不一定是最优的,有可能是次优的。

2.1 决策树学习流程

  决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类,这也对应着决策树的构建。

递归返回条件包括三种情况:

  1. 当前节点包含的样本全属于同一类别,无需划分。
  2. 当前没有未使用的特征,或是所有样本在所有未使用的特征上取值相同,无法划分。
  3. 当前节点包含的样本集合为空,不能划分。

在第2种情况下,我们把当前节点标记为叶节点,并将其类别设置为该节点所含样本最多的类别。
在第3种情况下,同样吧当前节点标记为叶节点,但其类别设定为其父节点所含样本最多的类别。
第2种情况是在利用当前节点的后验分布,而第3种情况则是把父节点的样本分布作为当前节点的先验分布。
以上方法生成的决策树可能对训练数据有很好的分类能力,但对未知的测试数据却未必有很好的分类能力,即可能发生过拟合。这时候需要对生成的额树自下而上进行剪枝,使树变得更简单,从而使它具有更好的额泛化能力。

如果特征数量过多,也可以在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。
决策树学习的算法包括:

  • 特征选择
  • 决策树的生成
  • 决策树的剪枝

决策树学习常用的算法有ID3、C4.5与CART

3 决策树的特征选择准则

  对于决策树而言,每一个非叶子节点都是在进行一次属性的分裂,选择最佳的属性,把不同属性值的样本划分到不同的子树中,不断循环直到叶子节点。其中,如何选择最佳的属性是建树的关键,决策树的一个特征选择的指导思想是熵减思想。
  特征选择在于选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的,通常是直接扔掉这样的特征,对决策树学习的精度影响不大。通常特征选择的准则是信息增益或信息增益比
先给出一个例子:

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

上表由15个样本组成的贷款申请训练数据,包含4个特征:

  • 年龄:青年,中年,老年;
  • 有工作:是,否;
  • 有自己的房子:是,否;
  • 信贷情况:一般,好,非常好

最后一列是类别,是否同意贷款,有两个值:是,否。

3.1 信息增益

首先给出条件熵的定义。
熵的定义
  在信息论与概率统计中,熵(entropy)是表示随机变量不确定性程度的一种度量方式,设 X \boldsymbol{X} 是一个取有限个值的离散随机变量,其概率分布为:
P ( X = x i ) = p i , i = 1 , 2 , . . . , n P(\boldsymbol{X}=x_i)=p_i, \quad i=1,2,...,n
则随机变量 X \boldsymbol{X} 的熵定义为:
H ( X ) = i = 1 n p i log p i H(\boldsymbol{X})=-\sum\limits_{i=1}^np_i\log{p_i}
其中,若 p i = 0 p_i=0 ,则定义 0 log 0 = 0 0\log 0 = 0 。通常对数取以2为底或者以e为底,这时候熵的单位对应的称作比特(bit)或纳特(nat)。根据上式的定义可知:熵只依赖于随机变量 X \boldsymbol{X} 的分布,与 X \boldsymbol{X} 的具体取值无关。也可以将 X \boldsymbol{X} 的熵记作 H ( p ) H(p) :
H ( p ) = i = 1 n p i log p i H(p)=-\sum\limits_{i=1}^np_i\log{p_i}
熵越大,随机变量的不确定性就越大,当随机变量完全不确定时, X \boldsymbol{X} 的取值有n种,此时熵最大;当随机变量完全确定时, X \boldsymbol{X} 的取值只有1种,此时熵最小,则:
1 × log ( 1 ) H ( p ) i = 1 n 1 n log ( 1 n ) -1\times \log(1)\leq H(p) \leq -\sum\limits_{i=1}^n\frac{1}{n}\log(\frac{1}{n})

0 H ( p ) log ( n ) 0\leq H(p) \leq \log(n)

条件熵的定义
  设有随机变量 ( X , Y ) (\boldsymbol{X},\boldsymbol{Y}) ,其联合概率分布为:
P ( X = x i , Y = y i ) = p i j , i = 1 , 2 , . . . , n ; j = 1 , 2 , . . . , m P(X=x_i,Y=y_i)=p_{ij},\quad i=1,2,...,n;\quad j=1,2,...,m
条件熵 H ( Y X ) H(\boldsymbol{Y}|\boldsymbol{X}) 表示在已知随机变量 X \boldsymbol{X} 的条件下随机变量 Y \boldsymbol{Y} 的不确定性。随机变量 X \boldsymbol{X} 给定的条件下随机变量 Y \boldsymbol{Y} 的条件熵定义为 X \boldsymbol{X} 给定的条件下 Y \boldsymbol{Y} 的条件概率分布的熵对 X \boldsymbol{X} 的数学期望:
H ( Y X ) = i = 1 n p i H ( Y X = x i ) H(\boldsymbol{Y}|\boldsymbol{X})=\sum\limits_{i=1}^np_iH(\boldsymbol{Y}|X=x_i)
其中, p i = P ( X = x i ) , i = 1 , 2 , . . . , n p_i=P(X=x_i),\quad i=1,2,...,n
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。
信息增益(information gain)表示得知特征 X \boldsymbol{X} 的信息而使得类别 Y \boldsymbol{Y} 的信息的不确定性减少的程度。信息增益的定义:特征A对训练数据集D的信息增益 g ( D , A ) g(D,A) ,定义为集合D的经验熵 H ( D ) H(D) 与特征A给定条件下D的经验条件熵 H ( D A ) H(D|A) 之差,即:
g ( D , A ) = H ( D ) H ( D A ) g(D,A)=H(D)-H(D|A)
一般的,熵 H ( Y ) H(Y) 与条件熵 H ( Y X ) H(Y|X) 之差称为互信息,决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
  决策树学习应用信息增益准则选择特征,给定训练数据集D和特征A,经验熵 H ( D ) H(D) 表示对数据集D进行分类的不确定性;而经验条件熵 H ( D A ) H(D|A) 表示在特征A给定的条件下对数据集D进行分类的不确定性。那么他们的差就是信息增益,表示由于特征A而使数据集D的分类不确定性减少的程度。显然对于不同的特征,有不同的信息增益,信息增益大的特征具有更强的分类能力。

根据信息增益准则的特征选择方法是:对训练数据集(或者数据集的子集)D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。

  设训练数据集为D, D |D| 表示样本容量,即样本个数。设有K个类 C k , k = 1 , 2 , . . . , K C_k,\quad k=1,2,...,K C k |C_k| 为属于类 C k C_k 的样本个数, k = 1 K C k = D \sum\limits_{k=1}^K|C_k|=|D| 。设特征A有n个不同的取值 { a 1 , a 2 , . . . , a n } \{a_1,a_2,...,a_n\} ,根据特征A的取值将D划分为n个子集 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D i |D_i| 表示 D i D_i 的样本个数, i = 1 n D i = D \sum\limits_{i=1}^n|D_i|=|D| 。记子集 D i D_i 中属于类 C k C_k 的样本的集合为 D i k D_{ik} ,即 D i k = D i C k D_{ik}=D_i \cap C_k D i k |D_{ik}| D i k D_{ik} 的样本个数。
信息增益的计算方式

  • 输入:训练数据集D和特征A;
  • 输出:特征A对训练数据集D的信息增益 g ( D , A ) g(D,A)
  • 1 计算数据集D的经验熵 H ( D ) H(D) :

H ( D ) = k = 1 K C k D log 2 C k 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)

H ( D A ) = i = 1 n D i D H ( D i ) = i = 1 n D i D k = 1 K D i k D i log 2 D i k D i 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 ) g(D,A)=H(D)-H(D|A)

求解上诉例子:
首先计算经验熵 H ( D ) H(D)

H ( D ) = 9 15 log 2 9 15 6 15 log 2 6 15 = 0.971 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 4 , A 4 A_1,A_2,A_4,A_4 表示年龄、有工作、有自己的房子和信贷情况4个特征,则:

年龄 类别是的人数 类别否的人数 总人数
青年 3 2 5
中年 3 2 5
老年 4 1 5

g ( D , A 1 ) = H ( D ) [ 5 15 H ( D 1 ) + 5 15 H ( D 2 ) + 5 15 H ( D 3 ) ] = 0.971 [ 5 15 ( 2 5 log 2 2 5 3 5 log 2 3 5 ) + 5 15 ( 3 5 log 2 3 5 2 5 log 2 2 5 ) + 5 15 ( 4 5 log 2 4 5 1 5 log 2 1 5 ) ] = 0.971 0.888 = 0.083 \begin{aligned} 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})\\ &\quad\quad+\frac{5}{15}(-\frac{3}{5}\log_2\frac{3}{5}-\frac{2}{5}\log_2\frac{2}{5})\\ &\quad\quad+\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 \end{aligned}

有工作 类别是的人数 类别否的人数 总人数
5 0 5
4 6 10

g ( D , A 2 ) = H ( D ) [ 5 15 H ( D 1 ) + 10 15 H ( D 2 ) ] = 0.971 [ 5 15 ( 5 5 log 2 5 5 0 5 log 2 0 5 ) + 10 15 ( 4 10 log 2 4 10 6 10 log 2 6 10 ) ] = 0.324 \begin{aligned} g(D,A_2)&=H(D)-[\frac{5}{15}H(D_1)+\frac{10}{15}H(D_2)]\\ &=0.971-[\frac{5}{15}(-\frac{5}{5}\log_2\frac{5}{5}-\frac{0}{5}\log_2\frac{0}{5})\\ &\quad\quad+\frac{10}{15}(-\frac{4}{10}\log_2\frac{4}{10}-\frac{6}{10}\log_2\frac{6}{10})]\\ &=0.324 \end{aligned}

有自己的房子 类别是的人数 类别否的人数 总人数
6 0 6
3 6 9

g ( D , A 3 ) = H ( D ) [ 6 15 H ( D 1 ) + 9 15 H ( D 2 ) ] = 0.971 [ 6 15 ( 6 6 log 2 0 6 0 5 log 2 0 5 ) + 9 15 ( 3 9 log 2 3 9 6 9 log 2 6 9 ) ] = 0.971 0.051 = 0.420 \begin{aligned} g(D,A_3)&=H(D)-[\frac{6}{15}H(D_1)+\frac{9}{15}H(D_2)]\\ &=0.971-[\frac{6}{15}(-\frac{6}{6}\log_2\frac{0}{6}-\frac{0}{5}\log_2\frac{0}{5})\\ &\quad\quad+\frac{9}{15}(-\frac{3}{9}\log_2\frac{3}{9}-\frac{6}{9}\log_2\frac{6}{9})]\\ &=0.971-0.051\\ &=0.420 \end{aligned}

信贷情况 类别是的人数 类别否的人数 总人数
一般 1 4 5
4 2 6
非常好 4 0 4

g ( D , A 4 ) = H ( D ) [ 5 15 H ( D 1 ) + 6 15 H ( D 2 ) + 4 15 H ( D 3 ) ] = 0.971 [ 5 15 ( 4 5 log 2 4 5 1 5 log 2 1 5 ) + 6 15 ( 2 6 log 2 2 6 4 6 log 2 4 6 ) + 4 15 ( 4 4 log 2 4 4 0 4 log 2 0 4 ) ] = 0.971 0.608 = 0.363 \begin{aligned} g(D,A_4)&=H(D)-[\frac{5}{15}H(D_1)+\frac{6}{15}H(D_2)+\frac{4}{15}H(D_3)]\\ &=0.971-[\frac{5}{15}(-\frac{4}{5}\log_2\frac{4}{5}-\frac{1}{5}\log_2\frac{1}{5})\\ &\quad\quad+\frac{6}{15}(-\frac{2}{6}\log_2\frac{2}{6}-\frac{4}{6}\log_2\frac{4}{6})\\ &\quad\quad+\frac{4}{15}(-\frac{4}{4}\log_2\frac{4}{4}-\frac{0}{4}\log_2\frac{0}{4})]\\ &=0.971-0.608\\ &=0.363 \end{aligned}

比较各个特征对应的信息增益,特征 A 3 A_3 的信息增益值最大,所有将特征 A 3 A_3 作为最优特征。
信息增益是ID3算法使用的特征选择准则

3.2 信息增益比或者增益率

信息增益值的大小是相对于数据集而言的,并没有什么绝对意义。在分类问题苦难时,也就是说在训练数据集的经验熵较大的时候,信息增益就会偏大,反之,信息增益就会偏小。使用信息增益比可以对这一问题进行校正。信息增益比是特征选择的另一准则。(注:李航《统计学习方法》说的是C4.5算法用的是信息增益比,而周志华《机器学习》使用的是增益率,两者不同,个人偏向周志华。)
信息增益比定义为信息增益与经验熵之比:

g R ( D , A ) = g ( D , A ) H ( D ) g_R(D,A)=\frac{g(D,A)}{H(D)}

在周志华《机器学习》中C4.5用的是增益率,定义为:

G a i n r a t i o n ( D , A ) = g ( D , A ) I V ( a ) Gain_ration(D,A)=\frac{g(D,A)}{IV(a)}

其中, I V ( a ) = v = 1 V D V D log 2 D V D IV(a)=-\sum\limits_{v=1}^V\frac{|D^V|}{|D|}\log_2\frac{|D^V|}{|D|} ,称为特征A的固有值,特征A取值数目越多,即V越大, I V ( a ) IV(a) 的值通常也很大。需要注意的是,增益率准则对可取值数目较少的树形有所偏好,C4.5不是直接选择增益率最大的特征来划分,而是使用了一个启发式,从从候选特征中找出信息增益高于平均水平的特征,再从中选择增益率最高的

3.3 基尼指数

首先定义基尼指数
分类问题中,假设有 K K 个类,样本点属于第 k k 类的概率为 p k p_k ,则概率分布的基尼指数定义为:
G i n i ( p ) = k = 1 K p k ( 1 p k ) = 1 k = 1 K p k 2 Gini(p)=\sum\limits_{k=1}^Kp_k(1-p_k)=1-\sum\limits_{k=1}^Kp_k^2
对于二分类问题,若样本属于第一个类的概率是 p p ,则概率分布的基尼指数为:
G i n i ( p ) = 2 p ( 1 p ) Gini(p)=2p(1-p)
对于给定的样本集合D,其基尼指数为:
G i n i ( D ) = 1 k = 1 K ( C k D ) 2 Gini(D)=1-\sum\limits_{k=1}^K(\frac{|C_k|}{|D|})^2
这里, C k C_k 是D中属于第 k k 类的样本子集,K是类的个数。
如果样本集合D根据特征A是否取某一可能值 a a 被分割成 D 1 D_1 D 2 D_2 两部分,即:
D 1 = { ( x , y ) D A ( x ) = a } , D 2 = D D 1 D_1=\{(x,y)\in D|A(x)=a\},\quad D_2=D-D_1
则在特征A的条件下,集合D的基尼指数定义为:
G i n i ( D , A ) = D 1 D G i n i ( D 1 ) + D 2 D G i n i ( D 2 ) Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)

基尼指数 G i n i ( D ) Gini(D) 表示集合D的不确定性,基尼指数 G i n i ( D , A ) Gini(D,A) 表示经过 A = a A=a 分割后集合D的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。
在这里插入图片描述
如图,显示了二分类问题中基尼指数、熵之半(即 1 2 H ( p ) \frac{1}{2}H(p) )和分类误差率之间的关系,横坐标表示概率 p p ,纵坐标表示损失,可以看出基尼指数和熵之半的曲线很接近,都可以近似地代表分类误差率。

3.4 最小均方误差

4 决策树的剪枝

决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树,往往对训练数据的分类很正确,但对未知的测试数据的分类却没那么准确,即出现过拟合现象,例如ID3算法。过拟合的原因在于学习时过多考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,解决这个问题多的办法是考虑决策树的复杂度,对已生成的决策树进行简化,简化的过程称为剪枝。具体来讲,剪枝从已生成的树上裁掉一些子树或者叶节点,并将其根节点或者父节点作为新的叶节点,从而简化分类树模型。
决策树剪枝的策略有:

  • 预剪枝
  • 后剪枝

4.1 预剪枝

预剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化能力的提升,则停止划分并将当前节点标记为叶节点。

怎么判断决策树泛化能力是否提升呢?
通常的做法是将训练集分成两部分,一部分用来训练,记作训练集,另一部分用来验证分类的效果,记作验证集。
过程:首先从根节点开始,直接选取训练数据中类别最多的那一类作为根节点的类别,即所有数据都判断为这一类别,现在用验证集的数据来判断分类的效果,计算分类正确的准确率。然后按照信息增益准则来选取第一个最优特征,按照这个特征来生成一颗只有两层的决策树,然后用验证集的数据来判断分类效果,若当前准确率低于根节点的准确率,则直接取根节点作为决策树,也就是减掉生成的分支,所有数据都分成一类;若当前准确率高于根节点的准确率,则说明依据最优特征划分比不划分的效果好。然后按照这个方法递归下去。
周志华《机器学习中的例子》
在这里插入图片描述
在这里插入图片描述
第一张图是未剪枝的图,按照信息增益准则生成的决策树,第二章是边生成边剪枝的决策树。可以发现,预剪枝使得决策树的很多分支都没有“展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但是另一方面,有些分支的当前划分虽然不能够提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高。预剪枝基于贪心本质禁止有些分支展开,给预剪枝决策树带来了欠拟合的风险。

4.2 后剪枝

后剪枝先从训练集生成一颗完整的决策树,然后自底向上地对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化性能提升,则将该子树替换为叶节点。仍然按照上一节讲的泛化性能评估方式来评估后剪枝的泛化性能
在这里插入图片描述
首先从最底层的叶节点开始,用验证集来评估泛化性能,42.9%;然后去掉“纹理”引出的叶节点,将“纹理”标记为纹理那个节点的样本中类别最多的分类,用验证集的数据来评估泛化能力,57.1%,可以看出剪枝后的性能更好,所以选择剪枝。然后递推下去,直到剪枝不能提升性能为止,注意当从底层开始到一定程度后不能再剪枝时,需要换个叶节点继续。
在这里插入图片描述
对比两张图可以看出,后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,娿性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶节点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。

4.3 一种简单的决策树学习的剪枝算法。

决策树的剪枝往往通过极小化决策树整体的损失函数或者代价函数来实现。设树T的叶节点个数为 T |T| ,在未剪枝之前是分类类别的个数,但是现在剪枝了就不是了, t t 是树T的叶节点,该叶节点上有 N t N_t 个样本点,其中k类的样本点有 N t k N_{tk} 个,其中 k = 1 , 2 , . . . , K k=1,2,...,K K K 是分类类别的个数, H t ( T ) H_t(T) 为叶节点 t t 上的经验熵, α 0 \alpha \geq 0 是参数,则决策树学习的损失函数可以定义为:

C α ( T ) = t = 1 T N t H t ( T ) + α T C_{\alpha}(T)=\sum\limits_{t=1}^{|T|}N_tH_t(T)+\alpha |T|

其中,经验熵为:

H t ( T ) = k N t k N t log N t k N t H_t(T)=-\sum\limits_k\frac{N_{tk}}{N_t}\log\frac{N_{tk}}{N_t}

C ( T ) = t = 1 T N t H t ( T ) = t = 1 T k = 1 K N t k log N t k N t C(T)=\sum\limits_{t=1}^{|T|}N_tH_t(T)=-\sum\limits_{t=1}^{|T|}\sum\limits_{k=1}^KN_{tk}\log\frac{N_{tk}}{N_t} ,有:

C α ( T ) = C ( T ) + α T C_{\alpha}(T)=C(T)+\alpha |T|

C ( T ) C(T) 表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, T |T| 表示模型的复杂程度,参数 α \alpha 控制两者之间的影响,较大的参数选择较简单的模型,较小的参数选择较复杂的模型, α = 0 \alpha =0 表示只考虑模型与训练数据的拟合程度,不考虑模型的复杂程度。
剪枝,就是 α \alpha 确定之后,选择损失函数最小的模型,即损失函数最小的子树。不难想到, α \alpha 的值确定后,形成的决策树越大,与训练数据的拟合效果较好,但是模型复杂度较高,较容易发生过拟合。
可以看出,决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合,而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型
损失函数的极小化等价于正则化的极大似然估计,所以利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择
剪枝算法流程:
在这里插入图片描述
在这里插入图片描述

5 ID3算法生成决策树

ID3算法的核心在决策树各个节点上应用信息增益准则选择特征,递归地构建决策树。
具体方法:

  • 开始:在根节点,计算所有可能的特征的信息增益,选择信息增益最大的特征作为根节点的特征;
  • 递归:对子节点递归地调用以上方法,构建决策树;
  • 最终:知道所有特征的信息增益均很小或者没有特征可以选择为止,最终得到一个决策树。

ID3相当于用极大似然法进行概率模型的选择
ID3算法流程:
在这里插入图片描述
根据前文例子,根节点选择 A 3 A_3 特征,因为 A 3 A_3 特征(是否有自己的房子)的增益值最大, A 3 A_3 特征有两个取值,生成两个子节点,然后将训练数据集分为两个子集:

  • 有自己的房子:一共6人,记为样本集 D 1 D_1
  • 没有自己的房子:一共9人,记为样本集 D 2 D_2

由于样本集 D 1 D_1 都是同一类别,即“是”,可以贷款,就将这一个节点变成叶节点,标记为“是”。
D 2 D_2 样本集中的数据不属于同一类别,则需要从特征 A 1 , A 2 , A 4 A_1,A_2,A_4 中选择一个新的特征,使信息增益最大。
g ( D 2 , A 1 ) = H ( D 2 ) H ( D 2 A 1 ) = 0.918 0.667 = 0.251 g ( D 2 , A 2 ) = H ( D 2 ) H ( D 2 A 2 ) = 0.918 g ( D 2 , A 3 ) = H ( D 2 ) H ( D 2 A 3 ) = 0.474 \begin{aligned} g(D_2,A_1)&=H(D_2)-H(D_2|A_1)=0.918-0.667=0.251\\ g(D_2,A_2)&=H(D_2)-H(D_2|A_2)=0.918\\ g(D_2,A_3)&=H(D_2)-H(D_2|A_3)=0.474 \end{aligned}

选择信息增益最大的特征 A 2 A_2 (有工作)作为节点的特征,由于特征 A 2 A_2 有两个取值,生成两个子节点,同时将D_2分成两个子集,记为: D 1 , D 2 D_1^’,D_2^’ ,其中 D 1 D_1^’ 对应有工作,包含3个样本,它们属于同一类,即“是”,将这个节点变成叶节点,标记为“是”; D 2 D_2^’ 对应无工作,包含6个样本,它们也属于同一类,即“否”,将这个节点变成叶节点,标记为“否”。这样使用两个特征就可以将训练集分类完成,生成的决策树是:
在这里插入图片描述
ID3算法只有树的生成,所以这个算法生成的树容易产生过拟合。

6 C4.5算法生成决策树

C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进,C4.5在生成的过程中,用信息增益比来选择特征。
C4.5算法流程
在这里插入图片描述

7 CART算法

分类与回归树(classification andregression tree, CART)模型是由Breiman等人在1984年提出的,是应用广泛的决策树学习方法。CART同样是由特征选择、树的生成以及剪枝组成,既可以用于分类,也可以用于回归。

CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法,假设决策树是二叉树,内部节点特征的取值为“是”或“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归的二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。

CART算法由以下两步组成:

  • 决策树生成:基于训练数据生成决策树,生成的决策树要尽量大;
  • 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

6.1 CART生成

决策树的生成就是递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。

7.1.1 回归树的生成

假设X与Y分别为输入和输出变量,并且Y是连续变量,给定训练数据集:
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}
那么如何生成回归树呢?回归问题一般采用最小均方差作为损失,。在特征选择的同时会测试不同的二分阈值的最小均方误差,选择最优的特征和阈值,表示为:

min j , s [ min c 1 x i R 1 ( j , s ) ( y i c 1 ) 2 + min c 2 x i R 2 ( j , s ) ( y i c 2 ) 2 ] \min\limits_{j,s}[\min\limits_{c_1}\sum\limits_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min\limits_{c_2}\sum\limits_{x_i\in R_2(j,s)}(y_i-c_2)^2]

公式解释:
一个回归树对应着输入空间(即特征空间)的一个划分以及在划分的单元上的输出值,假设已知输入空间划分为M个单元 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M ,并且在每个单元 R m R_m 上有一个固定的输出值 c m c_m ,于是回归树模型可表示为:

f ( x ) = m = 1 M c m I ( x R m ) f(x)=\sum\limits_{m=1}^Mc_mI(x\in R_m)

当输入空间的划分确定时,可以用平方误差 x i R m ( y i f ( x i ) ) 2 \sum\limits_{x_i\in R_m}(y_i-f(x_i))^2 来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。可以知道,单元 R m R_m 上的 c m c_m 的最优值 c ^ m \hat c_m R m R_m 上的所有输入实例 x i x_i 对应的输出 y i y_i 的均值,即:

c ^ m = a v e ( y i x i R m ) \hat c_m=ave(y_i|x_i\in R_m)

问题是怎么样对输入空间进行划分,这里采用启发式的方法,选择第 j j 个变量 x ( j ) x^{(j)} 和它的取值 s s ,作为切分变量和切分点,并定义两个区域:

R 1 ( j , s ) = { x x ( j ) s } , R 2 ( j , s ) = { x x ( j ) > s } R_1(j,s)=\{x|x^{(j)}\leq s\},\quad R_2(j,s)=\{x|x^{(j)}> s\}

然后寻找最优切分变量 j j 和最优切分点 s s 。具体的,求解:

min j , s [ min c 1 x i R 1 ( j , s ) ( y i c 1 ) 2 + min c 2 x i R 2 ( j , s ) ( y i c 2 ) 2 ] \min\limits_{j,s}[\min\limits_{c_1}\sum\limits_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min\limits_{c_2}\sum\limits_{x_i\in R_2(j,s)}(y_i-c_2)^2]

对固定输入变量 j j 可以找到最优切分点 s s .

c ^ 1 = a v e ( y i x i R 1 ( j , s ) ) , c ^ 2 = a v e ( y i x i R 2 ( j , s ) ) \hat c_1=ave(y_i|x_i\in R_1(j,s)),\quad \hat c_2=ave(y_i|x_i\in R_2(j,s))

遍历所有输入变量,摘到最优的切分变量 j j ,构成一个对(j,s),依此将输入空间划分为链各个区域。接着,对每个区域重复上述划分过程,知道满足停止条件为止,这样生成一颗回归树,这样的回归树通常称为最小二乘回归树。
最小二乘回归树生成算法流程:
在这里插入图片描述

7.1.2 分类树的生成

分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
CART生成算法流程:
在这里插入图片描述
求解上诉例子:
仍以 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 表示年龄、工作、房子和信贷情况4个特征。再以1,2,3代表各自的特征值。
则特征 A 1 A_1 的基尼指数:

G i n i ( D , A 1 = 1 ) = 5 15 ( 2 × 2 5 × ( 1 2 5 ) ) + 10 15 ( 2 × 7 10 × ( 1 7 10 ) ) = 0.44 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

G i n i ( D , A 1 = 2 ) = 0.48 Gini(D,A_1=2)=0.48

G i n i ( D , A 1 = 3 ) = 0.44 Gini(D,A_1=3)=0.44

由于 G i n i ( D , A 1 = 3 ) Gini(D,A_1=3), Gini(D,A_1=1) 相等且最小,所以都可以作为特征 A_1$的最优切分点。

由于特征 A 2 A 3 A_2,A_3 的特征值只有两个,即切分点只有一个。

G i n i ( D , A 2 = 1 ) = 0.32 Gini(D,A_2=1)=0.32

G i n i ( D , A 3 = 1 ) = 0.27 Gini(D,A_3=1)=0.27

特征 A 4 A_4 的基尼指数:

G i n i ( D , A 4 = 1 ) = 0.36 G i n i ( D , A 4 = 2 ) = 0.47 G i n i ( D , A 4 = 3 ) = 0.32 \begin{aligned} Gini(D,A_4=1)&=0.36\\ Gini(D,A_4=2)&=0.47\\ Gini(D,A_4=3)&=0.32\\ \end{aligned}

在特征 A 4 A_4 中,选择 A 4 = 3 A_4=3 作为最优切分点。
在所有特征当中, G i n i ( D , A 3 = 1 ) = 0.27 Gini(D,A_3=1)=0.27 最小,所以选择特征 A 3 A_3 作为最优特征, A 3 = 1 A_3=1 为其最优切分点。于是根节点生成两个子节点,一个是叶节点。对另一个叶节点继续使用以上方法在剩余的特征 A 1 , A 2 , A 4 A_1,A_2,A_4 中选择最优特征及其最优切分点,以此类推下去。

7.2 CART剪枝

CART剪枝算法从"完全生成"的决策树的底端减去一些子树,是决策树变小(模型变简单),从而能够对未知数据有更准确的预测。CART剪枝算法由两步组成:

  • 首先从生成算法产生的决策树 T 0 T_0 底端开始不断剪枝,直到 T 0 T_0 的根节点,形成一个子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\}
  • 然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。

7.2.1 剪枝形成一个子树序列

在剪枝过程中,计算子树的损失函数:

C α ( T ) = C ( T ) + α T C_{\alpha}(T)=C(T)+\alpha |T|

其中,T为任意子树, C ( T ) C(T) 为对训练数据的预测误差(如基尼指数), T |T| 为子树的叶结点个数, α 0 \alpha \geq 0 为参数, C α ( T ) C_{\alpha}(T) 为参数是 α \alpha 时的子树T的整体损失。参数 α \alpha 权衡训练数据的合程度与模型的复杂度。

对固定的 α \alpha ,一定存在使损失函数 C α ( T ) C_{\alpha}(T) 最小的子树,将其表示为 T α T_{\alpha} T α T_{\alpha} 在损失函数 C α ( T ) C_{\alpha}(T) 最小的意义下是最优的。容易验证这样的最优子树是唯一的。当 α \alpha 大的时候,最优子树 T α T_{\alpha} 偏小;当 α \alpha 小的时候,最优子树 T α T_{\alpha} 偏大。极端情况,当 α 0 \alpha =0 时,整体树是最优的。当 α \alpha \to \infty 时,根结点组成的单结点树是最优的。

Breiman等人以用递归的方法对树进行剪枝,将 α \alpha 从小增大, 0 α 0 α 1 α n < + 0=\alpha_0<\alpha_1<…<\alpha_n<+\infty ,产生一系列的区间 [ α i , α i + 1 ) , i = 0 , 1 , 2 , . . . , n [\alpha_i,\alpha_{i+1}),i=0,1,2,...,n ;剪枝得到的子树序列对应着区间 α [ α i , α i + 1 ) , i = 0 , 1 , 2 , . . . , n \alpha \in[\alpha_i,\alpha_{i+1}),i=0,1,2,...,n 的最优子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\} ,序列中的子树是嵌套的。

具体地,从整体树 T 0 T_0 开始剪枝,对 T 0 T_0 的任意内部结点 t t ,以 t t 为单结点树的损失函数是:

C α ( t ) = c ( t ) + α C_{\alpha}(t)=c(t)+\alpha

t t 为根节点的子树 T t T_t 的损失函数为:

C α ( T t ) = C ( T t ) + α T C_{\alpha}(T_t)=C(T_t)+\alpha|T|

α = 0 α \alpha=0或者\alpha 充分小时,有不等式:

C α ( T t ) < C α ( t ) C_{\alpha}(T_t)<C_{\alpha}(t)

α \alpha 增大时,在某一 α \alpha 有:

C α ( T t ) = C α ( t ) C_{\alpha}(T_t)=C_{\alpha}(t)

α \alpha 再增大时:

C α ( T t ) > C α ( t ) C_{\alpha}(T_t)>C_{\alpha}(t)

只要 α = C ( t ) C ( T t ) T t 1 \alpha=\frac{C(t)-C(T_t)}{|T_t|-1} T t T_t t t 有相同的损失函数值,而 t t 的节点少,因此 t t T t T_t 更可取,对 T t T_t 进行剪枝。

为此,对 T 0 T_0 中每一内部节点 t t ,计算:

g ( t ) = C ( t ) C ( T t ) T t 1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}

它表示剪枝后整体损失函数减少的程度。在 T 0 T_0 中减去 g ( t ) g(t) 最小的 T t T_t ,将得到的子树作为 T 1 T_1 ,同时将最小的 g ( t ) g(t) 设为 α 1 \alpha_1 T 1 T_1 为区间 [ α 1 , α 2 ) [\alpha_1,\alpha_2) 的最优子树。

如此剪枝下去,直至得到根节点,在这一过程中,不断增加 α \alpha 的值,产生新的区间。

7.2.2 在剪枝得到的子树序列中通过交叉验证选择最优子树

具体地,利用独立的验证数据集,测试子树序列 T 0 , T 1 , . . . , T n T_0,T_1,...,T_n 中各棵子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树 , T 1 , T 2 , . . . , T n ,T_1,T_2,...,T_n 都对应于一个参数 α 1 , α 2 , . . . , α n \alpha_1,\alpha_2,...,\alpha_n 。所以当最优子树 T k T_k 确定时,对应的 α k \alpha_k 也确定了,即得到最优决策树 T α T_{\alpha}
CART剪枝算法:
在这里插入图片描述
代码实现见下篇文章,或者去我的github

总结

  • 优点:

    • 可解释性好,易可视化 ,特征工程中可用特征选择。
    • 样本复杂度,维度灾难。
  • 缺点:

    • 易过拟合,学习最优模型N-P难,贪心搜索局部最优。
    • 虽然是非线性模型,但不支持异或逻辑。
    • 数据不均衡时不适合决策树。
    • 决策属性不可逆。
原创文章 58 获赞 7 访问量 6211

猜你喜欢

转载自blog.csdn.net/Elenstone/article/details/105328111
今日推荐