如何消除“外部函数调用中的 NA/NaN/Inf (arg 7)”使用 randomForest 运行预测

Posted

技术标签:

【中文标题】如何消除“外部函数调用中的 NA/NaN/Inf (arg 7)”使用 randomForest 运行预测【英文标题】:How to eliminate "NA/NaN/Inf in foreign function call (arg 7)" running predict with randomForest 【发布时间】:2014-03-24 17:13:26 【问题描述】:

我对此进行了广泛的研究,但没有找到解决方案。我已按如下方式清理了我的数据集:

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)

运行预测算法出现问题:

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

所有研究都说数据中应该是 NA 或 Inf 或 NaN,但我没有找到。我正在 [deleted] 处提供数据和 randomForest 摘要以供侦查 Traceback 并没有透露太多信息(无论如何对我来说):

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)

【问题讨论】:

如果没有关于森林本身的更多信息就很难判断(您的文件仅包含数据)。但我确实想知道你从哪里得到inf.rmna.rmnan.rmpredict.randomForest 的论据的想法。它们当然不在文档中。 压缩文件包含 RF 摘要。它不再可用。 NA、Inf 和 NaN 是可能阻止 RF 运行的缺失或不可计算数据的形式。 Nate 的回答很有效。 我非常清楚 NA、Inf 和 NaN 是什么。我指出,对于该预测函数,这些论点根本不存在。它们被完全忽略。 @joran 问题是他们没有被忽略,谢谢 我不明白我所说的任何话怎么会被视为敌对,但如果你看到了这种方式,我很抱歉。或许我们彼此误会了。 predict 语句没有运行,因为(如下面的正确答案所指出的)您没有完全删除 NA、NaN 等。但是 inf.rm = TRUE, na.rm=TRUE, nan.rm=TRUE 参数确实被忽略了,根本没有效果。那是我唯一的观点。您必须手动删除这些值; predict.randomForest 没有使用这些名称的参数。 【参考方案1】:

您的代码并非完全可重现(没有运行实际的 randomForest 算法),但您没有用列向量的方式替换 Inf 值。这是因为在 impute.mean 函数中对 mean() 的调用中的 na.rm = TRUE 参数完全符合其所说的 - 删除 NA 值(而不是 Inf 值)。

你可以看到这个,例如,通过:

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

要摆脱无限值,请使用:

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

【讨论】:

【参考方案2】:

错误信息的一个原因:

外部函数调用中的NA/NaN/Inf (arg X)

在训练 randomForest 时,您的 data.frame 中有 character-class 变量。如果它带有警告:

强制引入的NAs

检查以确保所有字符变量都已转换为因子。

示例

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)

产量:

randomForest.default(m, y, ...) 中的错误:外国的 NA/NaN/Inf 函数调用 (arg 1) 另外:警告消息:在 data.matrix(x) : 强制引入的 NAs

但是将其切换到stringsAsFactors = TRUE 并运行。

【讨论】:

以上是关于如何消除“外部函数调用中的 NA/NaN/Inf (arg 7)”使用 randomForest 运行预测的主要内容,如果未能解决你的问题,请参考以下文章

do_one(nmeth) 中的错误:外部函数调用中的 NA/NaN/Inf (arg 1)

-------如何消除打印机的字迹(字迹打印机消除即)--------

-------如何消除打印机的字迹(字迹打印机消除即)--------

如何消除间接呼叫 Method 在 Android Studio 中的编译警告

关于DirectX9如何消除Alpha混合中出现的亮度溢出

如何消除ANSYS 模型KO,MO字样