构建、绘制和评估——分类树

xiaoxiao2021-02-28  33

#载入rpart、rpart.plot、caret包library(rpart)library(rpart.plot)library(caret) #载入数据,数据链接:https://github.com/Kuntal-G/Machine-Learning/blob/master/R-machine-learning/data/banknote-authentication.csv #或者直接输入dataset的名字:banknote_authentication查找 bn<-read.csv("C:\\Users\\Administrator\\desktop\\banknote.csv") #创建数据分块。我们需要两块数据—训练数据和验证数据 set.seed(1000) train.idx<-createDataPartition(bn$class,p=0.7,list=FALSE) #创建树 #rpart()指定了自变量和应变量的公式、使用的数据集、method="class"指明建立的分类树(与回归树对应) #control=rpart.control()设置了树的节点最少需要包含20个样本才能进行分割,同时复杂度参数设置为0.01—这两个值就是默认值 mod<-rpart(class~.,data=bn[train.idx,],method="class",control=rpart.control(minsplit=20,cp=0.01)) #查看文本输出(如果没有设置随机种子,展示结果是不一样的) mod #mod的输出 n= 961 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 961 423 0 (0.55983351 0.44016649) 2) variance>=0.321235 511 52 0 (0.89823875 0.10176125) 4) curtosis>=-4.3856 482 29 0 (0.93983402 0.06016598) 8) variance>=0.92009 413 10 0 (0.97578692 0.02421308) * 9) variance< 0.92009 69 19 0 (0.72463768 0.27536232) 18) entropy< -0.167685 52 6 0 (0.88461538 0.11538462) * 19) entropy>=-0.167685 17 4 1 (0.23529412 0.76470588) * 5) curtosis< -4.3856 29 6 1 (0.20689655 0.79310345) 10) variance>=2.3098 7 1 0 (0.85714286 0.14285714) * 11) variance< 2.3098 22 0 1 (0.00000000 1.00000000) * 3) variance< 0.321235 450 79 1 (0.17555556 0.82444444) 6) skew>=6.83375 76 18 0 (0.76315789 0.23684211) 12) variance>=-3.4449 57 0 0 (1.00000000 0.00000000) * 13) variance< -3.4449 19 1 1 (0.05263158 0.94736842) * 7) skew< 6.83375 374 21 1 (0.05614973 0.94385027) 14) curtosis>=6.21865 106 16 1 (0.15094340 0.84905660) 28) skew>=-3.16705 16 0 0 (1.00000000 0.00000000) * 29) skew< -3.16705 90 0 1 (0.00000000 1.00000000) * 15) curtosis< 6.21865 268 5 1 (0.01865672 0.98134328) * #创建树图 #type=2得到类型为2的树图,extra=4显示1个节点中分属于不同类别的样本概率(对同一个 #节点而言的条件概率,因此和为1);加上100(所以extra=104)可以显示按中的样本量相当于整体总量百分比。 #nn=TRUE显示节点编号;根节点为1且第n个节点的子节点编号为2n和2n+1 #fallen.leaves=TRUE将所有叶子节点展示在图像的底部 #faclen将节点中的分类名缩减至不超过最大长苏4. #varlen缩减变量名 #shadow.col指定每个节点的阴影颜色 prp(mod,type=2,extra=104,nn=TRUE,fallen.leaves=TRUE,faclen=4,varlen=8,shadow.col="gray") #给树剪枝。注意“CP”为大写,写成小写会存在下标出界的情况。 #通过为树剪枝来降低模型过度拟合。在这里先查看从交叉验证中得到的复杂性表格,然后用这张表来决定截断 复杂性水平,使得最大的xerror(交叉验证误差)不超过最小交叉误差的一倍标准差范围 mod$cptable CP nsplit rel error xerror xstd 1 0.69030733 0 1.00000000 1.0000000 0.03637971 2 0.09456265 1 0.30969267 0.3262411 0.02570025 3 0.04018913 2 0.21513002 0.2387707 0.02247542 4 0.01891253 4 0.13475177 0.1607565 0.01879222 5 0.01182033 6 0.09692671 0.1347518 0.01731090 6 0.01063830 7 0.08510638 0.1323877 0.01716786 7 0.01000000 9 0.06382979 0.1276596 0.01687712 mod.pruned=prune(mod,mod$cptable[5,"CP"]) #查看剪枝后的树 prp(mod.pruned,type=2,extra=104,nn=TRUE,fallen.leaves=TRUE,faclen=4,varlen=8,shadow.col="gray") #用剪枝后的树模型对验证分块做预测 pred.pruned<-predict(mod,bn[-train.idx,],type="class") #创建误差/分类—混淆的矩阵 #首先建立基于真实值和预测值的双向表格:table #将原始值成纤维百分比或比例,这在前面的步骤中已经实现:prop.table #四舍五入:round() #可视化:barplot()、mosaicplot() table(bn[-train.idx,]$class,pred.pruned,dnn=c("Actual","Predicted")) mod<-rpart(class~.,data=bn[train.idx,],method="class",control=rpart.control(minsplit=20,cp=0.01)) prp(mod,type=2,extra=104,nn=TRUE,fallen.leaves=TRUE,faclen=4,varlen=8,shadow.col="gray")

分类树变体

#计算原始概率:将分类参数替换为type=“prob”来得到概率值 pred.pruned<-predict(mod,bn[-train.idx,],type="prob") #创建ROC图 #需要ROC包 #首先创建预测对象和预测表现对象pred、pref #pred建立了分类标签。可以将分类标签标为0和1,0为"失败组",1为"成功组" #perf指明想要的“真阳性比”和“假阳性比” pred<-prediction(pred.pruned[,2],bn[-train.idx,"class"]) perf<-performance(pred,"tpr","fpr") #画图 #可以用lines()绘制ROC下限的对角线 plot(perf)

分类混淆矩阵:在机器学习领域,混淆矩阵(confusion matrix),又称为可能性表格或是错误矩阵。它是一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)。其每一列代表预测值,每一行代表的是实际的类别。这个名字来源于它可以非常容易的表明多个类别是否有混淆(也就是一个class被预测成另一个class)。具体介绍参见:

https://blog.csdn.net/songchaomail/article/details/43834741/

https://blog.csdn.net/joeland209/article/details/71078935

转载请注明原文地址: https://www.6miu.com/read-2630398.html

最新回复(0)