【发布时间】:2016-08-10 08:49:35
【问题描述】:
我是插入符号的新手,我只是想确保我完全理解它在做什么。为此,我一直在尝试复制我从 randomForest() 模型中获得的结果,使用插入符号的 train() 函数 for method="rf"。不幸的是,我无法获得匹配的结果,我想知道我忽略了什么。
我还要补充一点,鉴于 randomForest 使用引导生成样本以适应每个 ntree,并根据袋外预测估计误差,我对指定“oob”之间的区别有点模糊和 trainControl 函数调用中的“启动”。这些选项生成不同的结果,但都不匹配 randomForest() 模型。
虽然我已经阅读了 caret Package 网站 (http://topepo.github.io/caret/index.html),以及似乎可能相关的各种 StackOverflow 问题,但我无法弄清楚为什么 caret method = "rf" 模型会产生不同的随机森林()的结果。非常感谢您提供的任何见解。
这是一个可复制的示例,使用 MASS 包中的 CO2 数据集。
library(MASS)
data(CO2)
library(randomForest)
set.seed(1)
rf.model <- randomForest(uptake ~ .,
data = CO2,
ntree = 50,
nodesize = 5,
mtry=2,
importance=TRUE,
metric="RMSE")
library(caret)
set.seed(1)
caret.oob.model <- train(uptake ~ .,
data = CO2,
method="rf",
ntree=50,
tuneGrid=data.frame(mtry=2),
nodesize = 5,
importance=TRUE,
metric="RMSE",
trControl = trainControl(method="oob"),
allowParallel=FALSE)
set.seed(1)
caret.boot.model <- train(uptake ~ .,
data = CO2,
method="rf",
ntree=50,
tuneGrid=data.frame(mtry=2),
nodesize = 5,
importance=TRUE,
metric="RMSE",
trControl=trainControl(method="boot", number=50),
allowParallel=FALSE)
print(rf.model)
print(caret.oob.model$finalModel)
print(caret.boot.model$finalModel)
产生以下内容:
打印(rf.model)
Mean of squared residuals: 9.380421
% Var explained: 91.88
打印(caret.oob.model$finalModel)
Mean of squared residuals: 38.3598
% Var explained: 66.81
打印(caret.boot.model$finalModel)
Mean of squared residuals: 42.56646
% Var explained: 63.16
以及查看变量重要性的代码:
importance(rf.model)
importance(caret.oob.model$finalModel)
importance(caret.boot.model$finalModel)
【问题讨论】:
-
没有使用您的实际数据并尝试重现您构建的模型,您是否检查过插入符号和 randomForest 模型的行为?如果两者都表现出非常相似的重要预测因子,具有相似的权重,那么您可能不太关心其他变化。
-
嗨蒂姆 - 感谢您的时间和投入。我查看了变量重要性(我更新了上面的代码以反映这一点),并且我得到了预测变量的不同权重。即使重量没有那么不同,但我仍然想了解导致差异的原因。当我无法解释的事情时,我总是担心我不知道我不知道的事情!
-
在 train 中使用公式接口将因子转换为 dummy。要与 randomForest 进行比较,您应该使用非公式接口。例如
train(CO2[, -5], CO2$uptake, method="rf", ...) -
嗨 Lluís - 谢谢你的建议!插入符号模型的结果现在更接近于原始的 randomForest 模型。但是,它们仍然不准确。这里还有其他可能发生的事情吗?
标签: r random-forest r-caret