【问题标题】:ROCR package AUROC output is different from manual calculationROCR包AUROC输出不同于手动计算
【发布时间】:2015-09-17 19:29:53
【问题描述】:

我首先使用 ROCR 包计算 AUROC(ROC 曲线的 AUC),然后手动(使用我的 get_au_curve() 函数)如下所示。

很遗憾,这两个结果不一致。我假设 ROCR 的结果是正确的。我的函数逼近器有问题吗?

rm(list=ls())
if(!require("ROCR")) { install.packages("ROCR");  require("ROCR") }

# Function to return area under the curve for ROC or PR curves
get_au_curve <- function(x, y)  {

  pr_perf <- performance(pred, measure=y, x.measure=x )
  x_list <- pr_perf@x.values[[1]]
  y_list <- pr_perf@y.values[[1]]

  if (y == "prec") { # if it is an Area under PR curve, impute precision[1], whcih is NaN, with 1
    y_list[is.na(y_list)] <-1  }

  f_appr <- approxfun( cbind(x_list, y_list) ) # function approximator for prediction-recall or ROC curve
  auc <- integrate(f_appr, 0, 1)

  return(auc$value)
}

predictions <- c(0.61, 0.36, 0.43, 0.14, 0.38, 0.24, 0.97, 0.89, 0.78, 0.86)
labels      <- c(1,    1,    1,    0,    0,     1,    1,    1,    0,     1)

pred <- prediction(predictions, labels)

# AUROC
# 1 Using ROCR
perf2 <- performance(pred, "auc")
auroc<- perf2@y.values

# 2. Using the function I wrote
auroc_manual <- get_au_curve('fpr', 'tpr')

这给出了结果:

> auroc_manual
[1] 0.6785714
> auroc
[[1]]
[1] 0.7142857

【问题讨论】:

    标签: r roc auc


    【解决方案1】:

    approxfun 不适合计算 ROC 曲线。对x 中的绑定值进行平均,并计算x 之间的插值。比较:

    plot(x_list, y_list, type="l")
    curve(f_appr)
    

    您应该使用caTools::trapz 或类似的函数,通过梯形规则计算 AUC。

    【讨论】:

    • 谢谢,是的,这是我最初尝试的,但 caTools 显然不适用于 R ver > 3.1。我会尝试找到另一个数值函数,例如梯形或辛普森函数。
    • pracma CRAN 中的包有一个 trapz() 函数,它按预期工作。我得到与 ROCR 的 AUROC 值相同的结果。
    猜你喜欢
    • 2018-08-05
    • 2017-05-22
    • 2019-10-09
    • 2021-09-15
    • 2020-12-01
    • 1970-01-01
    • 2020-03-12
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多