决策树生长与修剪(一股黄土地气场)

来源:互联网 发布:js 验证上传文件格式 编辑:程序博客网 时间:2024/04/29 16:35

简介与思想:

如果一个人必须去选择在很大范围的情形下性能都好的、同时不需要应用开发者付出很多的努力并且易于被终端用户理解的分类技术的话,那么分类树方法是一个强有力的分类。


分类树
在分类树下面有两个关键的思想。第一个是关于递归地划分自变量空间的想法;第二个想法是用验证数据进行剪枝


递归划分
让我们用变量y表示因变量(分类变量output),用x1, x2, x3,...,xp表示自变量input。通过递归的方式把关于变量x的p维空间划分为disjoint不重叠的矩形

首先,一个自变量被选择,比如xi和xi的一个值si,比方说选择si把p维空间为两部分(这里原文其实举了regression tree的例子):一部分是p维的超矩形,其中包含的点都满足xi<=si(numeric input),另一个p维超矩形包含所有的点满足xi>si。接着,这两部分中的一个部分通过选择一个变量和该变量的划分值以相似的方式被划分。这导致了三个矩形区域(从这里往后我们把超矩形都说成矩形)。

随着这个过程的持续,我们得到的矩形越来越小。这个想法是把整个x空间划分为矩形,其中的每个小矩形都尽可能是同构的或“纯”的(熵也在这过程趋于0)。“纯”的意思是(矩形)所包含的点都属于同一类。


原文地址

这是一个很简单的CART的范例,大概是上节课DM的内容以及这次作业

分类-回归树模型(CART)在R语言中的实现

CART模型,即Classification And Regression Trees。C是适合symbolic,R适合numeric。它和一般回归分析类似,是用来对变量进行解释和预测的工具,也是数据挖掘中的一种常用算法。如果因变量是连续数据,相对应的分析称为回归树,如果因变量是分类数据,则相应的分析称为分类树

决策树是一种倒立的树结构,它由内部节点、叶子节点和边组成。其中最上面的一个节点叫根节点。 构造一棵决策树需要一个训练集,一些例子组成,每个例子用一些属性(或特征)和一个类别标记来描述。构造决策树的目的是找出属性和类别间的关系,一旦这种关系找出,就能用它来预测将来未知类别的记录的类别。这种具有预测功能的系统叫决策树分类器。
其算法的优点在于:1)可以生成可以理解的规则。2)计算量相对来说不是很大。3)可以处理多种数据类型。4)决策树可以清晰的显示哪些变量较重要。

下面以一个例子来讲解如何在R语言中建立树模型。为了预测身体的肥胖程度,可以从身体的其它指标得到线索,例如:腰围、臀围、肘宽、膝宽、年龄。

#首先载入所需软件包
library(mboost)
library(rpart)
library(maptree)

#读入样本数据
data('bodyfat')

#建立公式
formular=DEXfat~age+waistcirc+hipcirc+elbowbreadth+kneebreadth

#用rpart命令构建树模型,结果存在fit变量中
fit=rpart(formular,method='anova',data=bodyfat)

#直接调用fit可以看到结果
n= 71
node), split, n, deviance, yval
      * denotes terminal node

 1) root 71 8535.98400 30.78282 
   2) waistcirc< 88.4 40 1315.35800 22.92375 
     4) hipcirc< 96.25 17  285.91370 18.20765 *
     5) hipcirc>=96.25 23  371.86530 26.40957 
      10) waistcirc< 80.75 13  117.60710 24.13077 *
      11) waistcirc>=80.75 10   98.99016 29.37200 *
   3) waistcirc>=88.4 31 1562.16200 40.92355 
     6) hipcirc< 109.9 13  136.29600 35.27846 *
     7) hipcirc>=109.9 18  712.39870 45.00056 *

#也可以用画图方式将结果表达得更清楚一些
draw.tree(fit)
#建立树模型要权衡两方面问题,一个是要拟合得使分组后的变异较小,另一个是要防止过度拟合,而使模型的误差过大,前者的参数是CP,后者的参数是Xerror。所以要在Xerror最小的情况下,也使CP尽量小。如果认为树模型过于复杂,我们需要对其进行修剪
#首先观察模型的误差等数据
printcp(fit)

Regression tree:
rpart(formula = formula, data = bodyfat)

Variables actually used in tree construction:
[1] hipcirc   waistcirc

Root node error: 8536/71 = 120.23

n= 71

        CP nsplit rel error  xerror     xstd
1 0.662895      0   1.00000 1.01364 0.164726
2 0.083583      1   0.33710 0.41348 0.094585
3 0.077036      2   0.25352 0.42767 0.084572
4 0.018190      3   0.17649 0.31964 0.062635
5 0.010000      4   0.15830 0.28924 0.062949

#调用CP(complexity parameter)与xerror的相关图,一种方法是寻找最小xerror点所对应的CP值,并由此CP值决定树的大小,另一种方法是利用1SE方法,寻找xerror+SE的最小点对应的CP值。
plotcp(fit)

#用prune命令对树模型进行修剪(本例的树模型不复杂,并不需要修剪)
pfit=prune(fit,cp= fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])

#模型初步解释:腰围和臀围较大的人,肥胖程度较高,而其中腰围是最主要的因素。
#利用模型预测某个人的肥胖程度

ndata=data.frame(waistcirc=99,hipcirc=110,elbowbreadth=6,kneebreadth=8,age=60)
predict(fit,newdata=ndata)

*本文主要参考了Yanchang Zhao的文章:“R and Data Mining: Examples and Case Studies”

翻译部分 原文http://plantecology.syr.edu/fridley/bio793/cart.html

什么时候该使用CART而不是一般线性规划GLM或者一般加性模型GAM?当预测变量们彼此之间有依赖关系的时候,CART模型的递归结构能更好的揭示这些依赖关系。例如说,土壤含水量的影响在很大程度上以非线性的方式依赖于土壤质地,物种出现的CART模型比在GLMS甚至是GAMS有更大可能发现。当你有很好的理由怀疑非加变量之间的相互作用,或有很多变量,不知道什么有没有依赖,那么试试树模型。

如果你只是有几个变量,并普遍预期简单的直线或曲线相关,相对简单的(或没有)的相互作用,树模型将只返回使用太多参数近似的实际关系(颠簸,而不是光滑) 。树模型也有overfit的倾向,从而导致过度诠释。最后,因为他们不涉及一个光滑函数拟合数据,树模型输出对于输入变量的微小变化可能过于敏感


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子抵抗力差爱生病怎么办 三岁宝宝总生病怎么办 冬天穿伴娘服冷怎么办 白衬衣粘了黑毛怎么办 黄衣服钻进黑毛怎么办 单位没给上社保怎么办 轮毂中心孔大了怎么办 钻戒大了怎么办小窍门 shift加f4没反应怎么办 多洗联系不上怎么办 弹力靴筒往下掉怎么办 子宫内膜厚月经停不了怎么办 雪纺衣服有静电怎么办 阿胶糕熬的稀了怎么办 感冒吃了阿胶糕怎么办 身上起湿疹很痒怎么办 身上起小疹子痒怎么办 吊带裙带子断了怎么办 裙子洗完缩水了怎么办 衬衫洗后缩水了怎么办 羊毛被洗缩水了怎么办 蕾丝洗后缩水了怎么办 天丝针织衫缩水怎么办? 氨纶面料起球怎么办? 新买的衬衫很硬怎么办 孕晚期睡不好觉怎么办 全棉衣服缩水了怎么办 棉麻的衣服起球怎么办 布艺沙发起球怎么办 加绒的衣服掉毛怎么办 新裤子有刺鼻味怎么办 新买鞋子味道大怎么办 天窗下水管堵了怎么办 雪纺衬衫染色了怎么办 雪纺衣服染色了怎么办 漂白后衣服变黄怎么办 用84泡衣服变红怎么办 84腐蚀过的衣服怎么办 紫檀手链泡水了怎么办 链条包链条太短怎么办 涂银遮光布有毒怎么办