繁体   English   中英

从 R 中的 2 个逻辑向量计算混淆矩阵的最有效方法是什么?

[英]What is the most efficient way of computing a confusion matrix from 2 logical vectors in R?

给定两个逻辑向量(即 R 中只有 TRUE 或 FALSE 值),长度均为 n(一个向量是预测,另一个是基本事实),计算真阳性和真阴性的最有效方法是什么,假阳性和假阴性? 只需执行tp = pred & truth即可轻松完成真正的肯定。 但是,我认为 R 中没有其他逻辑运算符可以直接帮助计算其他统计信息。

一个明显的解决方案是遍历这两个向量并只做案例(例如,如果预测为 FALSE 且真值 FALSE 则将真负数加一),但我觉得必须有一种更快的方法。 真正的肯定情况非常好,因为它可以通过向量化的 AND 运算符来完成(我认为?)。

编辑:我的错,忘了提几个重要的细节:我的真实数据中的向量有数亿长,我需要计算混淆矩阵大约 30,000 次。 使用表格的答案很有用,因为我之前完全错过了这个选项,但我担心转换为因子并且使用表格太慢了。 我认为此时最好的选择可能是使用 Rcpp。

您可以使用caret package 中的confusionMatrix () function:

代码:

library(caret)
set.seed(123)
confusionMatrix(
prediction <- factor(sample(c(0,1), 100, replace = TRUE)),
ground_truth <- factor(sample(c(0,1), 100, replace = TRUE)))

Output:

Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 26 31
         1 20 23
                                         
               Accuracy : 0.49           
                 95% CI : (0.3886, 0.592)
    No Information Rate : 0.54           
    P-Value [Acc > NIR] : 0.8650         
                                         
                  Kappa : -0.0087        
                                         
 Mcnemar's Test P-Value : 0.1614         
                                         
            Sensitivity : 0.5652         
            Specificity : 0.4259         
         Pos Pred Value : 0.4561         
         Neg Pred Value : 0.5349         
             Prevalence : 0.4600         
         Detection Rate : 0.2600         
   Detection Prevalence : 0.5700         
      Balanced Accuracy : 0.4956         
                                         
       'Positive' Class : 0  

首先将二进制向量转换为因子,

pred = factor(pred, levels = c(F,T))
truth = factor(truth, levels = c(F,T))

即使没有某些配对的实例,这也将确保返回完整的 2x2 表。 列联表由下式计算

table(pred, truth)

首先转换为因子将确保没有实例的组合在结果表中将获得0值。 例如,

pred = rep(T, 10)
truth = rep(F, 10)

table(pred,truth)  # RETURNS A 1x1 TABLE 

pred = factor(pred, levels = c(F,T))
truth = factor(truth, levels = c(F,T))

table(pred,truth)  # RETURNS A 2x2 TABLE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM