CART算法

CART算法

 

       CART全称为Classification And Regression Tree,分类和回归即是该算法的核心。分类算法在于生成决策树,CART为递归算法,总是将当前样本(not pure)分为两个子样本集,使得生成的每个非叶子节点都有两个分支,最终得到二叉树形式的决策树。

分类回归树是一棵二叉树,且每个非叶子节点都有两个孩子,所以对于第一棵子树其叶子节点数比非叶子节点数多1

       分类树两个基本思想:第一个是将训练样本进行递归地划分自变量空间进行建树的想法,也就是当前用来分类的属性的选取;第二个想法是用验证数据进行剪枝。

算法流程:

以下是算法描述:其中T代表当前样本集,当前候选属性集用T_attributelist表示。 
  (1)创建根节点N 
  (2)为N分配类别 
  (3)if T都属于同一类别or T中只剩下一个样本则返回N为叶节点,为其分配属性 
  (4)for each T_attributelist中属性执行该属性上的一个划分,计算此划分的GINI系数 
  (5)N的测试属性test_attribute=T_attributelist中最小GINI系数的属性 
  (6)划分T得到T1 T2子集 
  (7)对于T1重复(1)-(6) 
  (8)对于T2重复(1)-(6)

一、分类属性的选取

CART算法中引入杂质的改变量来作为属性选取的参照指标。

(1)杂质的计算公式:Gini(A) = 1 - Σ p(i)^2

(2)杂质的改变量的计算公式:Gini(A) - P(B)*Gini(B) - P(C)*Gini(C)

B、C是A二分裂出来的。

      假设决策属性值的值域为 { yes, no }, 公式中A代表样本,公式(1)中,p(0)和p(1)分别代表样本A中用例的决策属性值出现yes和no的概率,取极端情况,p(0)=1和p(0)=0,即该样本的特征很单一,此时Gini(A)值为0,即没有杂质。

      先选取一个属性,将样本A划分为两个子样本B和C,其中样本B和样本C中用例总数占样本A总数的比例分别为P(B)和P(C),某属性划分出的子样本杂质越小,证明该属性的取值对决策的影响越明显,因为划分出的杂质越小,杂质的改变量就越大,所以我们需要Gini(B)和Gini(C)越小越好,我们总是选取杂质改变量最大的属性来做当前划分样本的依据。

      对于每个属性列出划分为两个子集的所有可能组合,计算每种组合下生成子节点的异质性,也就是杂质程度。同样,找到使异质性减小程度最大的组合作为最佳划分点。如果某个属性只有两个子集的话,就只有一种划分方法,关于多个子集的GINI求解问题,可以采用贪心算法

例子:最后一列  拖欠贷款者  是类标记

CART算法是可以用来多分类的,这里举的例子是二分类的,只不过每一步都是二分裂。

CART算法_第1张图片

CART算法_第2张图片

属性婚姻状况有三个子集,我们要把它分成两个属性分支,并选取最好的分法:

CART算法_第3张图片CART算法_第4张图片

可以看到当选取婚姻状况属性的时候:单身或离异、已婚时GINI最小,是最佳分类属性。

年收入定为80k的GINI和第一个有房无房分布一样,结果也是0.343

CART算法_第5张图片

终止条件:

1、 节点达到完全纯度

2、 树的深度达到用户所要的深度

3、 节点中样本个数少于用户指定个数

4、 异质性指标下降的最大幅度小于用户指定的幅度

 

二、剪枝

      当分类回归树划分得太细时,会对噪声数据产生过拟合作用。因此我们要通过剪枝来解决。剪枝的作用是减去过分拟合带来的冗余,用尽可能少的决策点,尽可能低的树高获得尽可能大的正确率。

      剪枝又分为前剪枝和后剪枝:前剪枝是指在构造树的过程中就知道哪些节点可以剪掉,于是干脆不对这些节点进行分裂,后剪枝是指构造出完整的决策树之后再来考查哪些子树可以剪掉。在分类回归树中可以使用的后剪枝方法有多种,比如:代价复杂性剪枝、最小误差剪枝、悲观误差剪枝等等。这里我们只介绍代价复杂性剪枝法。

对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α。

是子树中包含的叶子节点个数;

是节点t的误差代价,如果该节点被剪枝;

r(t)是节点t的误差率;

p(t)是节点t上的数据占所有数据的比例。

是子树Tt的误差代价,如果该节点不被剪枝。它等于子树Tt上所有叶子节点的误差代价之和。

比如有个非叶子节点t4如图所示:

CART算法_第6张图片

已知所有的数据总共有60条,则节点t4的节点误差代价为:


(16个里面有7个不纯,其实这里也就是等价于7个不纯的除以总的60个,公式可以简化的,这里分为两部分来求不知道是什么意思,或许有别的用途)

子树误差代价为:

(对每个叶子节点中的两个分类,个数少的是误差)

以t4为根节点的子树上叶子节点有3个,最终:

找到α值最小的非叶子节点,令其左右孩子为NULL。当多个非叶子节点的α值同时达到最小时,取最大的进行剪枝。

      关于什么时候停止剪枝的问题,讨论结果是,对每一个剪枝后的树,计算其测试误差率,保存误差率最小的那个为最优的剪枝结果,也就是说一直剪到根节点再进行比较。

算法的缺点是要求被选择的属性是连续且有序的,并且只能产生两个子节点。

最后说下CART和C4.5的比较:

CART算法_第7张图片



——Summer_ZJU(部分内容整理自网络)

转载请注明出处:夏天的风的博客

参考资料:华夏35度博客、HAPPY博客团队

                          

你可能感兴趣的:(【Data,Mining】)