如何在嵌套数据框上训练多个 h2o 模型?

How to train multiple h2o models on a nested data frame?

我想知道是否有一种方便的方法可以从 R 中的嵌套数据帧训练多个 h2o 模型。 假设,我们有一个具有以下结构的数据集,我想为每个物种训练一个模型:

dataset(iris)
iris_nested<-iris%>%
  dplyr::mutate(dataset=dplyr::if_else(sample(1:nrow(iris))<100,"train","val"))%>%
  dplyr::group_by(Species,dataset)%>%
  tidyr::nest()%>%
  tidyr::pivot_wider(names_from = dataset,values_from = data)

有没有一种方法可以在不构建循环来分解嵌套列表的情况下将数据集加载到 h2o 中并使用它?我想避免为每一行创建 h2o 对象的步骤。

编辑: 例如,要用其他数字输入预测 Sepal.Length,我会为第 i 行训练一个模型:

library(h2o)
h2o.init()   
h2o_train<-as.h2o(iris_nested[["train"]][[i]])
h2o_val<-as.h2o(iris_nested[["val"]][[i]])

h2o_trainedmodel <- h2o.automl(
  x = c("Sepal.Width","Petal.Length","Petal.Width"), 
  y = "Sepal.Length",
  training_frame = h2o_train,
  leaderboard_frame = h2o_val,
  project_name = "run1")

之后,提取并保存训练好的模型,并生成一个映射table,这样我就知道哪个模型属于哪个物种了。

有了 purrr,你可以将它嵌入到 tibble 中,但是如果你想做预测,你可能需要使用 map2,比我想的要复杂一些:

library(dplyr)
library(h2o)
library(purrr)

iris%>%
dplyr::mutate(dataset=dplyr::if_else(sample(1:nrow(iris))<100,"train","val"))%>%
dplyr::group_by(Species,dataset)%>%
tidyr::nest()%>%
tidyr::pivot_wider(names_from = dataset,values_from = data) %>%
mutate(model=map(train,~h2o.randomForest(y="Sepal.Width",
x=c("Sepal.Length","Petal.Width","Petal.Length"),training_frame=as.h2o(.x))))