新决策树例子.docx
- 文档编号:9554282
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:23
- 大小:356.12KB
新决策树例子.docx
《新决策树例子.docx》由会员分享,可在线阅读,更多相关《新决策树例子.docx(23页珍藏版)》请在冰豆网上搜索。
新决策树例子
rpart包的rpart函数
Iris数据集
library(rpart)#
加载rpart包
head(iris)#
看看
iris数据集里有哪些变量
>
iitiiid(丄ris
)
gth
Sepal.WidthPeta.1.Length
Petal.Width
L
5.1
3.5
1.4
0-2
setosa
2
J.0
1.4
0.2
S^toSd.
3
乩了
3・2
0.2
setasa
4
4・6
3.1
1.5
0.2
setosa
5
5.0
3.6
1・4
0.2
osa
6
5*4
3.9
1*7
setosa
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\nlrisSpeciesbyPetalandSepalLength")
#plot的对象是由rpart得到的决策树对象,可以把这课决策树画出来,其中
(1)uniform可取T,F两个值,T表示图形在空间上均匀分配
(2)branch刻画分支的形状,取值在0和1之间,branch=0是倒v型,branch=1是直角型,而当branch属于(0,1)时是梯形
ClassificationTree
IrisSpeciesbyPetalandSepalLengthbranch=0
ClassificationTree
IrisSpeciesbyPetalandSepalLength
branch=1
ClassificationTree
IrisSpeciesbyPetalandSepalLength
branch=0.5
(3)margin刻画图的大小,margin越大,决策树越小,上述三幅图的
margin=0.1,而当margin=1时,决策树变小了
ClassificationTree
IrisSpeciesbyPetalandSepalLength
(4)main是图的标题,其中“\n”是换行的意思
text(iris.rp1,use.n=T,fancy=T,col="blue")
ClassificationTree
IrisSpeciesbyPetalandSepalLength
ClassificationTree
IrisSpeciesbyPetalandSepalLength
(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=O,branch.type=O,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近似,但对叶子节点和根节点都画圆圈。
决策树
type=O
virginic
0145
'versicol
、.O495
Petal.Wi<1.8
setosa
yesI
Petal.Le<2.4
决策树
type=2
setosa
505050
决策树
type=3
决策树
type=4
(3)extra是表示在节点处显示的额外信息的种类。
当extra=0(缺省值)时,
无额外信息。
当extra=1,在节点处会显示落在该节点的观测个数和对应的分类(如上图)。
当extra=2,在节点处会显示(在该点分类正确的个数/落在该节点的观测个数)。
决策树
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\nlrisSpeciesbyPetalandSepalLength")
text(iris.rp2,use.n=T,fancy=T,col="blue")
ClassificationTree
IrisSpeciesbyPetalandSepalLength
由上面两幅图可以看出,对于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)
>table(iris
・test[x5],iris・rp3}iris■rp3
setosaversicolor
virginica
setosa
13
0
0
versicolor
0
18
1
virginioa
0
1
10
准确率=1-2/43=95.35%,与原来的96%准确性几乎一样,所以这颗决策树有加好的泛化能力。
我们再考虑另一个复杂一点的例子
pima=read.table("D:
/Grace/pima.indians.diabetes3.txt",header=T)
>heaii{pliLa)
flucoss九彗mliG即応ict;帶弓bu貨口卩爺前弓cl恥対iji匚叩.电宛
■
€
:
鶴
35
瞌E
0,527
5:
1
diateuc
z
1
So
29
2E.£
0.351
31
0
noical
3
1
83
昕
23
28.1
0*167
21
Q
noiral
4
0
13?
40
35
灶1
2,239
77
1
diabetic
S
75
50
32
31,0
2£
1
diabetic
2
ir
*5
3C.5
D+159
=-
ww
1
diabetic
数据说明:
通过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来衡量纯度,
>pima-ipn=532
node)tsplrifloss,yval,(yprob)*denotesterminalnode
1}root532177narmal(0.33270A770.6A729323)
71diabetic(0.624338620.37S6613B>diabetic(0.0-5210£2€0.15769474}*
5空uocnal(0.477B76110・522123S9}diabetic(0.59^93671D.^0506329}
2diabetic(0.900000000.IOOOQOOC}*
29normal(0,49152542O・50647458>
2}glucos已》=丄空~.5LB9
4)glucoae^lS^.576
5}glucase<157»5113
10)bml>=30t27332
20)age>=^2.520
21)*ge<42.559
42)
13diaheuictO-5909090S0.43^09091)
2diabetic(0.64615335O.153£4£15)*
ISnormal(O.^S38?
O9?
0..51fil2903)
3diabetic(0.^00000000,30000000)*
Snormal(Q.36O9523S□・6190^762^
3diatecic(Q.62SOOQQQ0.37500000)*
3normal(0.230769230・'7692307-?
}*
3norttal(0.200000000.30000000)*
(0.205562350.79411765}*
pedigree>*0.2e544
S4)135.513
3S)y丄口aose>=135.53.1
170)1.5510
171)bmi<弓1・5521
3貂)i)ini<3弓托5B343Jbmi>-34.6513
43)pedigreed0.2S515
11)binr<3G.2347ncrnial
3)glucose<127.53^3591narir^l(0.172011660.£2755034)
6}age>=20¥512943normal(0.333333330,66666667}
7)agre<26,521416normal(0,074766360.S25233€4)*
结果解释:
以根节点为例,观测总数是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="决策树
")
决策树
diabeticnormal
53310
图的解释:
1.每个节点框中的数字是:
(落在该节点有糖尿病的个数/正常的个数)
2.每个节点框内的diabetic、normal表示该节点对应的分类属性
printcp(pima.rp)#列出cp值
>printcp[pima.rp)cias^iticationtre^j
rp^rt{fo工=pimaEj91-,Fdata=pima[f1:
71,partas=list(split=*gini*),cp=0*004)
Variablesactuallyusedintreecanstmction;
[1]agebmiglucosenprccpiantpedigree
Etootnodeerror!
177/532-0.33271
n=532
CPnsplitreLetror
terror
xstd
1
Q.2^5537
:
:
*IDOO'J
l.DOOQO
2
0.05«4»7
1
0.73446
0.790%
0.0573C2
3
0.025424
3
0.62147
0.72316
0.055701
0.020716
5
0,57062
0.74011
0.Q5EH1
L
0.014124
5
0,75141
0.05E427
石
0.011299
n
0,45763
0.7457C
0.056284
7
0.004000
14
0.42373
0,75141
(J-D5&427
cp:
complexityparameter复杂性参数,用来修剪树的
当决策树复杂度超过一定程度后,随着复杂度的提高,测试集的分类精确度反而会降低。
因此,建立的决策树不宜太复杂,需进行剪枝。
该剪枝算法依赖于复杂性参数cp,cp随树复杂度的增加而减小,当增加一个节点引起的分类精确度变化量小于树复杂度变化的cp倍时,则须剪去该节点。
故建立一棵既能精确分类,又不过度适合的决策树的关键是求解一个合适的cp值。
一般选择错判率最小值
对应的cp值来修树
plotcp(pima.rp)
•?
EgvnlRgx
12
sizeoftree
4610
1215
7
0
Inf0.120.038
0.023
0.017
0.013
0.0067
cp
pima.prune=prune(pima.rp,cp=pima.rp$cptable[which.min(pima.rp$cptable[,"xerro门),"CP"])
修剪决策树
「yesglucose>=128
normal
177355
glucose>=158
diabetic
11871
''normal
28侈
diabetic、6412
bmi>=30
normal5459
diabetic
4732
normal
■U7
xerror:
交叉验证(crossvalidation)错判率的估计
xstd:
交叉验证错判率的标准差
建立树模型要权衡两方面问题,一个是要拟合得使分组后的变异较小,另一个是要防止过度拟合,而使模型的误差过大,前者的参数是CR后者的参数是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")
———
n=4fl
v=|O0J2Z
##比较用分类树预测的结果和实际结果之间的区别
table(predict(iris_ctree),iris$Species)
serosaversicolorvnrgnnicasetosa5000
versi匸0495virgini匚a0145
##由结果可以看出,由该决策树得到的结果的错误率为6/150=4%
Ctree在diabetes数据上的应用
##载入diabetes的数据
课件讨论班研一秋季学期我的讲稿
Wpima.indians.diabetes3.txt",header=T)##观察diabetes的数据
head(data2)
npregnant
glucose
di^stol1c.bpskinfold.
thickness
bni
pedigr配
1
6
14S
72
35
33,6
0.627
2
1
SS
66
29
2b.6
0.35L
3
1
39
師
21
28.1
□.167
4
0
137
40
35
4J.l
Z.Z8&
5
3
78
50
32
31.0
0.Z4S
6
2
1S7
70
45
30.5
0.L5S
ageclassdigi5C
class
1d~iabttGt
2riormfl'l
L-1363
323Z5
3Hormal
4diabet-ic
5diabetic
6diabetic
##构造分类树
pima_ctree=ctree(class~npregnant+glucose+diastolic.bp+skinfold.thickness+bmi+pedigree+age,data=data2)##画出分类树的图plot(pima_ctree)
r^de5fn=7e;a
0=0叶./
£畫一ETS
IBlum口匚
ilOt
NjCriB7(11=751.
兰;*
D«
-30
f
■苣Q匸
hkule13in-5@i,F抽泊[山血
■fG
s04-
IHf吕
plot(pima_ctree,type="simple")
##计算错判率
diabeticnormaldiabetic10941
normal68314
109/532=20.5%
##由结果可以看出,由该决策树得到的结果的错误率为##能否修改参数改变模型?
ctree_control(teststat=c("quad","max"),testtype=c("Bonferroni","MonteCarlo",
mincriterion=
"Univariate","Teststatistic"),=0.95,minsplit=20,minbucket=7,
maxsurrogatemtry
savesplitstatsmaxdepth
stump=FALSE,nresample=9999,maxsurrogate=0,mtry=0,savesplitstats=TRUE,maxdepth=0)
teststat
acharacterspecifyingthetypeoftheteststatistictobeapplied.
testtypemincriterion
acharacterspecifyinghowtocomputethedistributionoftheteststatistic.
thevalueoftheteststatistic(fortesttype=="Teststatistic"),or1
-p-value(forothervaluesoftesttype)thatmustbeexceededinorderto
implementasplit.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 决策树 例子