R部分:如何知道每个终端节点的正确分类百分比

时间:2014-07-14 07:37:31

标签: r classification

我有一个包含277个观察结果的数据集。我有二元响应变量,即0表示无疾病,1表示疾病。我知道180个观察结果没有疾病,97个患有疾病。我构建了一个模型并构建了一个分类树,以了解我的模型如何正确地预测谁有疾病,谁没有。我使用rpart函数构建了一个树,并对其进行了总结。

    mytree=rpart(y~x1+x2+x3+x4, method="class")
    summary(tree)

我的问题是,我如何知道每个提示中哪些数据被正确分类?假设我的输出如下:

    Node number 1: 277 observations,    complexity param=0.134
      predicted class=0  expected loss=0.35  P(node) =1
      class counts:   180    97
      probabilities: 0.650 0.350 
      left son=2 (156 obs) right son=3 (121 obs)
      Primary splits:
      x1     < 1.73 to the left,  improve=17.80, (0 missing)
      x3     < 1.44 to the left,  improve=17.80, (0 missing)
      x2    < 1.35 to the left,  improve=16.40, (0 missing)
      x4 < 3.5  to the left,  improve= 1.36, (0 missing)
   Surrogate splits:
      x2    < 1.35 to the left,  agree=0.751, adj=0.430, (0 split)
      x3     < 1.44 to the left,  agree=0.653, adj=0.207, (0 split)
      x4 < 3.5  to the right, agree=0.578, adj=0.033, (0 split)

   Node number 2: 156 observations,    complexity param=0.0258
      predicted class=0  expected loss=0.192  P(node) =0.563
      class counts:   126    30
      probabilities: 0.808 0.192 
      left son=4 (133 obs) right son=5 (23 obs)
   Primary splits:
      x3     < 1.6  to the left,  improve=4.410, (0 missing)
      x2    < 1.83 to the left,  improve=3.990, (0 missing)
      x1     < 1.27 to the left,  improve=1.410, (0 missing)
      x4 < 4.5  to the left,  improve=0.999, (0 missing)
  Node number 4: 133 observations
     predicted class=0  expected loss=0.143  P(node) =0.48
     class counts:   114    19
     probabilities: 0.857 0.143 

请注意,节点编号4分为两个提示。其中一个提示有114个观察结果(这是一个终端提示)。它将133个观测值中的114个归类为0.现在,我如何判断114个中有多少被正确归类为0?任何见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

你可以做的一件事就是把它写在情节上:

# This is necessary to avoid the text being cut out
par(xpd=NA)
plot(my.tree)
text(my.tree, use.n=T)

如果设置为TRUEuse.n将写入属于每个类中每个节点的元素数。有关更多帮助,请参阅?text.rpart

例如:

iris.tree <- rpart(Species~., iris)
par(xpd=NA)
plot(iris.tree)
text(iris.tree, use.n=T) 

输出

iris data - rpart

所以,基本上你有5个virginica错误分类为versicolor,1个versicolor错误分类为virginica。

您也可以将其输出为混淆矩阵,但丢失了树结构:

> table(predict(iris.tree, t="class"), iris$Species)

             setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         49         5
  virginica       0          1        45 

如果你想以编程方式进行,你可以使用它(以下来自iris示例):

leaves <- which(iris.tree$frame$var == "<leaf>")
iris.tree$frame$yval2[leaves,]

                                         nodeprob
[1,] 1 50  0  0 1 0.00000000 0.00000000 0.3333333
[2,] 2  0 49  5 0 0.90740741 0.09259259 0.3600000
[3,] 3  0  1 45 0 0.02173913 0.97826087 0.3066667