zoukankan      html  css  js  c++  java
  • 决策树之CART算法

    顾名思义,CART算法(classification and regression tree)分类和回归算法,是一种应用广泛的决策树学习方法,既然是一种决策树学习方法,必然也满足决策树的几大步骤,即:1特征的选择 2决策树的生成 3 决策树的剪枝 三大步骤,CART算法既可以用于分类还可以用于回归。

    CART是在给定输入随机变量X的条件下输出随机变量Y的条件概率分布的学习方法,CART 有个特性就是其假设决策树全部是二叉树,也就是说其结点只有两种选择,‘是’和‘否’,说专业点就是决策树递归的二分每个特征,最终得到决策树,通过不断的划分,将特征空间划分为有限个单元,并在这些单元上确定预测的概率分布。

    下面将从CART 的生成和剪枝两部分对CART算法进行详细的介绍和归纳总结

    一 CART的生成

    正如上文中所讲,CART决策树的生成就是递归的构建二叉树,但是针对分类和回归使用的策略是不一样的,对于回归树,使用的是平方误差最小准则;而对于分类树,使用的是基尼指数最小化准则。

     1 回归树的生成

    假设X和Y分别是输入和输出变量,并且Y是连续变量,训练数据集给定,D=left { (x1,y1),(x2,y2),(x3,y3)......(x_{n},y_{n}) 
ight }

    一个回归树是对应着输入空间(特征空间)的一个划分以及在划分单元上的输出之,此处假设已将输入空间划分为M个单元R1,R2,R3......Rm,并在每一个单元Rm上有固定的输出值Cm,那么回归树的模型则可以表示为:f(x)=sum_{m=1}^{M}c_{m}I(xepsilon Rm)

    这个公式不难理解,将特征空间进行了一定的划分,给一个划分赋予对应的值,那么当一个新的样本点到来的时候,根据它所属的单元赋予对应的值,这应该也就是回归树的含义了吧~  PS:若理解有错请批评指正

    另一方面,当输入空间的划分确定,便可以用平方误差来表示回归树对训练数据的误差:sum_{x_{i}epsilon Rm}^{ } (y_{i}-f(x_{i}))^{2},利用平方误差最小的准则来求解每个单元上的最优值,直观理解,根据平方误差最小准则,这个最优值其实就是本单元上所有输入值对应的y的平均值,因为只有这样才能使得平方误差最小,仔细考虑一下确实是这样。公式表达则是:C_{m} = ave(y_{i}| x_{i}epsilon R_{m})

    这样一来,对于回归树,问题应该就只剩下如何进行特征空间的划分了,李老师书中所说,这里采用的是启发式的方法,选择第j个变量x^{(j)}和它对应的取值s,作为切分变量和切分点,定义两个区域:

    R_{1}(j,s)=left { x|x^{(j)}leq s 
ight } 和R_{2}(j,s)=left { x|x^{(j)}geq s 
ight }  就是利用切分变量和切分点划分成两个区域!

    然后寻找最优切分变量j和切分点s,求解以下公式:

    min left [ min sum_{x_{i}epsilon R_{1}(j,s)}^{ } (y_{i}-c1)^{2}+min sum_{x_{i}epsilon R_{2}(j,s)}^{ } (y_{i}-c2)^{2} 
ight ]

    当j固定时,可以找到最优的切分点s,然后遍历所有的输入变量,找到最优的切分点j,构成一个(j,s)对,依次将输入空间划分,重复上述过程,直到划分完成为止,这样就形成了一颗回归树。

    总结最小二乘回归树算法步骤:

    输入:训练数据集D

    输出:回归树f(x)

    1 首先对特征空间进行划分,注意选择顺序,先遍历变量j,然后对固定的变量j找到最优的切分点s,然后选择使得下式最小的键值对(j,s),即:min left [ min sum_{x_{i}epsilon R_{1}(j,s)}^{ } (y_{i}-c1)^{2}+min sum_{x_{i}epsilon R_{2}(j,s)}^{ } (y_{i}-c2)^{2} 
ight ]

    用此键值对(j,s)对输入空间进行划分,然后取划分空间内y的平均值作为其输出值,公式如下:

    R_{1}(j,s)=left { x|x^{(j)}leq s 
ight } andR_{2}(j,s)=left { x|x^{(j)}geq s 
ight }

    3 继续对两个子空间调用步骤1和2 直到满足相应的输出条件,生成决策树f(x)=sum_{m=1}^{M}c_{m}I(xepsilon Rm)

    2 分类树的生成

    分类树的策略用的是基尼指数,那么首先介绍基尼指数的概念:

    Gini(p)=sum_{k=1}^{K}p_{k}(1-p_{k})=1-sum_{k=1}^{K}p_{k}^{2} 没错,这就是所谓的基尼指数啦!

    对于二分类问题,它的基尼指数又是什么样子呢? 读者仔细思考一下,发现哇,原来相加的两项完全一样啊,没错就是

    2p(1-p)

    那给定一个训练集,它的基尼指数又是什么呢? 假设训练集中有K类,C1,C2,C3......Ck 那么其基尼指数为:

    Gini(D)= 1-sum_{k=1}^{K}left ( frac{|Ck|}{|D|}
ight )^{2} 和上式的第二项对应,更进一步,如果训练样本被特征A的是否取某一个值a而被分成D1和D2两部分,那么在特征A的条件下的基尼指数为:

    Gini(D,A)=frac{|D1|}{D}Gini(D1)+frac{|D2|}{|D|}Gini(D2),相当于对根据特征A划分的两个小集合分别求基尼指数然后根据经验概率取期望得到特征A下的D的基尼指数。

    基尼指数表示集合D的不确定性,而基尼指数Gini(D,A)表示经A=a分割后集合的不确定性,基尼指数越大,集合不确定性就越大,这跟熵的概念类似,心细的读者也发现,本篇文章和上篇在公式上有诸多相似之处。

    分类树生成算法总结

    输入: 训练数据集D,停止计算条件

    输出:CART 分类树

    1 训练数据集为D,计算现有特征对训练数据集的基尼指数,此时对于每一个特征A,对其可能取得每一个值a,根据此值将训练样本切分为D1和D2两部分,然后根据上式计算A=a基尼指数Gini(D,A)=frac{|D1|}{D}Gini(D1)+frac{|D2|}{|D|}Gini(D2)

    2 在所有可能的特征以及所有可能的值里面选择基尼指数最小的特征及其切分点作为最优的特征及切分点,从结点生成两个子结点,将训练数据集分配到子结点中去

    3 递归的调用1 2 直到满足停止的条件

    4 生成分类决策树

    那么计算停止的条件可以是什么呢?这里简单列举一下:结点中的样本数小于阈值 样本集的基尼指数小于阈值 或者特征已经用完了都可以作为停止的条件哦

    好啦,总结到这里基本上算是讲完了CART算法的大概了,下面的部分主要讲的是CART算法的剪枝,很难啊 好气啊!


    CART的剪枝

    CART剪枝算法由两步组成 1首先从生成算法产生的决策树T0底端开始不断的剪枝,直到T0的根结点,形成子树序列{T0,T1,T2,T3......Tn} T0就是没剪的,T1就是剪了一个叶结点的,T2就是又剪了一点的这样子哦!

    然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树,具体操作如下:

    1 剪枝,形成子树序列

    在剪枝的过程中,计算子树的损失函数: (之前篇幅中介绍过)

    C_{a}(T)=C(T)+alpha |T|

    可以用递归的方法对树进行剪枝,将alpha从小增大,0=alpha _{0}< alpha _{1}< alpha _{2}< alpha _{3}< ......alpha _{n}< Na,产生一系列的区间(ai,ai+1),i=0,1,2......n的最优子树序列{T0,T1......Tn},序列中的子树是嵌套的,这句的意思是不同的alpha产生的子树是完整最优子树一部分一部分的缺少这个意思吧?

    具体的,从整体树T0开始剪枝,对T0的任意内部结点t,以t为单结点树的损失函数是 C_{alpha }=C(t)+alpha

    而以t为根结点的子数T_{t}的损失函数是 C_{alpha }(T_{t})=C(T_{t})+alpha |T_{t}|

    alpha=0时候,C_{alpha }(T_{t})<C_{alpha }  因为对于单结点和多结点树很明显多结点树的分类效果在训练数据集上的误差要小很多

    alpha继续增大到某一处,会出现二者相等的情况,alpha再继续增大,则二者反向。

    只要alpha=frac{C(t)-C(T_{t})}{|T_{t}|-1},则Tt和t有着相同的损失函数值,t的结点较少,t比Tt更可取,对Tt进行剪枝。

    2在剪枝得到的子树序列T0,T1,....Tn中通过交叉验证选取最优子树

    利用平方误差准则或者是基尼指数准则,在新的验证集中分别测试子树序列,选取里面最优的子树进行输出,便是裁剪之后的子树

    总结一下剪枝算法的步骤

    输入:CART算法生成的决策树T0

    输出: 最优的决策树Ta

    1 设k=0,T=T0

    2 设alpha=Na(正无穷)

    3自下而上的对内部结点t进行计算C(Tt),|Tt|和g(t)=frac{C(t)-C(T_{t})}{|T_{t}|-1}alpha=min(alpha,g(t))

    4 对g(t)=alpha的内部结点进行剪枝,并对叶结点t以多数表决法决定其类,得到树T

    5 设k=k+1,alphak=alpha,Tk=T

    6 如果Tk不是由根结点及两个叶结点构成的树,回到步骤3,否则另Tk=Tn

    7 采用交叉验证法在子树序列上进行验证选取最优子树Talpha

    本篇绝大多数内容取自与李航老师的《统计学习方法》一书,只是对它进行了归纳总结,加强记忆,有兴趣深入了解的同学可以购买正版书籍进行阅读!希望我的归纳能让您更好的理解书中的内容!

  • 相关阅读:
    MongoDB高级操作
    MongoDB基本操作
    Python字符串
    Git标签和别名管理
    Git分支管理
    Git远程仓库(github
    Git分布式版本管理工具基本使用方法
    CentOS7防火墙
    CentOS7新特性
    Linux系统初始流程
  • 原文地址:https://www.cnblogs.com/kerwins-AC/p/9550313.html
Copyright © 2011-2022 走看看