R 决策树

来源:互联网 发布:DRGS网络上报 编辑:程序博客网 时间:2024/04/27 21:36

决策树模型的基本计算步骤:先从n个自变量中挑选一个,寻找最佳分割点,将数据划分为两组。针对分组后数据,将上述步骤重复下去,直到满足某种条件。在决策树建模中需要解决的重要问题有三个:如何选择自变量,如何选择分割点,确定停止划分的条件。R语言中关于决策树建模,最为常用的有两个包,一个是rpart包,另一个是party包

  • rpart包的处理方式:首先对所有自变量和所有分割点进行评估,最佳的选择是使分割后组内的数据更为“一致”(pure)。这里的“一致”是指组内数据的因变量取值变异较小。rpart包对这种“一致”性的默认度量是Gini值。确定停止划分的参数有很多(参见rpart.control),确定这些参数是非常重要而微妙的,因为划分越细,模型越复杂,越容易出现过度拟合的情况,而划分过粗,又会出现拟合不足。处理这个问题通常是使用“剪枝”(prune)方法。即先建立一个划分较细较为复杂的树模型,再根据交叉检验(Cross-Validation)的方法来估计不同“剪枝”条件下,各模型的误差,选择误差最小的树模型。
          有关包的使用:http://www.dataguru.cn/thread-178533-1-1.html

                                      http://wenku.baidu.com/view/7b01d69c51e79b8968022679.html

  • party包的处理方式:它的背景理论是“条件推断决策树”(conditional inference trees):它根据统计检验来确定自变量和分割点的选择。即先假设所有自变量与因变量均独立。再对它们进行卡方独立检验,检验P值小于阀值的自变量加入模型,相关性最强的自变量作为第一次分割的自变量。自变量选择好后,用置换检验来选择分割点。用party包建立的决策树不需要剪枝,因为阀值就决定了模型的复杂程度。所以如何决定阀值参数是非常重要的(参见ctree_control)。较为流行的做法是取不同的参数值进行交叉检验,选择误差最小的模型参数。

一、party 包

### step1:构件训练集和测试集,70%作为训练集,30%作为测试集,用sample函数随机采样set.seed(2016)ind<-sample(2,nrow(iris),replace=TRUE,prob=c(0.7,0.3))trainData<-iris[ind==1,]testData<-iris[ind==2,]### step2:构件决策树,用plot可以画出决策树iris_ctree<-ctree(Species~.,data=trainData)   #~.表示用剩余的所有变量作为分类变量table(predict(iris_ctree),trainData$Species)plot(iris_ctree)### step3:用predict函数对测试数据进行测试testPred<-predict(iris_ctree,newdata=testData)table(testPred,testData$Species)



二、apart包

通常分为两步建立回归树,最初生成一颗较大的树,然后通过统计估量删除底部的一些节点来对树进行修剪。这个过程的目的是防止过度拟合

第一步:生成一棵树

### train the decision treemyformula<-Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Widthiris_rpart<-rpart(myformula,data=trainData)summary(iris_rpart)###  draw the decision tree   ## method 1plot(iris_rpart, main="Classification Tree")text(iris_rpart,use.n=T, col="blue")  ## method 2rpart.plot(iris_rpart)  ## method 3prp(iris_rpart)###  use contigency table to see how accurate it isprediction<-predict(iris_rpart,newdata=testData,type="class")table(prediction,testData$Species)

第二步:剪枝  prune( ) 函数


       cp系数越小,树越复杂,所以可以合理控制cp,降低树的复杂度。选择树的方法一般有两种:
  1. 最小化交叉验证的相对方差(xerror
  2. 1- SE( 1标准差) 规则。其意思是: 首先要保证预测误差( 通过交叉验证获得, 在程序中表示为xerror) 尽量小,     但不一定要取最小值, 而是允许它在“最小的误差”一个相应标准差0、的范围内, 然后在此范围内选取尽量小的复杂性参量,  进而以它为依据进行剪枝。这个规则体现了兼顾树的规模( 复杂性) 和误差大小的思想, 因为一般说来, 随着拆分的增多, 复杂性参量会单调下降(纯度越来越高) , 但是预测误差则会先降后升, 这样, 就无法使复杂性和误差同时降到最低,因此允许误差可以在一个标准差内波动。

model2<-prune(model,cp=model$cptable[which.min(model$cptable[,"xerror"]),"CP"])rpart.plot(model2)











0 0
原创粉丝点击