在R中创建许多ROC曲线?
我有150列分数和1列标签(1/0)。 我的目标是创造150个AUC分数 以下是一个手动示例:在R中创建许多ROC曲线?,r,roc,R,Roc,我有150列分数和1列标签(1/0)。 我的目标是创造150个AUC分数 以下是一个手动示例: auc(roc(df$label, df$col1)), auc(roc(df$label, df$col2)), ... 我可以在这里使用Map/sapply/lappy,但还有其他方法或函数吗?如果要并行计算,可以这样做: #生成一些玩具数据 标签 #>$X2 #>曲线下面积:0.5235 #> #>$X3 #>曲线下面积:0.5181 #> #>$X4 #>曲线下面积:0.5119 #>
auc(roc(df$label, df$col1)),
auc(roc(df$label, df$col2)),
...
我可以在这里使用Map/sapply/lappy,但还有其他方法或函数吗?如果要并行计算,可以这样做:
#生成一些玩具数据
标签
#>$X2
#>曲线下面积:0.5235
#>
#>$X3
#>曲线下面积:0.5181
#>
#>$X4
#>曲线下面积:0.5119
#>
#>$X5
#>曲线下面积:0.5083
#>
#>$X6
#>曲线下面积:0.5159
由于大部分计算时间似乎都是调用
auc(roc(…)
,如果您有一台多核机器,这应该会加快速度。在cutpointr
包中有一个函数可以实现这一点。它还计算切入点和其他指标,但您可以放弃这些。默认情况下,它将尝试所有列(响应列除外)作为预测值。此外,您可以通过省略方向
来选择是否自动确定ROC曲线的方向(较大的值是否意味着正类或相反),或者手动设置
dat <- iris[1:100, ]
library(tidyverse)
library(cutpointr)
mc <- multi_cutpointr(data = dat, class = "Species", pos_class = "versicolor",
silent = FALSE)
mc %>% select(variable, direction, AUC)
# A tibble: 4 x 3
variable direction AUC
<chr> <chr> <dbl>
1 Sepal.Length >= 0.933
2 Sepal.Width <= 0.925
3 Petal.Length >= 1.00
4 Petal.Width >= 1.00
这是一个小问题。你真正想要的是加速你的计算。并行化解决了这个问题,但这只是一种方法
如我所设想的,如果您正在使用库(pROC)
的roc
/auc
函数,那么您可以通过为数据集选择适当的算法来获得更快的速度
pROC
基本上有两种算法,根据数据集的特征,它们的伸缩性非常不同。通过将algorithm=0
传递到roc
,您可以对哪一个最快进行基准测试:
# generate some toy data
label <- rbinom(600000, 1, 0.5)
score <- rpois(600000, 10)
library(pROC)
roc(label, score, algorithm=0)
Starting benchmark of algorithms 2 and 3, 10 iterations...
expr min lq mean median uq max neval
2 2 4805.58762 5827.75410 5910.40251 6036.52975 6085.8416 6620.733 10
3 3 98.46237 99.05378 99.52434 99.12077 100.0773 101.363 10
Selecting algorithm 3.
在我的机器上,现在每次调用
roc
大约需要5秒钟,与阈值的数量无关。这样你应该在15分钟内完成。除非您有50个或更多内核,否则这将比仅仅并行化更快。但是当然你可以同时做这两件事……应用系列函数有什么问题?purrr
包做了类似的事情,但在我看来更直观。但同样,它类似于apply
函数系列。您的最终目标是什么,一个包含所有分数的数据框?在dplyr
中,您可以执行以下操作:1gather()
所有的col1,col2,…
2分<代码>分组依据()
分数3summary()
获取AUC。@Amar是的,当然,我会告诉你我为什么这么问:我的151列数据框中有600000行。我现在跑得很快,但我想也许这里的一些专家会建议更好的方法。就像Python中并行计算的Dask库。@马吕斯,我知道这种方法,但它会比sapply更快吗?如果没有测试,我真的说不出来。我猜大致相同,我认为大部分运行时将在roc()
/auc()
中,不受循环/迭代方法的影响,但可能会有一些差异。与您完全相同,但使用了parSapply
。为什么要使用mclappy
@gfgmtbh,因为我更好地记住了语法,它为我节省了一行在集群上加载环境的代码。但是实际上应该以parapply()/parlappy()
为例,因为mcapply
与windows不兼容(我没有想到这一点)@Steves在这里讨论差异:非常感谢,问题是如果我与parapply一起使用它,占用的内存会更少,而mclappy使用的内存更多,有时还会崩溃@gfgm
# generate some toy data
label <- rbinom(600000, 1, 0.5)
score <- rpois(600000, 10)
library(pROC)
roc(label, score, algorithm=0)
Starting benchmark of algorithms 2 and 3, 10 iterations...
expr min lq mean median uq max neval
2 2 4805.58762 5827.75410 5910.40251 6036.52975 6085.8416 6620.733 10
3 3 98.46237 99.05378 99.52434 99.12077 100.0773 101.363 10
Selecting algorithm 3.
auc(roc(df$label, df$col1, algorithm=2)),
auc(roc(df$label, df$col2, algorithm=2)),