ggplot计算中的ROC曲线[r].



我正在尝试在ggplot中创建一条 ROC 曲线

我自己写了函数,但是当我将我的结果与来自社区roc_curve函数的结果进行比较时(我相信更多(,我得到了不同的结果。

我想问下面的功能哪里有错误?

library(ggplot2)
library(dplyr)
library(yardstick)
n <- 300 # sample size
data <- 
data.frame(
real = sample(c(0,1), replace=TRUE, size=n), 
pred = sample(runif(n), replace=TRUE, size=n)
)

simple_roc <- function(labels, scores){
labels <- labels[order(scores, decreasing=TRUE)]
data.frame(TPR=cumsum(labels)/sum(labels), FPR=cumsum(!labels)/sum(!labels), labels)
}

simple_roc(data$real, data$pred) %>% 
ggplot(aes(TPR, FPR)) + 
geom_line()

yardstick::roc_curve(data, factor(real), pred) %>% 
ggplot(aes(1 - specificity, sensitivity)) + 
geom_line()

首先,您需要将 ROC 曲线锚定在点 (0, 0( 和 (1, 1( 中。

simple_roc <- function(labels, scores){
labels <- labels[order(scores, decreasing=TRUE)]
data.frame(
TPR = c(0, cumsum(labels)/sum(labels), 1),
FPR = c(0, cumsum(!labels)/sum(!labels), 1)
)
}

然后,数据的呈现顺序在 ggplot2 中很重要。反转线方向应该会让你更接近一点:

yardstick::roc_curve(data, factor(real), pred) %>% 
ggplot(aes(rev(1 - specificity), rev(sensitivity))) + 
geom_line()

我建议不要将自己的函数用于任何严肃的工作。还有许多其他事情可能会出错,维护良好的软件包可以正确处理,例如缺失值、无限值、缺少一些标签以及其他我现在甚至无法考虑的事情。

最新更新