跟进Pass rows of a data frame as arguments to a function in R with column names specifying the arguments :
我想使用不同的参数组合来训练以下模型:
library(xgboost)
library(Matrix)
df <- data.frame(y = sample(0:1, 1000, replace = TRUE),
a = rnorm(1000),
b = rnorm(1000),
c = rnorm(1000),
d = rnorm(1000))
train <- sparse.model.matrix(object = y~.-1, data = df)
model <- xgboost(data = train,
label = df$y,
# parameters
nrounds = 10,
subsample = 0.5,
colsample_bytree = 0.8)
我使用参数创建了一个网格,我想将网格的行传递到 xgboost
函数中,同时保留 data
和 label
参数不变。
param <- expand.grid(nrounds = c(10, 50, 100),
subsample = c(0.5, 0.8, 0.9),
colsample_bytree = c(0.8))
我想使用列名来传递参数来指定它们(如果列名不是一个选项,列的顺序也将执行此操作),因为这将使调用可针对不同的函数进行扩展。
最佳答案
我遇到了类似的问题,一直徒劳地寻找,直到我在 Hadley 的 Advanced R 中找到它。这允许您传递出现在数据框中的参数,将列的名称作为参数。阅读此处:
https://adv-r.hadley.nz/functionals.html#pmap
所以,就在这里。通过 purrr::pmap 有一个解决方案。它将参数映射到函数上:
这是我自己的代码,我最近与 quanteda
一起使用来处理 Kaggle SMS Spam 数据集。这些是我的参数的可能性:
tolower <- data_frame(tolower = c(TRUE, FALSE))
stem <- data_frame(stem = c(TRUE, FALSE))
remove_punct <- data_frame(remove_punct = c(TRUE, FALSE))
这是一个额外的好处,但不是必需的,但我发现我需要所有参数的组合来运行朴素贝叶斯模型。感谢 Y J 通过此 SO post :
expand.grid.df <- function(...) Reduce(function(...) merge(..., by=NULL), list(...))
parameters <- expand.grid.df(tolower, stem, remove_punct)
所以,现在我的参数如下所示:
> parameters
tolower stem remove_punct
1 TRUE TRUE TRUE
2 FALSE TRUE TRUE
3 TRUE FALSE TRUE
4 FALSE FALSE TRUE
5 TRUE TRUE FALSE
6 FALSE TRUE FALSE
7 TRUE FALSE FALSE
8 FALSE FALSE FALSE
现在神奇的是,通过 pmap
将参数传递给我选择的函数 (dfm
):
mymodels <- pmap(parameters, dfm, x = mycorpus)
(x = mycorpus
是一个常量的额外参数,我想将其传递给 dfm
)
这是我得到的:
> length(mymodels)
[1] 8
> mymodels[[1]]
Document-feature matrix of: 5,572 documents, 7,714 features (99.8% sparse).
希望这对您或其他研究此方法的人有帮助!
关于r - 将数据帧的行作为参数传递给函数,同时保持其他参数不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42112654/