【问题标题】:How to extract Accuracy from caret's confusionMatrix?如何从插入符号的混淆矩阵中提取准确性?
【发布时间】:2018-07-05 11:06:20
【问题描述】:

我正在尝试从confusionMatrix() 输出中提取准确度值——我尝试过使用以下内容:

    cl <- train.data[,1]
    knn.res <- knn.cv(train.data[,c(2:783)], cl, k = i, algorithm = "cover_tree")
    confus.knn.res <- confusionMatrix(knn.res, train.data[,1])
    confus.knn.res
    k.accuracy[which(k.accuracy[,2]==i),2] <- confus.knn.res$Accuracy

虽然只是将其称为 $Accuracy 似乎不起作用。

【问题讨论】:

  • 我们需要一个可重现的示例或至少str 的数据。我们不知道confusionMatrix 的结果是data.frame 还是带有名为Accuracy 的列/元素的列表。
  • 是的,这也是我遇到的问题。输出本身为我提供了一个很好的描述性统计列表,但我不确定如何专门访问 Accuracy 值。这是虹膜数据的示例——inside-r.org/node/86995

标签: r


【解决方案1】:

confusionMatrix() 对象的一个​​值是整体——整体的第一个索引是准确度值。因此,它可以称为 confus.knn.res$overall[1]。

【讨论】:

  • rfClassifier = randomForest(x = training_set[-1], y = training_set$DV1, ntree = 100) rfPredicted = predict(rfClassifier, newdata = test_set[-1]) # 混淆矩阵 rfConfMatrix = table (true = test_set[ , 1], pred = rfPredicted) rfConfMatrix$overall[1] # Error in rfConfMatrix$overall : $ operator is invalid for atomic vectors
【解决方案2】:

由于overall 是一个命名向量,用户友好的方式是confus.knn.res$overall["Accuracy"]

【讨论】:

    【解决方案3】:

    虽然我回答得很晚,但它仍然可以帮助其他人计算所需的所有参数。它可以通过从混淆矩阵中检索值并通过以下代码计算来完成:

        conf_train<-table(training$Activity, predictions) #from predicted values
    
    
        conf_train<-confusionMatrix(fit.knn,norm = "none")  
    #from cross validation of training set, internal
    RF.statistics_train = matrix(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), nrow=3, ncol=5) 
    colnames(RF.statistics_train )<- c('Precision', 'Sensitivity', 'Specificity', 'Accuracy', 'MCC')
    rownames(RF.statistics_train) <- c('Class1', 'Class2', 'Class3')
    for(i in 1:3)
    {
      TP=conf_train$table[i,i]
      TN=0
      FP=0
      FN=0
      for(j in 1:3)
      {
        if(i!=j)
        {
          FP = FP + conf_train$table[j,i]
          FN = FN + conf_train$table[i,j]
        }
        for(k in 1:3)
        {
          if(i!=j && i!=k)
          {
            TN = TN + conf_train$table[j,k]
          }
        }
      }
      #  statistics[i,1] = conf_test[i,i]/col_total[i]
      #  statistics[i,2] = conf_test[i,i]/row_total[i]
      RF.statistics_train[i,1] = TP/(TP+FP)
      RF.statistics_train[i,2] = TP/(TP+FN)
      RF.statistics_train[i,3] = TN/(TN+FP)
      RF.statistics_train[i,4] = (TP+TN)/(TP+TN+FP+FN)
      RF.statistics_train[i,5] = (TP*TN-FP*FN)/sqrt((TP+FP)*(TP+FN)*(TN+FP)*(TN+FN))`
    }
    

    代码适用于三类矩阵,但您可以进行相应修改

    【讨论】:

      【解决方案4】:

      如果只需要输出值(即总体精度值),则应使用双括号,如下所示:

      confus.knn.res$overall[[1]] #整体精度是第一对象!

      【讨论】:

        猜你喜欢
        • 2017-03-20
        • 1970-01-01
        • 2018-04-16
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-07
        • 1970-01-01
        • 2016-08-13
        相关资源
        最近更新 更多