计算 rpart 包结果的精度、召回率、F1 值

Posted

技术标签:

【中文标题】计算 rpart 包结果的精度、召回率、F1 值【英文标题】:compute precision, recall, F1 values for rpart package result 【发布时间】:2019-11-16 03:16:56 【问题描述】:

下面的数据框是我的总数据集的一个样本:

A    B   C    D    E    target
0.2 0.5 0.6 -0.5   -0.7   1
0.9 0.7 0.4 -0.3   -0.8   0  
0.1 0.3 0.5 -0.9   -0.2   0
0.2 0.5 0.6 -0.5   -0.6   1

我想在上面应用分类树,所以我使用了以下代码:

data$target<-factor(data$target)

# Create Training Data
train.ind <- sample(nrow(data), 0.7*nrow(data))
trainData<-data[train.ind,]
testData<-data[-train.ind,]    

library("rpart")
tree <- rpart(target ~.,data=trainData)

ypred=predict(tree,testData)

    library(caret)
    #Print a confusion matrix
    result <- confusionMatrix(ypred,testData$target)

错误:datareference 应该是具有相同水平的因子。

   precision <- result$byClass['Pos Pred Value']    
    recall <- result$byClass['Sensitivity']
    f_measure <- 2 * ((precision * recall) / (precision + recall))
    #OR
    f_measure <-result$byClass['F1']

但它没有工作。我需要精度、召回率和 F1 值,但我不知道如何使用“rpart”包结果进行计算。

【问题讨论】:

究竟是什么不起作用?您是否收到错误(如果是,在哪里?)或意外结果(如果是,您为什么期待其他结果?)? @jkd 我无法计算混淆矩阵。我添加了错误。 【参考方案1】:

函数confusionMatrix 接受两个参数(datareference),它们必须是具有相同水平的因子。您的代码并非如此,因为predict 函数在给定rpart-object 时,默认情况下会返回一个矩阵,其中包含每个样本的类成员资格概率。你需要向这个函数指定你想要一个预测类的向量,并将这个向量转换为与target01)具有相同水平的因子。

这应该可以解决问题:

ypred <- factor(predict(tree, testData[, -6], type="vector"),
                levels = levels(testData$target))
library(caret)
confusionMatrix(ypred, testData$target)

使用factor(..., levels = levels(testData$target)) 可确保两个因子的水平顺序相同,以避免出现以下警告:

警告信息:confusionMatrix.default(ypred, testData$target) 中: 对于参考和数据,级别的顺序不同。重构 要匹配的数据。

【讨论】:

@minoo 我重新编辑了您对我的答案的编辑,以避免对因素的顺序进行硬编码。这应该总是有效的;)

以上是关于计算 rpart 包结果的精度、召回率、F1 值的主要内容,如果未能解决你的问题,请参考以下文章

python实现计算精度召回率和F1值

从精度、召回率、f1-score 计算准确率 - scikit-learn

F1 小于 Scikit-learn 中的精度和召回率

决策树的分类报告参数(精度、召回率、f1 分数、支持)为 1.0

牢记分类指标:准确率、精确率、召回率、F1 score以及ROC

在命名实体识别中计算精度和召回率