我有以下代码:
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之间的区别是什么,以及这种场景中的正确用法是什么?
答案 0 :(得分:5)
这是因为你误用了R的公式界面。公式:
as.factor(trainset[,55]) ~ .
在数据集trainset
内评估的将包括左侧作为响应,列车集中的所有变量作为预测变量。这是因为你没有在左侧给出一个变量的名称,所以.
被解释为所有内容"否则",但是所有内容"别的"在这种情况下就是一切,因为R无法找到一种叫做" as.factor(trainset [,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
属性来验证这一点。