【机器学习】西瓜书plus——决策树

文章目录

  • 决策树
    • 1 什么是决策树
    • 2 划分选择
      • 2.1 信息增益
      • 2.2 增益率
      • 2.3 基尼指数
    • 3 剪枝处理

决策树

本文内容是对西瓜书第四章4.1、4.2和4.3进行一些总结与注解。

1 什么是决策树

决策树(dicision tree)是一种基本的分类与回归方法,此处主要讨论分类的决策树。

顾名思义,决策树是基于树结构来进行决策的,这恰是人类在面临决策问题时一种很自然的处理机制.例如,我们去市场买西瓜,在对“这是好瓜吗?”这样的问题进行决策时,通常会进行一系列的判断或“子决策”:

我们先看“它是什么颜色?”,如果是“青绿色”,则我们再看“它的根蒂是什么形态?”,如果是“蜷缩”,我们再判断“它敲起来是什么声音?”,最后,我们得出最终决策:这是个好瓜。这个决策过程如下图所示。
【机器学习】西瓜书plus——决策树_第1张图片

让我们将上面树结构广义化如图所示:
【机器学习】西瓜书plus——决策树_第2张图片

上图就是决策树的结构了,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点。各个组成部分的功能如下:
叶节点:叶结点对应于决策结果(如:是好西瓜或不是好西瓜)
其他每个结点(根节点和内部节点)则对应于一个属性测试(如西瓜色泽怎么样?或西瓜根蒂怎么样?等等);

  • 根节点:对数据集中的所有样本进行属性测试,根据判断结果分配样本((如色泽青绿的西瓜分为一组,色泽乌黑的西瓜分为一组))到下级的内部节点或得到决策结果(叶结点)。
  • 内部节点:接受上一级结点分配的样本,进行进一步的属性测试,然后根据判断结果再分配样本到下级的内部结点或根结点。

上面给出的例子中决策树的决策者是人,在机器学习中,我们的目的是构建(训练)一棵决策者为计算机的决策树。要训练这棵决策树,我们首先需要数据集,如:

【机器学习】西瓜书plus——决策树_第3张图片

色泽,根蒂,敲声,纹理,脐部,触感为属性,是不是好瓜为结果。

决策树学习的基本算法如下(看着懵可以跳到下面的python语法伪代码):
【机器学习】西瓜书plus——决策树_第4张图片

显然,决策树的生成是一个递归过程.在决策树基本算法中,有三种情形会导致递归返回:

  • (1)当前结点包含的样本全属于同一类别(如:数据集中西瓜都是好瓜),无需划分;
  • (2)当前属性集为空(如:色泽,根蒂,敲声,纹理,脐部,触感都已经考虑过了),或是所有样本在所有属性上取值相同(样本都是乌黑,稍蜷,沉闷,稍糊,稍凹和硬滑的西瓜),无法划分;
  • (3)当前结点包含的样本集合为空,不能划分.

下面给出决策树算法的伪代码(参照了python语法):

参考:https://blog.csdn.net/bravery_again/article/details/81104914
# D = {(x1,y1)、(x2,y2)......(xm,yn)} 是数据集,也是根结点的样本集
# A = {a1、a2、a3.} 是划分节点的属性集
# 节点node有两个主要属性:content代表该节点需要分类的样本集,type代表叶节点的决策类型
def generateTree(D,A):
    newNode =#生成新的节点
    # 当前结点包含的样本全属于同一类别(如:样本集中西瓜都是好瓜),无需划分(设为一个叶节点(判断为好瓜)并返回)
    if D 中数据皆属于类别 C(如好瓜):
        newNode.content = D
        newNode.type = C
        return  
    # 属性已经用完了(如:色泽,根蒂,敲声,纹理,脐部,触感都已经考虑过了)或者样本集在剩余属性中表现相同(如样本集中的样本都是乌黑,稍蜷,沉闷,稍糊,稍凹和硬滑的西瓜)
    if A = 空集 or D中数据在A中取值相同
        newNode.content = D
        newNode.type = D中最多的类
        return
    #从A中选取最优(代表性)的属性a(比如色泽,这一步是决策树中最重要的)
    a=selectBestPorperty(A)
    #为a的每一个取值生成一个节点,递归进行处理
    for a的每一个取值 res[i](如色泽青绿|色泽乌黑|色泽浅白):
        生成新的分支节点 node[i]
        D[i] = {
     D中取值为res[i]的样本}(如样本集中色泽青绿的样本)
        node[i].content = D[i]
        # 当前结点包含的样本集合为空(如D中已经没有色泽青绿的样本了),不能划分.
        if node[i].content == null: 
        	# 把当前结点标记为叶结点,将其类别设定为其父结点所含样本最多的类别
            node[i].type = (D中最多的类)
        else:
        	# 递归生成决策树
            generateTree(D[i],A \{
     a})  #\:属性a已经考虑到了,去除
    return        

2 划分选择

在伪代码中我们指出,从属性集 A A A中划分出最优(代表性)的属性 a a a这一步是决策树中最重要的。

如何选择最优划分属性?一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”(purity)越来越高。

下面将介绍度量纯度的三种准则:信息增益,增益率以及基尼指数

2.1 信息增益

信息熵”(information entropy)是度量样本集合纯度最常用的一种指标。假定当前样本集合 D D D中第 k k k类样本所占的比例为 p k ( k = 1 , 2 , . . . , ∣ γ ∣ ) p_k (k = 1,2,...,|\gamma|) pk(k=1,2,...,γ),则D的信息嫡定义为
E n t ( D ) = − ∑ k = 1 ∣ γ ∣ p k l o g 2 p k , p k ∈ [ 0 , 1 ] Ent(D)=-\sum^{|\gamma|}_{k=1}p_klog_2p_k,\quad p_k\in[0,1] Ent(D)=k=1γpklog2pk,pk[0,1]

E n t ( D ) Ent(D) Ent(D)的值越小,则 D D D的纯度越高(样本属于同一类别的程度越高)。


PS:
信息熵与概率:
【机器学习】西瓜书plus——决策树_第5张图片

概率越大,信息熵越小(熵表示随机变量不确定性的度量,比如太阳从东边升起的概率为1,因此我们看到太阳从东边升起的不确定性为0,这是常识。)

p = 0 p=0 p=0 l o g 2 p log_2p log2p无定义,因此约定计算信息熵时约定当 p = 0 p=0 p=0时, p l o g 2 p = 0 plog_2p=0 plog2p=0

E n t ( D ) Ent(D) Ent(D)的最小值为0,最大值为 l o g 2 ( ∣ γ ∣ ) log_2(|\gamma|) log2(γ)

最大值证明:https://blog.csdn.net/qq_31019183/article/details/100358579


假定离散属性 a a a有V个可能的取值 a 1 , a 2 , . . . a v . . , a V {a^1, a^2,...a^v.. ,a^V} a1,a2,...av..,aV,若使用 a a a来对样本集 D D D进行划分,则会产生 V V V个分支结点,其中第 v v v个分支结点包含了 D D D中所有在属性 a a a上取值为 a v a^v av的样本,记为 D v D^v Dv

我们可计算出 D v D^v Dv的信息熵 E n t ( D v ) Ent(D^v) Ent(Dv),再考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重 ∣ D v ∣ / ∣ D ∣ |D^v|/|D| Dv/D ∣ ⋅ ∣ |\cdot| 为样本个数),即样本数越多的分支结点的影响越大,于是可计算出用属性 a a a对样本集 D D D进行划分所获得的“信息增益”(information gain)
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a)=Ent(D)-\sum^V_{v=1}\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)
观察该式,有以下几点说明:

  • E n t ( D ) Ent(D) Ent(D)是由数据集确定,和选取的属性 a a a无关,我们可以将之看为定值。
  • ∣ D v ∣ / ∣ D ∣ |D_v|/|D| Dv/D表示分支节点所占的比例大小,显然分配到的样本集越大的分支节点权重越高
  • 分支节点整体纯度越大,则后一项越小,信息增益 G a i n Gain Gain变得越大,所以我们的目标是选取信息增益最大的属性 a ∗ a_* a
    a ∗ = arg max ⁡ a ∈ A G a i n ( D , a ) a_*=\argmax_{a\in A}Gain(D,a) a=aAargmaxGain(D,a)

著名的ID3决策树学习算法就是以信息增益为准则来选择划分属性.

建议读者读到这里暂停一下,看看西瓜书中的例子。

2.2 增益率

信息增益准则对可取值数目较多的属性有所偏好,为了减少这种偏好可能带来的不利影响,著名的C4.5算法引入了信息增益率,定义如下:
由信息增益
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a)=Ent(D)-\sum^V_{v=1}\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)
得到信息增益率:
G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain\_ratio(D,a)=\frac{Gain(D,a)}{IV(a)} Gain_ratio(D,a)=IV(a)Gain(D,a)

其中
I V ( a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a)=\sum_{v=1}^V\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} IV(a)=v=1VDDvlog2DDv
称为属性 a a a的“固有值”属性 a a a可能取值数目越多(即 V V V越大),则 I V ( a ) IV(a) IV(a)的值通常会越大。

需要注意的是,增益率准则对取值数目较少的属性更加偏爱,因此算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先找出信息增益在平均值以上的属性(保证信息增益不会太小),在从中选择信息增益率最高的

2.3 基尼指数

CART决策树(Classification and Regression Tree)中,使用基尼指数来选择属性,数据集 D D D的纯度可用基尼值来度量:
G i n i ( D ) = ∑ k = 1 ∣ γ ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ γ ∣ p k 2 Gini(D)=\sum_{k=1}^{|γ|}\sum_{k'\not=k}p_kp_{k'}\\=1−\sum_{k=1}^{|γ|}p^2_k Gini(D)=k=1γk=kpkpk=1k=1γpk2

直观来说, G i n i ( D ) Gini(D) Gini(D)反映了从数据集 D D D随机抽取两个样本,其类别标记不一致的概率.因此, G i n i ( D ) Gini(D) Gini(D)越小,则数据集 D D D的纯度越高.

有了基尼值后,可以在此基础上定义基尼指数:

G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini\_index(D,a)=\sum_{v=1}^V\frac{|D_v|}{|D|}Gini(D^v) Gini_index(D,a)=v=1VDDvGini(Dv)

于是,我们在候选属性集合 A A A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性,即 a ∗ = arg min ⁡ a ∈ A G i n i _ i n d e x ( D , a ) a_*=\argmin_{a\in A}Gini\_index(D,a) a=aAargminGini_index(D,a)


3 剪枝处理

剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。

在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,这时就可能因训练样本学得“太好”了,以致于把训练集自身的一些特点当作所有数据都具有的一般性质而导致过拟合。因此,可通过主动去掉一些分支来降低过拟合的风险

决策树剪枝的基本策略有“预剪枝”(prepruning)和“后剪枝”(post-pruning)。

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

  • 预剪枝使得决策树的很多分支都没有“展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销.

  • 但另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险.

(2)后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

  • 后剪枝决策树通常比预剪枝决策树保留了更多的分支.一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树.

  • 但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多.

参考:
[1]https://blog.csdn.net/qq_17073497/article/details/80483051
[2]https://blog.csdn.net/bravery_again/article/details/81104914
[3]https://blog.csdn.net/qq_31019183/article/details/100358579
[3]机器学习 周志华 清华出版社

THE END.

感谢阅读。

你可能感兴趣的:(机器学习,决策树)