1

我有以下代码:

RFmodel = randomForest(as.factor(trainset[,55]) ~ . , trainset, ntree = ntree.array[i], mtry = mtry.array[j], maxnodes = maxnodes.array[k])
RFyhat = predict(RFmodel , testset[,-55])
RFyhat = as.numeric(levels(RFyhat)[RFyhat])
Testerr.randomforest[i,j,k] = sum(RFyhat != testset[,55])/length(testset[,55])

此代码在第二行引发错误,即它说:

eval 中的错误(expr、envir、enclos):找不到对象“V55”

然而,奇怪的是,当我做两件事之一时,错误消失了,1)将第一行中的 trainset[,55] 更改为 trainset$V55,2)将 testset[,-55] 更改为 testset。但是,错误率略有不同(我想是因为在后者中,我使用 testset[,55] 作为自变量,但这只是我的猜测)。谁能向我解释使用 trainset[,55] 和 trainset$V55 之间的区别是什么,以及在这种情况下的正确用法是什么?

4

1 回答 1

5

这是因为您误用了 R 的公式界面。公式:

as.factor(trainset[,55]) ~ .

在数据集中进行评估trainset将包括左侧作为响应,将训练集中的所有变量作为预测变量。那是因为您没有在左侧给出变量的名称,所以 the.被解释为一切“其他”,但在这种情况下,一切“其他”就是一切,因为 R 找不到名为“as”的东西。因子(训练集 [,55])” 在trainset.

您可能想做更多类似的事情:

trainset$V55 <- as.factor(trainset$V55)
RFmodel = randomForest(V55 ~ . , trainset, ...)

此错误的一个后果是您将V55响应和预测都包括在内。令我惊讶的是,您并没有简单地获得 0% 的错误率,当您在此示例中执行等效操作时会发生这种情况:

rf <- randomForest(as.factor(iris[,5]) ~ ., data=iris)

Species用作响应,但也将其作为预测器。您可以通过查看生成的随机森林对象的$call或属性来验证这一点。$terms

于 2012-04-25T15:24:37.443 回答