考虑这个简单的例子,它在一些文本数据上训练naive bayes
模型。
dtrain <- data_frame(text = c("Chinese Beijing Chinese",
"Chinese Chinese Shanghai",
"Chinese Macao",
"Tokyo Japan Chinese"),
doc_id = 1:4,
class = c(1, 1, 1, 0))
dtrain_spark <- copy_to(sc, dtrain, overwrite = TRUE)
pipeline <- ml_pipeline(
ft_tokenizer(sc, input.col = "text", output.col = "tokens"),
ft_count_vectorizer(sc, input_col = 'tokens', output_col = 'myvocab'),
ml_decision_tree_classifier(sc, label_col = "class",
features_col = "myvocab",
prediction_col = "pcol",
probability_col = "prcol",
raw_prediction_col = "rpcol")
)
问题是我在循环中拟合了几个模型,得到了一些结果,但我希望能够将这些模型保存在列表中(或者允许我稍后单独使用这些模型的任何模型)。
我尝试了通常的技巧:设置一个空列表,并在创建时将模型添加到列表中。不幸的是,这不起作用,如下所示
model_list <- list()
fitmodel <- function(sc, string){
print(paste('this is iteration', string))
model <- ml_fit(pipeline, dtrain_spark)
model_list[[string]] <- model
#do some other stuff with the model
}
purrr::map(c('stack', 'over', 'flow'), ~fitmodel(sc,.))
[1] "this is iteration stack"
[1] "this is iteration over"
[1] "this is iteration flow"
然而我的名单是空的! :(
> model_list
list()
这里有什么问题?可以做些什么?我想尽可能避免写入磁盘。
谢谢!
答案 0 :(得分:2)
请勿尝试使用map
进行副作用。将您的功能重写为:
strings <- c('stack', 'over', 'flow')
fitmodel <- function(sc, string){
print(paste('this is iteration', string))
ml_fit(pipeline, dtrain_spark)
}
model_list <- purrr::map(strings, ~fitmodel(sc,.)) %>% setNames(strings)