R语言(递归分割树[传统决策树])分类模型(二)

递归分割树可视化

需要执行“R语言(递归分割树)分类模型(一)”的步骤

#调用plot函数和text函数绘制分类树
plot(churn.rp,margin = 0.1)
text(churn.rp,all = TRUE,use.n = TRUE)       


分类树图
也可以改变一些参数调整输出结果

plot(churn.rp,margin = 0.1)
text(churn.rp,all = TRUE,use.n = TRUE)


调整之后的输出
plot( )函数可以实现简单的分类树可视化,也可以调用text函数在图中添加文字说明。
我们将margin赋值为0.1,这样能够在边界增加一个白色的边框,防止要显示的文本被图形边缘截断,use.n = TRUE,得到每个类别(no和yes)的实际观测个数。

评测递归分割树的预测能力

借助分类树,我们能够预测新观测值的类别类标签。在进行预测前,我们先通过在测试数据集上建立一个新的分类表来评测分类树的预测能力。

#调用predict函数生成测试数据集的分类表
predictions = predict(churn.rp,testset,type = "class")
#调用table建立测试数据集的分类表
table(testset$churn,predictions)
     predictions
      yes  no
  yes 100  41
  no   18 859
#调用caret包提供的confusionMatrix生成混淆矩阵
library(caret)
confusionMatrix(table(predictions,testset$churn))
Confusion Matrix and Statistics

          Reference
Prediction yes  no
       yes 100  18
       no   41 859

               Accuracy : 0.942           
                 95% CI : (0.9259, 0.9556)
    No Information Rate : 0.8615          
    P-Value [Acc > NIR] : < 2.2e-16       

                  Kappa : 0.7393          
 Mcnemar's Test P-Value : 0.004181        

            Sensitivity : 0.70922         
            Specificity : 0.97948         
         Pos Pred Value : 0.84746         
         Neg Pred Value : 0.95444         
             Prevalence : 0.13851         
         Detection Rate : 0.09823         
   Detection Prevalence : 0.11591         
      Balanced Accuracy : 0.84435         

       'Positive' Class : yes           

使用民一个predict构建了一个分类模型churn.rp,来预测测试数据集中样例可能的类标号。预测类别(类标号)可能被编码为no与yes,然后使用table函数在测试数据集上建立一个分类表,从分类表可以得知,859个样例被正确的测试为no,18个样例被错误预测为yes.100个样例被正确预测为yes,41个样例被错误预测为no。
预测准确率有0.942

递归分割树剪枝

#找到分类树模型的最小交叉检验误差
min(churn.rp$cptable[,"xerror"])
[1] 0.497076
#定位交叉检验最少的记录
which.min(churn.rp$cptable[,"xerror"])
8 
8 
#获取交叉检验误差最小记录成本复杂度参数参数值:
churn.cp = churn.rp$cptable[8,"CP"]
churn.cp
[1] 0.01
#设置参数cp值与交叉检验最小记录的cp值相同以进行剪枝,然后绘图
prune.tree = prune(churn.rp,cp = churn.cp)

plot(prune.tree,uniform = TRUE,branch = 0.5,margin = 0.05)
text(prune.tree,all = TRUE,use.n = TRUE)


剪枝后的分叉树

#接下来基于已剪枝的分类树生成分类表
predictions1 = predict(prune.tree,testset,type = "class")
> 
> table(testset$churn,predictions1)
     predictions1
      yes  no
  yes  95  46
  no   14 863
#最后基于上述分类列表生成混淆矩阵
confusionMatrix(table(testset$churn,predictions1))
Confusion Matrix and Statistics

     predictions1
      yes  no
  yes  95  46
  no   14 863

               Accuracy : 0.9411          
                 95% CI : (0.9248, 0.9547)
    No Information Rate : 0.8929          
    P-Value [Acc > NIR] : 5.609e-08       

                  Kappa : 0.727           
 Mcnemar's Test P-Value : 6.279e-05       

            Sensitivity : 0.87156         
            Specificity : 0.94939         
         Pos Pred Value : 0.67376         
         Neg Pred Value : 0.98404         
             Prevalence : 0.10707         
         Detection Rate : 0.09332         
   Detection Prevalence : 0.13851         
      Balanced Accuracy : 0.91048         

       'Positive' Class : yes        

很明显经过剪枝后的分支要少于原始分支类型的分支树个数,最后正确率略低于原始个数,这说明去掉了部分分裂条件,剪枝后的分类树正确率未必优于原始分树,用户应该检查剪枝对分类树灵敏度和完整性的影响)不过剪枝分类树的优势在于它对分类模型的限定更模糊一些,这样可以避免过度适应。

你可能感兴趣的:(R语言-分类1(树,延迟,概率))