分类与回归树(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》