全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 经管代码库
3934 3
2015-08-04

    今天学习了分类算法中的决策树。博大精深。


一、基本信息

    1、名称区别:决策树是统称,也称为分类树(分类变量)、回归树(连续变量)。


    2、定义:决策树模型是一种简单易用的非参数分类器。它不需要对数据有任何的先验假设,计算速度较快,结果容易解释,而且稳健性强,不怕噪声数据和缺失数据。

a、直观明了,神经网络 (这种方法的权重以及预测机制往往让人觉得很不透明) 等预测方法。

b、对缺失值的处理,是删除因变量缺失的观测 ,而保留有自变量缺失的观测 。


    3、决策树建模步骤:

1、如何选择自变量

2、如何选择分割点

3、确定停止划分的条件


    二、常见分类





1、3种最常见的决策树:

    CART分类回归树(classification and regression tree)。每个节点采用二分法(与C4.5最大的区别,c4.5可以有很多分支);用Gini Ratio作为衡量指标,如果分散指标程度很高的说明数据有很多类别。

    C4.5。最新有5.0版本;先建完整的决策树;使用自定义的错误率(Predicted Error Rate)对节点修剪。

    CHAID 卡方自动交互检验 (Chi-squared Automatic Interaction)。计算节点中类别的p值。根据p值的大小决定决策树是否生长不需要修剪(与前两者的区别)。


    2、聚类分析、判别分析、分类树的区别



三、R语言中rpart包与party包的区别




  1、CP参数定义

    cp: complexity parameter复杂性参数,用来修剪树的.


    当决策树复杂度超过一定程度后,随着复杂度的提高,测试集的分类精确度反而会降低。因此,建立的决策树不宜太复杂,需进行剪枝。该剪枝算法依赖于复杂性参数cp,cp随树复杂度的增加而减小,当增加一个节点引起的分类精确度变化量小于树复杂度变化的cp倍时,则须剪去该节点。故建立一棵既能精确分类,又不过度适合的决策树的关键是求解一个合适的cp值。一般选择错判率最小值对应的cp值来修树.


    2、CP选择问题

建立树模型要权衡两方面问题,一个是要拟合得使分组后的变异较小,另一个是要防止过度拟合,而使模型的误差过大,前者的参数是CP,后者的参数是Xerror。所以要在Xerror最小的情况下,也使CP尽量小。




四、决策树建模步骤详





1、生成随机数——runif(nrow(x),0,1)

2、将数据集进行划分,训练集与测试集

titanic.train <- titanic[x < .4,]

titanic.test <- titanic[x>= .4,]

选取了x变量 小于0.4 或 大于0.4 为训练集

  • library(rpart);  
  •   
  • ## rpart.control对树进行一些设置  
  • ## xval是10折交叉验证  
  • ## minsplit是最小分支节点数,这里指大于等于20,那么该节点会继续分划下去,否则停止  
  • ## minbucket:叶子节点最小样本数  
  • ## maxdepth:树的深度  
  • ## cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度  
  • ct <- rpart.control(xval=10, minsplit=20, cp=0.1)  
  •   
  • ## kyphosis是rpart这个包自带的数据集  
  • ## na.action:缺失数据的处理办法,默认为删除因变量缺失的观测而保留自变量缺失的观测。           
  • ## method:树的末端数据类型选择相应的变量分割方法:  
  • ## 连续性method=“anova”,离散型method=“class”,计数型method=“poisson”,生存分析型method=“exp”  
  • ## parms用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法(gini和information)  
  • ## cost我觉得是损失矩阵,在剪枝的时候,叶子节点的加权误差与父节点的误差进行比较,考虑损失矩阵的时候,从将“减少-误差”调整为“减少-损失”  
  • fit <- rpart(Kyphosis~Age + Number + Start,  
  •     data=kyphosis, method="class",control=ct,  
  •     parms = list(prior = c(0.65,0.35), split = "information"));  
  •   
  • ## 第一种  
  • par(mfrow=c(1,3));  
  • plot(fit);  
  • text(fit,use.n=T,all=T,cex=0.9);  
  •   
  • ## 第二种,这种会更漂亮一些  
  • library(rpart.plot);  
  • rpart.plot(fit, branch=1, branch.type=2, type=1, extra=102,  
  •            shadow.col="gray", box.col="green",  
  •            border.col="blue", split.col="red",  
  •            split.cex=1.2, main="Kyphosis决策树");  
  •   
  • ## rpart包提供了复杂度损失修剪的修剪方法,printcp会告诉分裂到每一层,cp是多少,平均相对误差是多少  
  • ## 交叉验证的估计误差(“xerror”列),以及标准误差(“xstd”列),平均相对误差=xerror±xstd  
  • printcp(fit);  
  •   
  • ## 通过上面的分析来确定cp的值  
  • ## 我们可以用下面的办法选择具有最小xerror的cp的办法:  
  • ## prune(fit, cp= fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])  
  •   
  • fit2 <- prune(fit, cp=0.01);  
  • rpart.plot(fit2, branch=1, branch.type=2, type=1, extra=102,  
  •            shadow.col="gray", box.col="green",  
  •            border.col="blue", split.col="red",  
  •            split.cex=1.2, main="Kyphosis决策树");


0001.jpg

0002.jpg

0003.jpg

0004.jpg

0005.jpg

0006.jpg

欢迎大牛们一起交流~






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-8-5 08:36:32
在牛A与牛C间的道路上越走越远了,哈哈~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-8-5 19:02:10
感谢分享,壮哉,伟哉!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-10-29 22:37:25
请问大神们,如果变量是个2分类的变量,比如性别(男性、女性)如何在CART方法中制作到决策树中?本人按上面代码跑过一遍,Sex被划分为0.5了,应该是按男性/女性来划分!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群