新决策树例子文档格式.docx
- 文档编号:17687332
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:18
- 大小:618.39KB
新决策树例子文档格式.docx
《新决策树例子文档格式.docx》由会员分享,可在线阅读,更多相关《新决策树例子文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
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="
(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="
split.col="
red"
main="
决策树"
rpart.plot(iris.rp1,branch=0,branch.type=0,type=1,extra=1,shadow.col="
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="
分别是决策树中节点框的阴影颜色、填充颜色、边框颜色、和分类属性的颜色
用信息增益度量纯度
iris.rp2=rpart(Species~.,data=iris,method="
information"
))
plot(iris.rp2,uniform=T,branch=0,margin=0.1,main="
text(iris.rp2,use.n=T,fancy=T,col="
由上面两幅图可以看出,对于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="
)
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="
数据的第八列和第九列其实是一样的,有糖尿病(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="
图的解释:
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"
##观察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="
##计算错判率
##由结果可以看出,由该决策树得到的结果的错误率为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=="
),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%
##此时树变得更复杂了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 决策树 例子