拟合随机森林模型并返回指定数据结果的函数。

问题描述 投票:0回答:1

考虑以下数据框。

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))

LocRegion 的两个分组变量。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 

我做错了什么?

r function functional-programming random-forest r-caret
1个回答
0
投票

下面的内容应该可以用。

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]

请注意,我重新命名了 "分组 "变量,因为在这种情况下,分组变量应该是什么有点不清楚。我把它改名为 outcome that is to be predicted,以强调这代表什么。如果你确实试图预测该区域,你可以忽略这个评论。

如果你确实想为你的数据中的不同组别触发这个函数,即为不同的子集分别建立森林,那么你最好在这个函数之外进行。

© www.soinside.com 2019 - 2024. All rights reserved.