CART分类与回归树

来源:互联网 发布:input onchange php 编辑:程序博客网 时间:2024/05/18 17:02

【十大经典数据挖掘算法】系列

  1. C4.5
  2. K-Means
  3. SVM
  4. Apriori
  5. EM
  6. PageRank
  7. AdaBoost
  8. kNN
  9. Naïve Bayes
  10. CART

1. 前言

分类与回归树(Classification and Regression Trees, CART)是由四人帮Leo Breiman, Jerome Friedman, Richard Olshen与Charles Stone于1984年提出,既可用于分类也可用于回归。本文将主要介绍用于分类的CART。CART被称为数据挖掘领域内里程碑式的算法。

不同于C4.5,CART本质是对特征空间进行二元划分(即CART生成的决策树是一棵二叉树),并能够对标量属性(nominal attribute)与连续属性(continuous attribute)进行分裂。

2. CART生成

前一篇提到过决策树生成涉及到两个问题:如何选择最优特征属性进行分裂,以及停止分裂的条件是什么。

特征选择

CART对特征属性进行二元分裂。特别地,当特征属性为标量或连续时,可选择如下方式分裂:

An instance goes left if CONDITION, and goes right otherwise

即样本记录满足CONDITION则分裂给左子树,否则则分裂给右子树。

标量属性

进行分裂的CONDITION可置为不等于属性的某值;比如,标量属性Car Type取值空间为{Sports, Family, Luxury},二元分裂与多路分裂如下:

连续属性

CONDITION可置为不大于ε” role=”presentation” style=”position: relative;”>εε取属性相邻值的平均值,其二元分裂结果如下:

接下来,需要解决的问题:应该选择哪种特征属性及定义CONDITION,才能分类效果比较好。CART采用Gini指数来度量分裂时的不纯度,之所以采用Gini指数,是因为较于熵而言其计算速度更快一些。对决策树的节点t” role=”presentation” style=”position: relative;”>tt,Gini指数计算公式如下:

(1)Gini(t)=1−∑k[p(ck|t)]2” role=”presentation” style=”width: 100%; position: relative;”>Gini(t)=1k[p(ck|t)]2(1)(1)Gini(t)=1−∑k[p(ck|t)]2
\begin{equation} Gini(t)=1-\sum\limits_{k}[p(c_k|t)]^2

Gini指数即为1” role=”presentation” style=”position: relative;”>11;分裂后的Gini指数定义如下:

(2)G(D,A)=|DL||D|Gini(DL)+|DR||D|Gini(DR)” role=”presentation” style=”width: 100%; position: relative;”>G(D,A)=|DL||D|Gini(DL)+|DR||D|Gini(DR)(2)(2)G(D,A)=|DL||D|Gini(DL)+|DR||D|Gini(DR)
\begin{equation} G(D,A)={\left|{D_L} \right| \over \left|{D} \right|}Gini(D_L)+{\left|{D_R} \right| \over \left|{D} \right|}Gini(D_R)

其中,|⋅|” role=”presentation” style=”position: relative;”>|||⋅|表示样本集合的记录数量。

CART算法

CART算法流程与C4.5算法相类似:

  1. 若满足停止分裂条件(样本个数小于预定阈值,或Gini指数小于预定阈值(样本基本属于同一类,或没有特征可供分裂),则停止分裂;
  2. 否则,选择最小Gini指数进行分裂;
  3. 递归执行1-2步骤,直至停止分裂。

3. CART剪枝

CART剪枝与C4.5的剪枝策略相似,均以极小化整体损失函数实现。同理,定义决策树T” role=”presentation” style=”position: relative;”>TT的损失函数为:

(3)Lα(T)=C(T)+α|T|” role=”presentation” style=”width: 100%; position: relative;”>Lα(T)=C(T)+α|T|(3)(3)Lα(T)=C(T)+α|T|
\begin{equation} L_\alpha (T)=C(T)+\alpha \left| T \right|

其中,C(T)” role=”presentation” style=”position: relative;”>C(T)C(T)为模型的复杂度。

CART算法采用递归的方法进行剪枝,具体办法:

  • α” role=”presentation” style=”position: relative;”>αα
  • 从最优子树序列{T1,T2,⋯,Tn}” role=”presentation” style=”position: relative;”>{T1,T2,,Tn}{T1,T2,⋯,Tn}选出最优的(即损失函数最小的)。

如何计算最优子树为Ti” role=”presentation” style=”position: relative;”>TiTi为单节点的损失函数为

Lα(t)=C(t)+α” role=”presentation” style=”position: relative;”>Lα(t)=C(t)+αLα(t)=C(t)+α
L_\alpha (t)=C(t)+\alpha

t” role=”presentation” style=”position: relative;”>tt的损失函数为

Lα(Tt)=C(Tt)+α|Tt|” role=”presentation” style=”position: relative;”>Lα(Tt)=C(Tt)+α|Tt|Lα(Tt)=C(Tt)+α|Tt|
L_\alpha (T_t)=C(T_t)+\alpha \left| T_t \right|

Lα(t)=Lα(Tt)” role=”presentation” style=”position: relative;”>Lα(t)=Lα(Tt)Lα(t)=Lα(Tt),则得到

α=C(t)−C(Tt)|Tt|−1” role=”presentation” style=”position: relative;”>α=C(t)C(Tt)|Tt|1α=C(t)−C(Tt)|Tt|−1
\alpha = {C(t)-C(T_t) \over \left| T_t \right|-1}

此时,单节点t” role=”presentation” style=”position: relative;”>tt的剪枝后整体损失函数减少程度为

g(t)=C(t)−C(Tt)|Tt|−1” role=”presentation” style=”position: relative;”>g(t)=C(t)C(Tt)|Tt|1g(t)=C(t)−C(Tt)|Tt|−1
g(t) = {C(t)-C(T_t) \over \left| T_t \right|-1}

剪枝流程如下:

  • 对输入决策树T0” role=”presentation” style=”position: relative;”>T0T0对应的最优子树。
  • 对树T1” role=”presentation” style=”position: relative;”>T1T1……
  • 如此递归地得到最优子树序列,采用交叉验证选取最优子树。

关于CART剪枝算法的具体描述请参看[1],其中关于剪枝算法的描述有误:

(6)如果T不是由根节点单独构成的树,则回到步骤(4)

应改为回到步骤(3),要不然所有α” role=”presentation” style=”position: relative;”>αα均一样了。

———————————————–Update ——————————————————

李航老师已经在勘误表给出修改了。

4. 参考资料

[1] 李航,《统计学习方法》.
[2] Pang-Ning Tan, Michael Steinbach, Vipin Kumar, Introduction to Data Mining.
[3] Dan Steinberg, The Top Ten Algorithms in Data Mining.


本文为转载,原作者:Treant出处:http://www.cnblogs.com/en-heng/

0 0
原创粉丝点击