自学数据挖掘十大算法之CART

分类与回归树(Classification andRegression Trees, CART)算法由Breiman等人于1984年提出,是分类数据挖掘算法的其中一种。CART采用一种二分递归分割的技术,将当前的样本集分为两个子样本集,使得生成的决策树的每个非叶子节点都有两个分支。CART算法生成的决策树是结构简洁的二叉树。分类树下面有两个关键的思想。第一个是关于递归地划分自变量空间的想法;第二个想法是用验证数据进行剪枝

CART算法使用如下结构的学习样本集:

                                                                                   


                                                                                   

其中,L是训练样本集,是属性向量(Attribute Vectors),其属性可以是离散的或者是有序的的;Y是标签向量(Label Vectors),其属性可以是离散的或者是有序的。Y是离散值,称为分类决策树;或Y是有序的数量值时,称为回归决策树树。

何为数值型变量、离散型变量?

数值型变量:对记录的值从小到大排列,计算每个值作为临界点产生的子节点的异质性统计量,能够使异质性减小程度最大的临界值便是最佳的划分点。

分类型变量:列出划分为两个子集的所有可能组合,计算每种组合生成子节点的异质性,同样,找到使异质性减小程度最大的临界值就是最佳的划分点。最佳的的划分就是使得GINI值最小的划分。

CART树的生成

在对数据进行预处理之后,开始构建决策树,决策树的核心算法是确定决策树分枝准则,该准则涉及到两个方面问题:⑴如何在众多的输入变量中选择出一个最佳的分组变量;⑵如何在分组变量的众多取值中寻找到最佳的分割值。

首先在生成原始树中引入差异系数(diversity index)的概念。此系数用于测度各个个结点内n(n>=2)个类样本的分布情况。在这里我们采用的是CART算法中最常用的杂质函数基尼系数(GINI),公式如下:

                        (3-1)

其中,p(j/t)为目标类别j在节点t中出现的比例。对于所有的P,所以GINI系数一定为正数,除非其中的一个P为1,而其他比为0。节点T在X属性下分为N1和N2两个部分,那么GAIN指数就是:

                       

(3-2)

而对训练集进行划分时,划分的规则是利用二叉树的表示形式,CART算法的开始是从根节点进行划分,对各个结点进行重复递归的过程[18]:

(1)对于每个结点,选择各个属性的最优划分点。根据样本中对于分割规则“否”或“是”的回答,将结点划分为左右两个子结点,从规则中寻找变量X ,如果 最小值 ,X 那么这就是当前属性的最优划分点。

(2)在上步骤所得到的最优划分点中选择对此结点最优的分割点,成为此结点的分割规则。分割规则的确定依据是使(2)式最小。

(3)重复对此结点分割出来的两个结点进行分割这一过程。直到样本全部属于同一类为止,或者持续到叶结点样本个数极少(如少于5个),这时建成的树层次多,叶结点多,此时该树为。

我们来看一个实例:

tid

有房者

 婚姻状况

年收入

拖欠贷款者

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

      是

      否

      否

      是

      否

      否

      是

      否

      否

      否

       单身

       已婚

       单身

       已婚

       离异

       已婚

       离异

       单身

       已婚

       单身

    125K

    100K

      70K

    120K

      95K

      60K

    220K

      85K

      75K

      90K

           否

           否

           否

           否

           是

           否

           否

           是

           否

           是

  • 以有无房子作为分裂属性计算它的Gini值

有房

无房

拖欠贷款

0

3

3

4

 

Gini(有房)=1-(3/3)²-(0/3)²=0

Gini(无房)=1-(4/7)²-(3/7)²=0.4849

Gini=0.3×0+0.7×0.4898=0.343

  •  以婚否作为分裂属性计算它的Gini值

单身

已婚

离异

拖欠贷款

2

0

1

2

4

1

Gini(单身)=1-(2/4)²-(2/4)²=0.5

Gini(已婚)=1-(0/4)²-(4/4)²=0

Gini(离异)=1-(1/2)²-(1/2)²=0.5

Gini=4/10×0.5+4/10×0+2/10×0.5=0.3

  • 以组合条件作为分裂属性计算它的Gini值

单身

已婚或离异

拖欠贷款

2

1

2

5

Gini(已婚或离异)=1-(5/6)²-(1/6)²=0.2778

Gini(单身)=1-(2/4)²-(2/4)²=0.5

Gini=6/10×0.2778+4/10×0.5=0.3667

已婚

单身或离异

拖欠贷款

0

3

4

3

Gini(单身或离异)=1-(3/6)²-(3/6)²=0.5

Gini(已婚)=1-(4/4)²-(0/4)²=0

Gini=6/10×0.5+4/10×0=0.3

离异

单身或已婚

拖欠贷款

1

2

1

6

Gini(单身或已婚)=1-(6/8)²-(2/8)²=0.375

Gini(离异)=1-(1/2)²-(1/2)²=0.5

Gini=8/10×0.375+2/10×0.5=0.4

剪枝

当分类回归树划分得太细时,会对噪声数据产生过拟合作用。因此我们要通过剪枝来解决。剪枝又分为前剪枝和后剪枝:前剪枝是指在构造树的过程中就知道哪些节点可以剪掉,于是干脆不对这些节点进行分裂,在N皇后问题和揹包问题中用的都是前剪枝;后剪枝是指构造出完整的决策树之后再来考查哪些子树可以剪掉。

Simplified pruning algorithm:

DEFINE: r(t)= training data misclassification rate in node t(节点t的误分率)

p(t)= fraction of the training data in node t(节点t上的数据在整个数据集上的比率)

R(t)= r(t)*p(t)(是节点t的误差代价,如果该节点被剪枝)

t_left=left child of node t

t_right=right child of node t(节点t的左右孩子)

|T| = number of terminal nodes in tree T(决策树最终的节点个数)

BEGIN: Tmax=largest tree grown

Current_Tree=Tmax

For all parents t of two terminal nodes

Remove all splits for which R(t)=R(t_left) + R(t_right)

Current_tree=Tmax after pruning

PRUNE: If |Current_tree|=1 then go to DONE

For all parents t of two terminal nodes

Remove node(s) t for which R(t)-R(t_left) - R(t_right) is minimum

Current_tree=Current_Tree after pruning

决策树的优缺点

优点:

1.可以生成可以理解的规则。

2.计算量相对来说不是很大。

3.可以处理连续和种类字段。

4.决策树可以清晰的显示哪些字段比较重要

缺点:

1.对连续性的字段比较难预测。

2.对有时间顺序的数据,需要很多预处理的工作。

3.当类别太多时,错误可能就会增加的比较快。

4.一般的算法分类的时候,只是根据一个字段来分类。

参考:

《CART算法在新浪微博客户分类中的应用研究》(本文大量参考了该文,如有侵权请联系删除)

《机器学习十大算法:CART》

发布了47 篇原创文章 · 获赞 7 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章