【问题标题】:A function to fit a random forest model and return the results of specified data拟合随机森林模型并返回指定数据结果的函数
【发布时间】:2020-09-09 10:53:00
【问题描述】:

考虑以下数据框:

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

LocRegionID 的两个分组变量。假设我有几个其他数据框,例如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 

我做错了什么?

【问题讨论】:

  • 您创建/使用公式的方式存在缺陷。只需看看执行时会发生什么,例如groupvar ~ paste0(cols,collapse = "+")
  • @coffeinjunky 我明白了,有没有办法在 train() 调用中指定这些术语(正如我试图做的那样),或者在函数中创建新的(临时)对象更好从您的环境中获取并保存指定的数据,并将这些数据提供给train() 函数?

标签: r function functional-programming random-forest r-caret


【解决方案1】:

以下应该可以工作:

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 的名称周围加上引号而不是 dat 的名称.如果您使用paste 在函数中指定某些内容,这种情况会改变吗?你能试着澄清一下吗?也许我应该在网站上为此提出一个新问题
  • 如果你想在控制台打印一些东西,你只需要指定print,比如一条消息。您指定 return 以在函数调用后显式返回某些内容。如果你调用这个函数,outcome 将是一个字符串,例如"var1",所以你实际上是在 e.g. 中使用一个字符串。 dat[, outcome],读作dat[, "var1"]。关于标准评估和非标准评估,有一整本书要写。如果您使用来自tidyverse 的软件包,您可能会遇到不使用引号的非标准评估。假设它很复杂。
  • paste,用于连接字符串。关于dat1,这是一个已经在环境中的对象。我传递的是整个对象,而不仅仅是名称,因此不需要引用。
猜你喜欢
  • 2017-08-11
  • 2020-03-30
  • 2017-05-14
  • 2016-03-01
  • 2020-03-26
  • 2015-04-13
  • 2015-07-13
  • 2015-11-21
  • 2021-03-25
相关资源
最近更新 更多