我有一个包含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?任何见解将不胜感激。
答案 0 :(得分:1)
你可以做的一件事就是把它写在情节上:
# This is necessary to avoid the text being cut out
par(xpd=NA)
plot(my.tree)
text(my.tree, use.n=T)
如果设置为TRUE
,use.n
将写入属于每个类中每个节点的元素数。有关更多帮助,请参阅?text.rpart
。
例如:
iris.tree <- rpart(Species~., iris)
par(xpd=NA)
plot(iris.tree)
text(iris.tree, use.n=T)
输出
所以,基本上你有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