3

「大きな」要素をRの一連のインジケーター(つまり、ダミー、バイナリ、フラグ)変数に変換しようとしています。

FLN <- data.frame(nnet::class.ind(FinelineNumber))

FinelineNumber、Kaggle.com の現在の Walmart コンテストの 5,000 レベルの係数です (このエラーを再現したい場合は、データが公開されています)。

私はこの心配そうな警告を受け取り続けます:

In n * (unclass(cl) - 1L) : NAs produced by integer overflow

システムで使用できるメモリは基本的に無制限です。何が問題なのかわかりません。

4

1 に答える 1

6

のソースコードnnet::class.indは次のとおりです。

function (cl)     {
    n <- length(cl)
    cl <- as.factor(cl)
    x <- matrix(0, n, length(levels(cl)))
    x[(1L:n) + n * (unclass(cl) - 1L)] <- 1
    dimnames(x) <- list(names(cl), levels(cl))
    x
}

.Machine$integer.maxは 2147483647n*(nlevels - 1L)です。がこの値より大きい場合、エラーが発生するはずです。を解くn:

imax <- .Machine$integer.max
nlevels <- 5000
imax/(nlevels-1L)
## [1] 429582.6

429583 行以上 (データ マイニング コンテキストでは特に大きくない) がある場合、この問題が発生します。上でコメントしたように、モデリング フレームワークがスパース行列を処理できる場合は、(または) を使用した方がはるかにうまくいくでしょう。または、このボトルネックを回避するために書き直す必要があります(つまり、絶対位置ではなく行と列によるインデックス付け) [上記の @joran のコメントは、R が倍精度値を介して大きなベクトルにインデックスを付けるため、その行をハッキングするだけですMatrix::sparse.model.matrixMatrix::fac2sparseclass.ind

x[(1:n) + n * (unclass(cl) - 1)] <- 1

おそらくas.numeric()、強制を強制的に2倍にするために、あちこちに明示的にスローします...]

このステップを完了することができたとしても、5000*650000 のマトリックスになってしまいます。これは 12Gb になるようです。

 print(650*object.size(matrix(1L,5000,1000)),units="Gb")

100Gbの空き容量があれば大丈夫だと思います...

于 2015-12-18T20:23:03.050 に答える