当前位置:文档之家› 新决策树例子

新决策树例子

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="g ini"))# 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="Classification Tree\nIris Species by Petal and Sepal Length")#plot的对象是由rpart得到的决策树对象,可以把这课决策树画出来,其中(1) uniform可取T,F两个值,T表示图形在空间上均匀分配(2) branch刻画分支的形状,取值在0和1之间,branch=0是倒v型,branch=1是直角型,而当branch属于(0,1)时是梯形Classification TreeIris Species by Petal and Sepal Lengthbranch=0Classification TreeIris Species by Petal and Sepal Lengthbranch=1|Classification T reeIris Species by Petal and Sepal Lengthbranch=0.5|(3)margin刻画图的大小,margin越大,决策树越小,上述三幅图的margin=0.1,而当margin=1时,决策树变小了Classification T reeIris Species by Petal and Sepal Length(4)main是图的标题,其中“\n”是换行的意思text(iris.rp1, use.n=T, fancy=T, col="blue")Classification TreeIris Species by Petal and Sepal Lengthtext(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="决策树")Classification TreeIris Species by Petal and Sepal LengthPetal.Length< 2.45Petal.Width< 1.75setosa 50/0/0versicolor 0/49/5virginica 0/1/45决策树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="i nformation"))plot(iris.rp2, uniform=T, branch=0, margin=0.1,main="Classification Tree\nIris Species by Petal and Sepal Length")text(iris.rp2, use.n=T, fancy=T, col="blue")Classification TreeIris Species by Petal and Sepal Length由上面两幅图可以看出,对于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,皮下脂肪厚度skinfold thickness,遗传影响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.33270677 0.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: complexity parameter 复杂性参数,用来修剪树的 当决策树复杂度超过一定程度后,随着复杂度的提高,测试集的分类精确度反而会降低。

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

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

相关主题