1

私は計算しようとしています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

もう1行追加してこれを実行すると:

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

ここで何が起こっているのか分かりますか?

4

1 に答える 1

3

Metrics::auc分母に値を含む式を使用します(n_pos * n_neg)。この場合は 'sum(actual == 1) * sum(actual == 0)' であり、整数 に評価されます。これは、マシンが処理できる46308 * 46374 = 2147487192最大の整数.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
于 2015-02-19T18:21:07.727 に答える