ROCR包AUROC输出不同于手工计算
ROCR package AUROC output is different from manual calculation
我首先使用 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
approxfun
不适合计算 ROC 曲线。 x
中的绑定值被平均,并计算 x
之间的插值。比较:
plot(x_list, y_list, type="l")
curve(f_appr)
您应该使用 caTools::trapz 或类似的函数来计算梯形法则的 AUC。
我首先使用 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
approxfun
不适合计算 ROC 曲线。 x
中的绑定值被平均,并计算 x
之间的插值。比较:
plot(x_list, y_list, type="l")
curve(f_appr)
您应该使用 caTools::trapz 或类似的函数来计算梯形法则的 AUC。