R 指标 auc() 错误消息

问题描述 投票:0回答:2

我正在尝试计算

auc
但有一个奇怪的问题。当我运行这个脚本时:

rm(list = ls(all = T))
gc()

library(Metrics)
library(glmnet)

nrows <- 92681
set.seed(456)
df1 <- data.frame(act1 = round(runif(nrows), 0), pred1 = runif(nrows))

Metrics::auc(df1$act1, df1$pred1)
glmnet::auc(df1$act1, df1$pred1)

我得到:

> Metrics::auc(df1$act1, df1$pred1)
[1] 0.4930949
> glmnet::auc(df1$act1, df1$pred1)
[1] 0.4930949

当我再添加一行并运行它时:

rm(list = ls(all = T))
gc()

library(Metrics)
library(glmnet)

nrows <- 92682
set.seed(456)
df1 <- data.frame(act1 = round(runif(nrows), 0), pred1 = runif(nrows))

Metrics::auc(df1$act1, df1$pred1)
glmnet::auc(df1$act1, df1$pred1)

我明白了:

> Metrics::auc(df1$act1, df1$pred1)
[1] NA
Warning message:
In n_pos * n_neg : NAs produced by integer overflow
> glmnet::auc(df1$act1, df1$pred1)
[1] 0.5011554

知道这里发生了什么吗?

r metrics roc glmnet auc
2个回答
4
投票

Metrics::auc
使用的公式在分母中包含值
(n_pos * n_neg)
,在本例中为 'sum(actual == 1) * sum(actual == 0)',其计算结果为 integers
46308 * 46374 = 2147487192
,它超过了机器可以处理的最大 integer(即
.Machine$integer.max
)。

例如:

46308 * 46374
#> 2147487192

as.integer(46308) * as.integer(46374)
#> [1] NA
#> Warning message:
#> In as.integer(46308) * as.integer(46374) : NAs produced by integer overflow

0
投票

刚刚修改了功能:

AUC <- function(y_pred, y_true){
            rank <- rank(y_pred)
            n_pos <- as.numeric(sum(y_true == 1))
            n_neg <- as.numeric(sum(y_true == 0))
            auc <- (sum(rank[y_true == 1]) - n_pos * (n_pos + 1)/2)/(n_pos * n_neg)
            return(auc)
}
© www.soinside.com 2019 - 2024. All rights reserved.