随机森林 () 和插入符号随机森林的不同结果 (方法 = "rf")
Different results with randomForest() and caret's randomForest (method = "rf")
我是插入符号的新手,我只是想确保我完全理解它在做什么。为此,我一直在尝试使用 method="rf" 的插入符号的 train() 函数来复制我从 randomForest() 模型中获得的结果。不幸的是,我没有得到匹配的结果,我想知道我忽略了什么。
我还要补充一点,鉴于 randomForest 使用自举生成样本以适应每个 ntrees,并根据袋外预测估计误差,我对指定 "oob" 和 "boot" 在 trainControl 函数调用中。这些选项生成不同的结果,但都不匹配 randomForest() 模型。
虽然我已经阅读了 caret Package 网站 (http://topepo.github.io/caret/index.html),以及各种似乎可能相关的 Whosebug 问题,但我一直无法弄清楚为什么 caret 方法 = "rf" 模型产生与 randomForest() 不同的结果。非常感谢您提供的任何见解。
这是一个可复制的示例,使用来自 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)
生成以下内容:
print(rf.model)
Mean of squared residuals: 9.380421
% Var explained: 91.88
print(caret.oob.model$finalModel)
Mean of squared residuals: 38.3598
% Var explained: 66.81
print(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)
在火车中使用公式界面将因子转换为虚拟。要比较 caret
和 randomForest
的结果,您应该使用非公式界面。
在您的情况下,您应该在 trainControl
中提供种子以获得与 randomForest
中相同的结果。
Section training 在插入符号网页中,有一些关于再现性的注释,其中解释了如何使用种子。
library("randomForest")
set.seed(1)
rf.model <- randomForest(uptake ~ .,
data = CO2,
ntree = 50,
nodesize = 5,
mtry = 2,
importance = TRUE,
metric = "RMSE")
library("caret")
caret.oob.model <- train(CO2[, -5], CO2$uptake,
method = "rf",
ntree = 50,
tuneGrid = data.frame(mtry = 2),
nodesize = 5,
importance = TRUE,
metric = "RMSE",
trControl = trainControl(method = "oob", seed = 1),
allowParallel = FALSE)
如果您正在进行重采样,则应为每次重采样迭代提供种子,并为最终模型提供额外的种子。 ?trainControl
中的示例展示了如何创建它们。
在下面的示例中,最后一个种子用于最终模型,我将其设置为 1。
seeds <- as.vector(c(1:26), mode = "list")
# For the final model
seeds[[26]] <- 1
caret.boot.model <- train(CO2[, -5], CO2$uptake,
method = "rf",
ntree = 50,
tuneGrid = data.frame(mtry = 2),
nodesize = 5,
importance = TRUE,
metric = "RMSE",
trControl = trainControl(method = "boot", seeds = seeds),
allowParallel = FALSE)
使用 caret
正确定义非公式接口并在 trainControl
中设置种子,您将在所有三个模型中获得相同的结果:
rf.model
caret.oob.model$final
caret.boot.model$final
我是插入符号的新手,我只是想确保我完全理解它在做什么。为此,我一直在尝试使用 method="rf" 的插入符号的 train() 函数来复制我从 randomForest() 模型中获得的结果。不幸的是,我没有得到匹配的结果,我想知道我忽略了什么。
我还要补充一点,鉴于 randomForest 使用自举生成样本以适应每个 ntrees,并根据袋外预测估计误差,我对指定 "oob" 和 "boot" 在 trainControl 函数调用中。这些选项生成不同的结果,但都不匹配 randomForest() 模型。
虽然我已经阅读了 caret Package 网站 (http://topepo.github.io/caret/index.html),以及各种似乎可能相关的 Whosebug 问题,但我一直无法弄清楚为什么 caret 方法 = "rf" 模型产生与 randomForest() 不同的结果。非常感谢您提供的任何见解。
这是一个可复制的示例,使用来自 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)
生成以下内容:
print(rf.model)
Mean of squared residuals: 9.380421
% Var explained: 91.88
print(caret.oob.model$finalModel)
Mean of squared residuals: 38.3598
% Var explained: 66.81
print(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)
在火车中使用公式界面将因子转换为虚拟。要比较 caret
和 randomForest
的结果,您应该使用非公式界面。
在您的情况下,您应该在 trainControl
中提供种子以获得与 randomForest
中相同的结果。
Section training 在插入符号网页中,有一些关于再现性的注释,其中解释了如何使用种子。
library("randomForest")
set.seed(1)
rf.model <- randomForest(uptake ~ .,
data = CO2,
ntree = 50,
nodesize = 5,
mtry = 2,
importance = TRUE,
metric = "RMSE")
library("caret")
caret.oob.model <- train(CO2[, -5], CO2$uptake,
method = "rf",
ntree = 50,
tuneGrid = data.frame(mtry = 2),
nodesize = 5,
importance = TRUE,
metric = "RMSE",
trControl = trainControl(method = "oob", seed = 1),
allowParallel = FALSE)
如果您正在进行重采样,则应为每次重采样迭代提供种子,并为最终模型提供额外的种子。 ?trainControl
中的示例展示了如何创建它们。
在下面的示例中,最后一个种子用于最终模型,我将其设置为 1。
seeds <- as.vector(c(1:26), mode = "list")
# For the final model
seeds[[26]] <- 1
caret.boot.model <- train(CO2[, -5], CO2$uptake,
method = "rf",
ntree = 50,
tuneGrid = data.frame(mtry = 2),
nodesize = 5,
importance = TRUE,
metric = "RMSE",
trControl = trainControl(method = "boot", seeds = seeds),
allowParallel = FALSE)
使用 caret
正确定义非公式接口并在 trainControl
中设置种子,您将在所有三个模型中获得相同的结果:
rf.model
caret.oob.model$final
caret.boot.model$final