如何在sparklyr中保存ML模型?

时间:2018-06-11 21:00:22

标签: r purrr sparklyr

考虑这个简单的例子,它在一些文本数据上训练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()

这里有什么问题?可以做些什么?我想尽可能避免写入磁盘。

谢谢!

1 个答案:

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