Hoe “NA/NaN/Inf in buitenlandse functie-aanroep (arg 7)” te elimineren met voorspellen met randomForest

Ik heb dit uitgebreid onderzocht zonder een oplossing te vinden. Ik heb mijn dataset als volgt opgeschoond:

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)

Het probleem doet zich voor bij het uitvoeren van het voorspellingsalgoritme:

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

Al het onderzoek zegt dat het NA’s of Inf’s of NaN’s in de gegevens zouden moeten zijn, maar ik vind er geen. Ik maak de gegevens en de randomForest-samenvatting beschikbaar voor speurwerk op [verwijderd]
Traceback onthult niet veel (voor mij in ieder geval):

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)

Antwoord 1, autoriteit 100%

Uw code is niet volledig reproduceerbaar (het daadwerkelijke randomForest-algoritme wordt niet uitgevoerd), maar u nietvervangt Inf-waarden door de middelen van kolomvectoren. Dit komt omdat het argument na.rm = TRUEin de aanroep van mean()binnen uw functie impute.meanprecies doet wat het zegt: – verwijdert NA-waarden (en niet Inf-waarden).

Je kunt dit bijvoorbeeld zien door:

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

Om van oneindige waarden af te komen, gebruikt u:

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

Antwoord 2, Autoriteit 81%

Een oorzaak van het foutbericht:

NA / NAN / INF IN BUITENLANDSE FUNCTIESOP (ARG X)

Bij het trainen van een willekeurige weerstand heeft character-klasse variabelen in uw gegevens. Als het wordt geleverd met de waarschuwing:

NAS geïntroduceerd door dwang

Controleer om ervoor te zorgen dat al uw tekenvariabelen zijn omgezet in factoren.

voorbeeld

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)

rendementen:

Fout in RandomForest.Default (M, Y, …): Na / Nan / Inf in Foreign
Functie-oproep (Arg 1) Bovendien: Waarschuwingsbericht: in data.matrix (X)
: NAS geïntroduceerd door dwang

, maar schakel het in op stringsAsFactors = TRUEEN HET WERKT.

Other episodes