使用 rpart 的 predict 方法计算树的预测精度

Posted

技术标签:

【中文标题】使用 rpart 的 predict 方法计算树的预测精度【英文标题】:Calculating prediction accuracy of a tree using rpart's predict method 【发布时间】:2017-02-26 02:34:17 【问题描述】:

我已经使用 rpart 为数据集构建了一个决策树。

然后我将数据分为两部分 - 训练数据集和测试数据集。使用训练数据为数据集构建了一棵树。我想根据创建的模型计算预测的准确性。

我的代码如下所示:

library(rpart)
#reading the data
data = read.table("source")
names(data) <- c("a", "b", "c", "d", "class")

#generating test and train data - Data selected randomly with a 80/20 split
trainIndex  <- sample(1:nrow(x), 0.8 * nrow(x))
train <- data[trainIndex,]
test <- data[-trainIndex,]

#tree construction based on information gain
tree = rpart(class ~ a + b + c + d, data = train, method = 'class', parms = list(split = "information"))

我现在想通过将结果与训练和测试数据的实际值进行比较来计算模型生成的预测的准确性,但是这样做时我遇到了错误。

我的代码如下所示:

t_pred = predict(tree,test,type="class")
t = test['class']
accuracy = sum(t_pred == t)/length(t)
print(accuracy)

我收到一条错误消息,指出 -

t_pred == t 中的错误:未实现这些类型的比较 另外:警告消息:不兼容的方法(“Ops.factor”, "Ops.data.frame") 为 "=="

在检查 t_pred 的类型时,我发现它是整数类型,但是文档

(https://stat.ethz.ch/R-manual/R-devel/library/rpart/html/predict.rpart.html)

声明predict() 方法必须返回一个向量。

我无法理解为什么变量的类型是整数而不是列表。我在哪里犯了错误,我该如何解决?

【问题讨论】:

【参考方案1】:

先尝试计算混淆矩阵:

confMat <- table(test$class,t_pred)

现在您可以通过将矩阵的对角线总和(即正确预测)除以矩阵的总和来计算准确度:

accuracy <- sum(diag(confMat))/sum(confMat)

【讨论】:

感谢您的成功。但是我仍然不明白预测方法。它究竟返回什么,为什么它是一个整数?当我打印 t_pred 时,它看起来像一个矩阵。 如果没有可重现的例子,很难说发生了什么。 我在上面的例子中使用了 Iris 数据集,但没关系。我现在想通了。再次感谢您的回复。【参考方案2】:

我的回复与@mtoto 的回复非常相似,但更简单一点......我希望它也有帮助。

mean(test$class == t_pred)

【讨论】:

以上是关于使用 rpart 的 predict 方法计算树的预测精度的主要内容,如果未能解决你的问题,请参考以下文章

R中的ROC曲线使用rpart包?

rpart 中 CP 表给出的树大小

用于树的 train() 函数插入符号中的缺失值错误

rpart中的Minbucket和权重

rpart 节点分配

将决策树的输出保存到文本文件中