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时,决策树变小了ClassificationTreeIrisSpeciesbyPetalandSepalLengthbranch=0ClassificationTreeIrisSpeciesbyPetalandSepalLengthbranch=1|ClassificationTreeIrisSpeciesbyPetalandSepalLengthbranch=0.5|(4)main是图的标题,其中“\n”是换行的意思text(iris.rp1,use.n=T,fancy=T,col=blue)text(iris.rp1,use.n=T,fancy=F,col=blue)ClassificationTreeIrisSpeciesbyPetalandSepalLengthClassificationTreeIrisSpeciesbyPetalandSepalLengthPetal.Length2.45Petal.Width1.75Petal.Length=2.45Petal.Width=1.75setosa50/0/0versicolor0/49/5virginica0/1/45(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=决策树)ClassificationTreeIrisSpeciesbyPetalandSepalLengthPetal.Length2.45Petal.Width1.75setosa50/0/0versicolor0/49/5virginica0/1/45决策树yesnoPetal.Le2.4Petal.Wi1.8setosa505050setosa5000versicol05050versicol0495virginic0145yesnorpart.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近似,但对叶子节点和根节点都画圆圈。决策树yesnoPetal.Le2.4Petal.Wi1.8setosa505050setosa5000versicol05050versicol0495virginic0145yesno决策树type=0yesnoPetal.Le2.4Petal.Wi1.8setosa5000versicol0495virginic0145yesno决策树type=2yesnoPetal.Le2.4Petal.Wi1.8setosa505050setosa5000versicol05050versicol0495virginic0145yesno(3)extra是表示在节点处显示的额外信息的种类。当extra=0(缺省值)时,无额外信息。当extra=1,在节点处会显示落在该节点的观测个数和对应的分类(如上图)。当extra=2,在节点处会显示(在该点分类正确的个数/落在该节点的观测个数)。决策树type=3Petal.Le2.4Petal.Wi1.8=2.4=1.8setosa5000versicol0495virginic0145决策树type=4Petal.Le2.4Petal.Wi1.8=2.4=1.8setosa505050setosa5000versicol05050versicol0495virginic0145(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)决策树extra=2yesnoPetal.Le2.4Petal.Wi1.8setosa50/150setosa50/50versicol50/100versicol49/54virginic45/46yesno由上面两幅图可以看出,对于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)ClassificationTreeIrisSpeciesbyPetalandSepalLengthPetal.Length2.45Petal.Width1.75Petal.Length=2.45Petal.Width=1.75setosa50/0/0versicolor0/49/5virginica0/1/45数据说明:通过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值决策树yesnoglucose=128glucose=158bmi=30age=42pedigree=0.28glucose136bmi=42bmi35age=28pedigree=0.62bmi=26glucose=96glucose=110npregnan1.5normal177355diabetic11871diabetic6412normal5459diabetic4732diabetic182normal2930diabetic2618diabetic112normal1516diabetic73normal813diabetic53normal310normal312normal727normal59284normal4386diabetic2319diabetic2312diabetic205normal37normal07normal2067normal13