新决策树例子.docx

上传人:b****3 文档编号:4746844 上传时间:2022-12-08 格式:DOCX 页数:18 大小:618.39KB
下载 相关 举报
新决策树例子.docx_第1页
第1页 / 共18页
新决策树例子.docx_第2页
第2页 / 共18页
新决策树例子.docx_第3页
第3页 / 共18页
新决策树例子.docx_第4页
第4页 / 共18页
新决策树例子.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

新决策树例子.docx

《新决策树例子.docx》由会员分享,可在线阅读,更多相关《新决策树例子.docx(18页珍藏版)》请在冰豆网上搜索。

新决策树例子.docx

新决策树例子

rpart包的rpart函数

Iris数据集

library(rpart)#加载rpart包

head(iris)#看看iris数据集里有哪些变量

iris以鸢尾花的特征作为数据来源,数据集包含150个数据,分为3类,每类50个数据,每个数据包含4个属性分别是花萼长度、花萼宽带、花瓣长度、花瓣宽度

用gini度量纯度

iris.rp1=rpart(Species~.,data=iris,method="class",parms=list(split="gini"))

#rpart(formula,data,method,parms,...)得到决策树对象,其中

(1)formula是回归方程的形式,y~x1+x2+…,iris一共有5个变量,因变量是Species,自变量是其余四个变量,所以formula可以省略为Species~.

(2)data是所要学习的数据集

(3)method根据因变量的数据类型有如下几种选择:

anova(连续型),poisson(计数型),class(离散型),exp(生存型),因为我们的因变量是花的种类,属于离散型,所以method选择class

(4)parms可以设置纯度的度量方法,有gini(默认)和information(信息增益)两种。

plot(iris.rp1,uniform=T,branch=0,margin=0.1,main="ClassificationTree\nIrisSpeciesbyPetalandSepalLength")

#plot的对象是由rpart得到的决策树对象,可以把这课决策树画出来,其中

(1)uniform可取T,F两个值,T表示图形在空间上均匀分配

(2)branch刻画分支的形状,取值在0和1之间,branch=0是倒v型,branch=1是直角型,而当branch属于(0,1)时是梯形

(3)margin刻画图的大小,margin越大,决策树越小,上述三幅图的margin=0.1,而当margin=1时,决策树变小了

(4)main是图的标题,其中“\n”是换行的意思

 

text(iris.rp1,use.n=T,fancy=T,col="blue")

text(iris.rp1,use.n=T,fancy=F,col="blue")

(1)use.n=T,在每个节点处都会显示落在该节点的观测个数和对应的分类,use.n=F时就不显示观测个数了。

(2)fancy=T、F的区别见上图

(3)col=“blue”就是写在树上的信息的颜色。

还有另一种画图函数

library(rpart.plot)

rpart.plot(iris.rp1,branch=0,branch.type=2,type=1,extra=1,shadow.col="gray",box.col="green",border.col="blue",split.col="red",main="决策树")

rpart.plot(iris.rp1,branch=0,branch.type=0,type=1,extra=1,shadow.col="gray",box.col="green",border.col="blue",split.col="red",main="决策树")

(1)branch.type是分支的形状参数,branch.type=0时画出来的分支跟plot里的一样,就是一条线,而当branch.type=2时,分支的宽度是数据的标准差,branch.type=1时,是方差

(2)type:

type=0只对叶子节点画圆圈。

type=1对根节点和叶子节点画圆圈,分裂属性的值会写在节点框的上面。

type=2时跟type=1近似,但分裂属性的值会写在节点框的下面。

type=3时每个根节点左右分支对应的属性的取值范围都标出来了(之前那些都只标了左分支的属性取值),并且只对叶子节点画圆圈。

type=4时,跟type=3近似,但对叶子节点和根节点都画圆圈。

(3)extra是表示在节点处显示的额外信息的种类。

当extra=0(缺省值)时,无额外信息。

当extra=1,在节点处会显示落在该节点的观测个数和对应的分类(如上图)。

当extra=2,在节点处会显示(在该点分类正确的个数/落在该节点的观测个数)。

(4)shadow.col="gray",box.col="green",border.col="blue",split.col="red"分别是决策树中节点框的阴影颜色、填充颜色、边框颜色、和分类属性的颜色

用信息增益度量纯度

iris.rp2=rpart(Species~.,data=iris,method="class",parms=list(split="information"))

plot(iris.rp2,uniform=T,branch=0,margin=0.1,main="ClassificationTree\nIrisSpeciesbyPetalandSepalLength")

text(iris.rp2,use.n=T,fancy=T,col="blue")

由上面两幅图可以看出,对于iris数据集,无论是用信息增益(information)还是gini来选择分裂属性,得到的决策树都是一样的。

决策树检验

因为iris数据集比较简单,不需修树,我们可以把原来的150个样本随机分成学习集和测试集,用学习集来生成决策树,然后用测试集验证决策树的准确性。

ind<-sample(2,nrow(iris),replace=TRUE,prob=c(0.7,0.3))

iris.train=iris[ind==1,]#生成训练集

iris.test=iris[ind==2,]#生成测试集

iris.rp2=rpart(Species~.,iris.train,method=“class”)

iris.rp3=predict(iris.rp2,iris.test[,-5],type="class")

table(iris.test[,5],iris.rp3)

准确率=1-2/43=95.35%,与原来的96%准确性几乎一样,所以这颗决策树有加好的泛化能力。

 

我们再考虑另一个复杂一点的例子。

pima=read.table("D:

/Grace/pima.indians.diabetes3.txt",header=T)

数据说明:

通过7个变量(分别是怀孕次数npregnant,身体质量指数bmi,葡萄糖水平glucose,心脏血样diastolic.bp,皮下脂肪厚度skinfoldthickness,遗传影响pedigree,年龄age)来判断一个人是否患有糖尿病。

set.seed(123)

pima.rp<-rpart(pima[,9]~.,data=pima[,1:

7],cp=0.004,parms=list(split="gini"))

数据的第八列和第九列其实是一样的,有糖尿病(diabetic)的记为1,正常的记为0,把第九列的分类属性作为因变量,Pima数据集的前七列作为自变量,用gini来衡量纯度,

结果解释:

以根节点为例,观测总数是532,其中177例糖尿病,355例正常,该节点的分类属性是正常,所以错判例数(loss)是177,(错判率,正确判断率)=(0.332706770.66729323)。

如果根节点的观测满足glucose>=127.5(即128),则观测值落入左边的分支,否则落入右边的分支。

rpart.plot(pima.rp,branch=0,branch.type=0,type=1,extra=1,shadow.col="gray",box.col="green",border.col="blue",split.col="red",main="决策树")

图的解释:

1.每个节点框中的数字是:

(落在该节点有糖尿病的个数/正常的个数)

2.每个节点框内的diabetic、normal表示该节点对应的分类属性

printcp(pima.rp)#列出cp值

cp:

complexityparameter复杂性参数,用来修剪树的

当决策树复杂度超过一定程度后,随着复杂度的提高,测试集的分类精确度反而会降低。

因此,建立的决策树不宜太复杂,需进行剪枝。

该剪枝算法依赖于复杂性参数cp,cp随树复杂度的增加而减小,当增加一个节点引起的分类精确度变化量小于树复杂度变化的cp倍时,则须剪去该节点。

故建立一棵既能精确分类,又不过度适合的决策树的关键是求解一个合适的cp值。

一般选择错判率最小值对应的cp值来修树

plotcp(pima.rp)

pima.prune=prune(pima.rp,cp=pima.rp$cptable[which.min(pima.rp$cptable[,"xerror"]),"CP"]) 

xerror:

交叉验证(crossvalidation)错判率的估计

xstd:

交叉验证错判率的标准差

 

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

所以要在Xerror最小的情况下,也使CP尽量小。

 

Party包的ctree函数

party包的处理方式:

它的背景理论是“条件推断决策树”(conditionalinferencetrees):

它根据统计检验来确定自变量和分割点的选择。

即先假设所有自变量与因变量均独立。

再对它们进行卡方独立检验,检验P值小于阀值的自变量加入模型,相关性最强的自变量作为第一次分割的自变量。

自变量选择好后,用置换检验来选择分割点。

用party包建立的决策树不需要剪枝,因为阀值就决定了模型的复杂程度。

所以如何决定阀值参数是非常重要的(参见ctree_control)。

较为流行的做法是取不同的参数值进行交叉检验,选择误差最小的模型参数。

Ctree在Iris数据上的应用

##先载入包party

##构造分类树

iris_ctree<-ctree(Species~.,data=iris)

##画出分类树的图

plot(iris_ctree)

plot(iris_ctree,type="simple")

##比较用分类树预测的结果和实际结果之间的区别

table(predict(iris_ctree),iris$Species)

##由结果可以看出,由该决策树得到的结果的错误率为6/150=4%

Ctree在diabetes数据上的应用

##载入diabetes的数据

data2=read.table("F:

\\课件\\讨论班\\研一秋季学期\\我的讲稿\\pima.indians.diabetes3.txt",header=T)

##观察diabetes的数据

head(data2)

##构造分类树

pima_ctree=ctree(class~npregnant+glucose+diastolic.bp+skinfold.thickness+bmi+pedigree+age,data=data2)

##画出分类树的图

plot(pima_ctree)

plot(pima_ctree,type="simple")

##计算错判率

##由结果可以看出,由该决策树得到的结果的错误率为109/532=20.5%

##能否修改参数改变模型?

ctree_control(teststat=c("quad","max"),

testtype=c("Bonferroni","MonteCarlo",

"Univariate","Teststatistic"),

mincriterion=0.95,minsplit=20,minbucket=7,

stump=FALSE,nresample=9999,maxsurrogate=0,

mtry=0,savesplitstats=TRUE,maxdepth=0)

teststat

acharacterspecifyingthetypeoftheteststatistictobeapplied.

testtype

acharacterspecifyinghowtocomputethedistributionoftheteststatistic.

mincriterion

thevalueoftheteststatistic(for testtype=="Teststatistic"),or1-p-value(forothervaluesof testtype)thatmustbeexceededinordertoimplementasplit.

minsplit

theminimumsumofweightsinanodeinordertobeconsideredforsplitting.

minbucket

theminimumsumofweightsinaterminalnode.

stump

alogicaldeterminingwhetherastump(atreewiththreenodesonly)istobecomputed.

nresample

numberofMonte-Carloreplicationstousewhenthedistributionoftheteststatisticissimulated.

maxsurrogate

numberofsurrogatesplitstoevaluate.Notethecurrentlyonlysurrogatesplitsinorderedcovariablesareimplemented.

mtry

numberofinputvariablesrandomlysampledascandidatesateachnodeforrandomforestlikealgorithms.Thedefault mtry=0 meansthatnorandomselectiontakesplace.

savesplitstats

alogicaldeterminingiftheprocessofstandardizedtwo-samplestatisticsforsplitpointestimateissavedforeachprimarysplit.

maxdepth

maximumdepthofthetree.Thedefault maxdepth=0 meansthatnorestrictionsareappliedtotreesizes.

##

##尝试修改mincriterion=0.6(mincriterion=0.95的结果与原来一样,故0.95应该为默认值)

pima_ctree=ctree(class~npregnant+glucose+diastolic.bp+skinfold.thickness+bmi+pedigree+age,data=data2,control=ctree_control(mincriterion=0.6))

table(predict(pima_ctree),data2$class)

##计算错判率

##由结果可以看出,由该决策树得到的结果的错误率为97/532=18.2%

plot(pima_ctree)

##此时树变得更复杂了

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1