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

 
  
#载入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







你可能感兴趣的:(R语言,#,数据分析)