拟合随机森林模型和 return 指定数据结果的函数
A function to fit a random forest model and return the results of specified data
考虑以下数据框:
dat1 <- data.frame(Loc = rep(c("NY","MA","FL","GA"), each = 1000),
Region = rep(c("a","b","c","d"),each = 1000),
ID = rep(c(1:10), each=200),
var1 = rnorm(1000),
var2=rnorm(1000),
var3=rnorm(1000))
Loc
和 Region
是 ID
的两个分组变量。假设我有其他几个数据框,如 dat1
。我正在尝试编写一个自动将随机森林模型拟合到数据的函数。我想指定我希望它使用的数据框、分组变量和列。
我已经尝试了以下函数的变体,但是当我尝试 运行 它们
时,不断收到错误消息说 Error in get(dat, envir = .GlobalEnv) : invalid first argument
library(caret)
library(randomForest)
rand.f <- function(dat,groupvar,cols){
model <- train(groupvar ~ paste0(cols,collapse = "+"), data = dat, method = "rf", trControl = trainControl("cv", number = 10), importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
print(c.e)
}
rand.f(dat="dat1", groupvar = "Region", cols = 5:6)
model$bestTune
##################
rand.f <- function(dat,groupvar,cols){
model <- train(get(dat, envir=.GlobalEnv)[,groupvar] ~ paste0(cols,collapse = "+"), data = dat, method = "rf", trControl = trainControl("cv", number = 10), importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
print(c.e)
}
rand.f(dat="dat1", groupvar = "Region", cols = 5:6)
model$bestTune
我做错了什么?
以下应该有效:
rand.f <- function(dat,outcome){
model <- train(x = dat[, cols, drop=F]
, y = dat[, outcome]
, method = "rf"
, trControl = trainControl("cv", number = 2)
, importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
return(c.e)
}
这也适用于数字以及列名的向量,例如
cols <- colnames(dat1)[5:6]
请注意,我重命名了 'grouping' 变量,因为不太清楚在此上下文中分组变量应该是什么。我已将其重命名为可预测的结果,以突出其代表的含义。如果您确实尝试预测该区域,则可以忽略此评论。
如果您确实想为数据中的不同组触发此函数,即为不同的子集分离森林,那么您最好在此函数之外执行此操作。
考虑以下数据框:
dat1 <- data.frame(Loc = rep(c("NY","MA","FL","GA"), each = 1000),
Region = rep(c("a","b","c","d"),each = 1000),
ID = rep(c(1:10), each=200),
var1 = rnorm(1000),
var2=rnorm(1000),
var3=rnorm(1000))
Loc
和 Region
是 ID
的两个分组变量。假设我有其他几个数据框,如 dat1
。我正在尝试编写一个自动将随机森林模型拟合到数据的函数。我想指定我希望它使用的数据框、分组变量和列。
我已经尝试了以下函数的变体,但是当我尝试 运行 它们
Error in get(dat, envir = .GlobalEnv) : invalid first argument
library(caret)
library(randomForest)
rand.f <- function(dat,groupvar,cols){
model <- train(groupvar ~ paste0(cols,collapse = "+"), data = dat, method = "rf", trControl = trainControl("cv", number = 10), importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
print(c.e)
}
rand.f(dat="dat1", groupvar = "Region", cols = 5:6)
model$bestTune
##################
rand.f <- function(dat,groupvar,cols){
model <- train(get(dat, envir=.GlobalEnv)[,groupvar] ~ paste0(cols,collapse = "+"), data = dat, method = "rf", trControl = trainControl("cv", number = 10), importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
print(c.e)
}
rand.f(dat="dat1", groupvar = "Region", cols = 5:6)
model$bestTune
我做错了什么?
以下应该有效:
rand.f <- function(dat,outcome){
model <- train(x = dat[, cols, drop=F]
, y = dat[, outcome]
, method = "rf"
, trControl = trainControl("cv", number = 2)
, importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
return(c.e)
}
这也适用于数字以及列名的向量,例如
cols <- colnames(dat1)[5:6]
请注意,我重命名了 'grouping' 变量,因为不太清楚在此上下文中分组变量应该是什么。我已将其重命名为可预测的结果,以突出其代表的含义。如果您确实尝试预测该区域,则可以忽略此评论。
如果您确实想为数据中的不同组触发此函数,即为不同的子集分离森林,那么您最好在此函数之外执行此操作。