我正在拟合随机森林,并使用以下代码将数据分为训练集和测试集:
train <- sample( 1:nrow(Boston), (nrow(Boston))/2) )
编辑:在这里,train 显然只是一个索引,因此测试集如下:
testB <- Boston[-train,]; head(test); length(test)
响应变量的名称是 medy,它是第十四列。
我的随机森林也有以下代码(实际上我在这里装袋,因为我的数据集中的变量总数是 13):
bag.boston1 <- randomForest(medv~., data=Boston, subset=train, mtry=13,
importance=TRUE, ytest=testB$medv, xtest= )
我对 ytest= 选项的论证正确吗?我这么认为,因为它只是测试数据集中的响应变量。
另外,我应该对 xtest= 选项使用什么参数?
我的一个想法是从测试数据集中消除响应变量,从而创建一个仅测试数据集中的预测变量的数据框,然后我可以让 xtest 参数成为结果 x 矩阵:
`x <- testB`
x[14] <- NULL # because the 14th column is the response variable
bag.boston1 <- randomForest(medv~., data=Boston, subset=train, mtry=13,
importance=TRUE, ytest=testB$medv, xtest=x)
Run Code Online (Sandbox Code Playgroud)
从文档randomForest:
\n\n\n如果
\nxtest给定,则随着树的生长,测试集的预测将在 \xe2\x80\x9cin place\xe2\x80\x9d 处完成。如果ytest也给定,并且do.trace设置为某个正整数,则对于每do.trace棵树,都会打印测试集错误。测试集的结果在结果对象的测试组件中返回randomForest。对于分类,投票组件(用于训练或测试集数据)包含针对类别收到的案例的投票。如果norm.votes=TRUE,则给出分数,可以将其视为类别的预测概率。
从这里可以理解,仅将响应变量传递给ytest参数,不会改变任何内容randomForest。
如果您希望该randomForest函数“就地”进行预测,即当树木生长时,您必须将不带预测变量的测试数据传递给xtest如下所示:
bag.boston1 <- randomForest(medv~., data=Boston, subset=train, mtry=13, importance=TRUE, \n xtest=subset(testB, select=-medv))\nRun Code Online (Sandbox Code Playgroud)\n\n预测结果可以通过以下方式访问:bag.boston1$test$predicted
由于在本例中您还有测试数据的响应变量,因此您可以使用ytest变量传递它:
bag.boston2 <- randomForest(medv~., data=Boston, subset=train, mtry=13, importance=TRUE, \n xtest=subset(testB, select=-medv), ytest=testB$medv)\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,除了预测之外,我们还获得了一些附加值。mse对于均方误差和r 平方,它们rsq都是针对 的情况下生长的每一棵树regression。对于classification,它们是:err.rate,即每棵树的测试错误率,confusion对于混淆矩阵和votes给出每个输出类的投票数(或归一化投票数)。
可以使用以下方式访问以上所有值:bag.boston2$test