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)
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
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.