Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中创建许多ROC曲线?_R_Roc - Fatal编程技术网

在R中创建许多ROC曲线?

在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 #>

我有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
#> 
#>$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
中,您可以执行以下操作:1
gather()
所有的
col1,col2,…
2分<代码>分组依据()
分数3
summary()
获取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)),