web-dev-qa-db-fra.com

Comment éliminer "NA / NaN / Inf dans un appel de fonction étrangère (arg 7)" en cours d'exécution avec randomForest

J'ai fait des recherches approfondies sur ce sujet sans trouver de solution. J'ai nettoyé mon ensemble de données comme suit:

library("raster")
impute.mean <- function(x) replace(x, is.na(x) | is.nan(x) | is.infinite(x) , 
mean(x, na.rm = TRUE))
losses <- apply(losses, 2, impute.mean)
colSums(is.na(losses))
isinf <- function(x) (NA <- is.infinite(x))
infout <- apply(losses, 2, is.infinite)
colSums(infout)
isnan <- function(x) (NA <- is.nan(x))
nanout <- apply(losses, 2, is.nan)
colSums(nanout)

Le problème se pose en exécutant l'algorithme de prédiction:

options(warn=2)
p  <-   predict(default.rf, losses, type="prob", inf.rm = TRUE, na.rm=TRUE, nan.rm=TRUE)

Toutes les recherches indiquent qu'il devrait s'agir de NA, d'Inf ou de NaN dans les données, mais je n'en trouve pas. Je rend les données et le résumé randomForest disponibles pour les détections sur [supprimé] Traceback ne révèle pas grand-chose (pour moi de toute façon):

4: .C("classForest", mdim = as.integer(mdim), ntest = as.integer(ntest), 
       nclass = as.integer(object$forest$nclass), maxcat = as.integer(maxcat), 
       nrnodes = as.integer(nrnodes), jbt = as.integer(ntree), xts = as.double(x), 
       xbestsplit = as.double(object$forest$xbestsplit), pid = object$forest$pid, 
       cutoff = as.double(cutoff), countts = as.double(countts), 
       treemap = as.integer(aperm(object$forest$treemap, c(2, 1, 
           3))), nodestatus = as.integer(object$forest$nodestatus), 
       cat = as.integer(object$forest$ncat), nodepred = as.integer(object$forest$nodepred), 
       treepred = as.integer(treepred), jet = as.integer(numeric(ntest)), 
       bestvar = as.integer(object$forest$bestvar), nodexts = as.integer(nodexts), 
       ndbigtree = as.integer(object$forest$ndbigtree), predict.all = as.integer(predict.all), 
       prox = as.integer(proximity), proxmatrix = as.double(proxmatrix), 
       nodes = as.integer(nodes), DUP = FALSE, PACKAGE = "randomForest")
3: predict.randomForest(default.rf, losses, type = "prob", inf.rm = TRUE, 
       na.rm = TRUE, nan.rm = TRUE)
2: predict(default.rf, losses, type = "prob", inf.rm = TRUE, na.rm = TRUE, 
       nan.rm = TRUE)
1: predict(default.rf, losses, type = "prob", inf.rm = TRUE, na.rm = TRUE, 
       nan.rm = TRUE)
14
Elliott

Votre code n'est pas entièrement reproductible (il n'y a pas d'exécution de l'algorithme réel randomForest) mais vous pas remplacez les valeurs Inf par les vecteurs de colonne. En effet, l'argument na.rm = TRUE Dans l'appel à mean() dans votre fonction impute.mean Fait exactement ce qu'il dit - supprime les valeurs de NA (et non Inf ones).

Vous pouvez le voir, par exemple, par:

impute.mean <- function(x) replace(x, is.na(x) | is.nan(x) | is.infinite(x), mean(x, na.rm = TRUE))
losses <- apply(losses, 2, impute.mean)
sum( apply( losses, 2, function(.) sum(is.infinite(.))) )
# [1] 696

Pour se débarrasser des valeurs infinies, utilisez:

impute.mean <- function(x) replace(x, is.na(x) | is.nan(x) | is.infinite(x), mean(x[!is.na(x) & !is.nan(x) & !is.infinite(x)]))
losses <- apply(losses, 2, impute.mean)
sum(apply( losses, 2, function(.) sum(is.infinite(.)) ))
# [1] 0
15
Nate Pope

Une cause du message d'erreur:

NA/NaN/Inf dans l'appel de fonction étrangère (arg X)

Lors de la formation d'un randomForest, il y a character- variables de classe dans votre data.frame. S'il vient avec l'avertissement:

AN introduits par coercition

Vérifiez que toutes vos variables de caractères ont été converties en facteurs.

Exemple

set.seed(1)
dat <- data.frame(
  a = runif(100),
  b = rpois(100, 10),
  c = rep(c("a","b"), 100),
  stringsAsFactors = FALSE
)

library(randomForest)
randomForest(a ~ ., data = dat)

Rendements:

Erreur dans randomForest.default (m, y, ...): NA/NaN/Inf dans l'appel de fonction étrangère (arg 1) En plus: Message d'avertissement: Dans data.matrix (x): NA introduits par coercition

Mais supprimez le stringsAsFactors = FALSE argument et il s'exécute.

9
Sam Firke