如何从R中的混淆矩阵(confusionMatrix)中获取总体准确率值?

14
在R的caret库中,如果我得到了如下的混淆矩阵,有没有一种方法可以检索总体准确率0.992?我无法获取这个单一的值,因为我需要存储这个值并在以后进行处理。这有可能吗?

在R的caret库中,如果我获得了以下的混淆矩阵,是否有办法获取总体准确度0.992?我无法仅仅取出这个单一的值,因为我需要将其存储并用于后续处理。这是否可能?

 Prediction    A    B    C    D    E
          A 1114    2    0    0    0
          B    9  745    5    0    0
          C    0    6  674    4    0
          D    0    0    3  640    0
          E    0    0    2    1  718

总体统计

            Accuracy : 0.992         
              95% CI : (0.989, 0.994)
 No Information Rate : 0.286         
 P-Value [Acc > NIR] : <2e-16        

               Kappa : 0.99          

Mcnemar的检验P值:NA

按类别统计:

                     Class: A Class: B Class: C Class: D Class: E
 Sensitivity             0.992    0.989    0.985    0.992    1.000
 Specificity             0.999    0.996    0.997    0.999    0.999
 Pos Pred Value          0.998    0.982    0.985    0.995    0.996
 Neg Pred Value          0.997    0.997    0.997    0.998    1.000
 Prevalence              0.286    0.192    0.174    0.164    0.183
 Detection Rate          0.284    0.190    0.172    0.163    0.183
 Detection Prevalence    0.284    0.193    0.174    0.164    0.184
 Balanced Accuracy       0.996    0.992    0.991    0.996    1.000
1个回答

34

给定混淆矩阵cm,通过overall.accuracy <- cm$overall['Accuracy']获得总体准确率。

这是我第一次看到caret包,那么我是怎么知道的呢?

由于您没有提供示例,我搜索了一个有关caret混淆矩阵的示例代码。这是它(我只在最后一条语句中添加了赋值):

###################
## 3 class example

confusionMatrix(iris$Species, sample(iris$Species))

newPrior <- c(.05, .8, .15)
names(newPrior) <- levels(iris$Species)

cm <- confusionMatrix(iris$Species, sample(iris$Species))

现在,让我们来看看混淆矩阵中包含了什么:

> str(cm)
List of 5
 $ positive: NULL
 $ table   : 'table' int [1:3, 1:3] 13 18 19 20 13 17 17 19 14
  ..- attr(*, "dimnames")=List of 2
  .. ..$ Prediction: chr [1:3] "setosa" "versicolor" "virginica"
  .. ..$ Reference : chr [1:3] "setosa" "versicolor" "virginica"
 $ overall : Named num [1:7] 0.267 -0.1 0.198 0.345 0.333 ...
  ..- attr(*, "names")= chr [1:7] "Accuracy" "Kappa" "AccuracyLower" "AccuracyUpper" ...
 $ byClass : num [1:3, 1:8] 0.26 0.26 0.28 0.63 0.63 0.64 0.26 0.26 0.28 0.63 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:3] "Class: setosa" "Class: versicolor" "Class: virginica"
  .. ..$ : chr [1:8] "Sensitivity" "Specificity" "Pos Pred Value" "Neg Pred Value" ...
 $ dots    : list()
 - attr(*, "class")= chr "confusionMatrix"

你可能会发现,cm对象是一个列表。我们可以看到各种“byClass”和“overall”统计数据。其中,“overall”部分是通过以下方式获得的:

overall <- cm$overall

这让我们得到了一个带有字符串索引的数字向量:

> overall
      Accuracy          Kappa  AccuracyLower  AccuracyUpper   AccuracyNull AccuracyPValue  McnemarPValue 
     0.2666667     -0.1000000      0.1978421      0.3449492      0.3333333      0.9674672      0.9547790 
现在,提取相关值就很简单了:
> overall.accuracy <- overall['Accuracy'] 

总结:使用str函数是一个很好的选择。另一个有用的函数是attributes,它会返回给定对象的所有属性。


1
回答不错,但是精度返回一个字符串和一个值,我怎么才能访问这个值呢?我的意思是double类型的值。 - Emixam23
2
@Emixam23,你可能已经找到了你问题的解决方案,但是对于那些正在寻找答案的人来说,只需在上述括号前后添加另一个方括号,就像这样overall.accuracy <- overall[['Accuracy']] - Saahil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接