0 i5 a& {& G! u/ C: T0 l* P: b0 M
Gini index是节点纯度(purity)的检测值,其值较小,表示节点包含的样本更多属于单个分类。 & M% y4 x9 b+ t) ]; c 8 q$ Q6 i' h& n ; f) u2 a( Y; n 7 ]: F. \, F6 v , q8 e i( N. C$ j- j* u2 Q" `6 v+ y ]9 m+ f; I$ ~3.1 tree包用于构建分类决策树(Classification Trees) 7 z, `+ Z" L9 k . N7 G" R' J" @3 L' |% {利用微生物组数据,以grazing为因变量,其它变量为自变量,构建决策树。. m) U" r: w' `, O, E
, @% O) D* a/ X5 [
# 3.1.1 分类决策树; d" U. K6 V# H8 j% P; x. n
tre = tree::tree(grazing~.,train.spe[,-1],# 用于构建决策树的变量可以是分类变量或者定量变量。 0 M1 V1 s' O. p) u na.action = na.omit, / X: l. C5 @; g4 l split = "gini",# "deviance", "gini" & j G2 g+ u+ H# V& R1 d0 p x=TRUE,# l& r) s6 Q0 a. d0 z
y=TRUE, 3 ~4 H5 }. A* ^0 P" L$ m2 ~ P #wts = TRUE # 设置了样本weights参数,则返回权重值。: F/ c* O) a; T c
) ( R% T5 T, x5 X g
tre8 e8 Z4 H' {5 N; o9 h
## output* I' Q T6 H' m/ Z$ r4 {
write.table(tre$frame,"class_tre_res.txt",sep="\t",quote = FALSE,row.names = FALSE) 2 I2 X. \! H. s9 f# }9 e$ e' X/ u6 I) ^
# 3.1.2 描述统计 1 V5 a6 x; T$ ?2 N. n# Ntre.res = summary(tre) # 输出用于中间节点拆分的变量,终端节点数目和error rate。 5 E: T4 R' T% U1 Ktre.res8 X3 a, }* {, o6 ^( P9 z+ S
tre.res$call$ {2 F4 m* H/ M G6 V1 U1 e( D
tre.res$type3 ?) w2 Z1 D3 [8 C9 o4 \# O
tre.res$used # 用于中间节点拆分的变量3 Y* j0 R8 z& k, Z
tre.res$size # 节点数目% r9 z& D% I0 `
df = tre.res$df # 自由度=样本数-终端节点数目 & `# b' a9 K+ ~; ], Xdf% l W3 y) Q0 b4 _3 H
dev = tre.res$dev # 所有节点包含的分类偏差 8 r5 m( r, L9 p" q d; ]dev# w. i/ A# y/ [
tre.res$misclass # 错误分类样本与总样本数目7 W2 u ]0 s# | @6 J) l' s
& Z! x0 G, G! t( F7 m2 \; i
' j/ O" m; [. S; l. ]) y: g7 Y. {* U( e9 }. I" {2 J
( T# j4 B! [/ i$ F8 B图12|分类树输出结果,class_tre_res.txt。var:用于拆分节点的变量及终端节点(<leaf>);n:每个节点的样本数量;dev:每个节点的偏差;yval:拟合结果,回归树为节点包含样本的因变量均值,分类树为该节点样本最多属于的分类水平;split: 节点拆分,2列分别是属于左侧或右侧的标签。yprob:回归树,此为NULL;分类树则为因变量各水平的拟合比率(即每个节点中属于各分类水平的样本的比例),此数据有5个处理,所以有5列。; P& I; N' m4 z# W
- s7 S# J9 d5 p, y! `. p + C2 u: D" u" d8 y. u8 Z$ t3 t# L9 O* t3 R! p- a4 o9 u
图13|分类树输出结果描述统计,tre.res。包含用于中间节点拆分的变量,终端节点数目和分类错误率等信息。) T/ i% Z! M* \0 O2 d. E/ q5 \" @% H
* Y5 V ~7 G E* D7 [) G
# 3.1.3 绘图查看决策树# m: i4 c/ v# q t$ `% f
plot(tre)0 S& u' s4 }8 ^4 N+ d2 h
text(tre,pretty = 0)4 \. l/ f( r- C9 v
* M% K" i8 z) o( w9 i9 y% I) V0 l& g7 t& m# 3.1.4 预测测试数据集。 1 l1 u8 b c, H" d/ Wlibrary(caret)$ g' I I, K8 q/ c1 A: [, K b
tre.pred0 = predict(tre,test.spe[,-c(1,2)],type = "class") . ?3 B: N+ b8 @5 V4 \- p% h## 生成混淆矩阵# T5 a, I* P$ m
caret::confusionMatrix(tre.pred0,test.spe[,2]) # 分类准确率为40%。 d! O+ s8 ?+ \+ P4 p) U3 z
; f1 z/ A% Q( y, |& U* x* O9 C5 p" l: u( V* m
A5 f. R, o+ |1 ^% P* `+ O, j" ] " W) d5 N/ M, `6 B1 y/ y : Z+ G0 E- t$ X8 ?& P& E" s初次构建的决策树分类错误率较高,40%。为了得到更好的分类结果,通过交叉验证进行剪枝调整决策树复杂度。) ~% L4 V/ `! G/ i7 }
/ U5 l7 b9 E& \) U8 I
3.2 剪枝优化模型9 }. G% m9 V0 D. l9 }
' {! m, I0 x+ a$ @/ |6 S如果后续分析的目的是提高分类预测的准确性,则常使用分类错误率作为剪枝(pruning)的选择标准。& y! ?+ V& X: C4 l7 i2 L
0 c5 l; E8 I& {: Q. ?$ _# C# 3.2.1 cross-validation 优化模型 9 i# ]7 j; I4 ^7 x8 d' B! zset.seed(12345) / j3 |" H: C3 y/ w" u, N' qcv.tre = tree::cv.tree(tre,7 `; l8 Q3 V- D: b1 H
FUN = prune.misclass, # prune.tree,prune.misclass可选。6 _: Q$ t r) h0 Y6 ^: i; u: h+ H7 {- s
K=10 # K folds,可根据样本数目调整,50能被10整除。& m9 l5 y. |0 v% T( Z! C8 i9 k# s
) # K值设置不同,结果会有很大差异,可以多尝试几个K值。 % d3 C! \( o5 x% ~- G$ `names(cv.tre) # 输出结果6 O( M2 d. X" J( a0 ^
cv.tre$size # 每个树的终端节点数目, U0 `$ U: t! ~2 i( g
cv.tre$dev # cross-validation error rate- S/ Q# \, {" l( ?" V1 K% E5 B7 d7 E
cv.tre$k # cost-complexity 参数值 8 D7 C6 T* b W+ d/ t, n7 H4 E$ R$ t( g# n$ g
## 绘图选择最佳终端节点数 l0 O" B- Y W: a' C" Tpar(mfrow =c(1,2)) : f, d$ h$ a7 k8 U4 e# W/ xplot(cv.tre$size,cv.tre$dev,type="b")3 Q* E. a& \; i4 a
plot(cv.tre$k,cv.tre$dev,type = "b") # 检测具有最低交叉错误率的终端节点的数量。 , H, X. ^8 d# R7 [, d # l( o4 [) _( I. q 5 B9 m+ S/ E3 l+ V1 V0 [. b3 l' v x8 i" G7 B
/ v. o8 ~2 D* v4 y8 I$ a3 D图14|交叉验证结果,reg.cv。size:每个树的终端节点数目;dev:cross-validation error rate;k:cost-complexity 参数值。# a) f b4 j+ h' c- M
) T; {. [) z k. d$ ? . k" a; C2 ~$ r( r# r+ K, R2 X. c' W5 N6 g8 c3 O. o
图15|交叉验证结果绘图。结果显示在终端节点数为3的时候误差率最低。当最低错误率,具有几个不同的终端节点数时,可以秉承简单模型的原则,选择最小的终端节点。也可以根据绘图结果,选择合适自己数据的终端节点数。当终端节点为1才有最低误差时,就选次一级的终端节点数。# j6 W. A: g- `1 N) g