Вывод результатов функции 'h2o' в вектор

У меня есть вопрос, похожий на этот (ссылка), за исключением того, что мой вопрос относится к java-инструменту «h2o» и его связи с «r».

В частности, я хочу назначить объект "h2o" части вектора (или структуры, или массива. Я хочу перебрать и сохранить несколько из них без необходимости вручную перечислять.

Я попробовал решение по ссылке, но оно не работает для объектов «h2o».

Вот мой более длинный код (бородавки и все такое):

#libraries
library(h2o)      #for tree control

#specify data
mydata <- iris[iris$Species!="setosa",]
mydata$Species <- as.factor(as.character(mydata$Species))

#most informative variable is petal length
x1 <- mydata$Petal.Length
x2 <- mydata$Petal.Width

#build classes
C <- matrix(0,nrow=length(x1),ncol=1)
idx1 <- which(mydata$Species == "versicolor",arr.ind=T)
idx2 <- which(mydata$Species != "versicolor",arr.ind=T)
C[idx1] <- +1
C[idx2] <- 0

#start h2o
localH2O = h2o.init(nthreads = -1)

# Run regression GBM on iris.hex data
irisPath = system.file("extdata", "iris.csv", package="h2o")
iris.hex = h2o.uploadFile(localH2O, path = irisPath)
names(iris.hex) <- c("Sepal.Length",
                     "Sepal.Width",
                     "Petal.Length",
                     "Petal.Width",
                     "Species" )

iris2 <- iris
iris2$Species <- unclass(iris$Species)
iris2.hex <- as.h2o(iris2)
iris.hex$Species <- as.factor(iris2.hex$Species)

independent <- c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width")
dependent <- "Species"

mare <- numeric()
mae <- matrix(1,nrow=10,ncol=1)

est2.h2o <- vector(mode="list", length=150)

for (i in 1:150){

     est2.h2o[[i]] <- h2o.gbm(y = dependent, 
                         x = independent, 
                         training_frame = iris.hex,
                         distribution="AUTO",
                         ntrees = i, max_depth = 3, min_rows = 2,
                         learn_rate = 0.5)


     pred <- h2o.predict(est2.h2o,newdata=iris.hex)

     err <- iris2$Species-(as.data.frame(pred)$predict+1)

     mae[i] <- mean(abs(err))
     mare[i] <- mean(abs(err)/iris2$Species)

     print(c(i,log10(mae[i])))

}

Я получаю следующую ошибку:

Error in paste0("Predictions/models/", object@model_id, "/frames/", newdata@frame_id) : 
  trying to get slot "model_id" from an object of a basic class ("list") with no slots

Мое намерение состоит в том, чтобы иметь список / структуру / массив GBM, для которого я затем могу выполнить прогнозирование для всего набора данных и отбраковать менее информативные. Я пытаюсь сделать приличный "случайный лес из gbt" по стопам Евгения Тув. У меня нет его кода.

Вопросы:
Есть ли правильный способ упаковать H2O gbm вместе с несколькими (сотнями) его приятелей в один магазин в r?

Если объект, на который указывает ссылка, выброшен в java, что делает такой подход невозможным, существует ли возможный вариант с использованием библиотеки gbm? Если мне придется использовать gbm, какова разница в скорости по сравнению с h2o?


person EngrStudent    schedule 25.11.2015    source источник
comment
Вы можете привести мне пример параметров, которые вы используете в h2o.gbm?   -  person Shape    schedule 26.11.2015
comment
пока не запускается, думаю, мне нужен ключ API. Но если вы lapply на 1: 150, вы получите свой список, тогда я считаю, что sapply(est.h2o, h2o.predict, newdata = iris.hex) должен сгенерировать data.frame, а затем вы можете выполнить оставшееся как векторные вычисления. Ошибка, которую вы получаете, связана с использованием объекта неправильного типа   -  person Shape    schedule 26.11.2015
comment
Неа. R и h2o работают вместе, но требуется rjava с 32-битной версией. У меня 64-битный процессор, но сам r 32-битный, и есть проблема с поразрядной совместимостью. Я посмотрю, смогу ли я завернуть его в сапфир.   -  person EngrStudent    schedule 26.11.2015
comment
Ну ладно, в этом есть смысл, я попробую, вода выглядит аккуратно   -  person Shape    schedule 26.11.2015
comment
Есть 2 причины, по которым мне нравится вода. 1) он будет использовать все мои ядра и большую часть моей памяти, а r - нет, что делает его значительно быстрее, и 2) другие инструменты обертывают его, например domino, amazon. (Он также работает с java, scala, r и python, но у меня он был на «r».)   -  person EngrStudent    schedule 26.11.2015


Ответы (1)


Не видя точных параметров, которые вы используете, я предполагаю, что проблема в том, что вы используете sapply, а не lapply.

sapply часто пытается упростить результат, что в большинстве случаев бывает хорошо. Но если вам нужно что-то, что может содержать любой тип объекта, тогда вам нужен список.

если мы определим paramListList как список, где каждая запись представляет собой список, содержащий ваши параметры для h2o.gbm:

Ex:

paramListList <- list(list(x = xVALUES1, 
                           y = yVALUES1, 
                           training_frame = tfVALUES1, 
                           model_id = miVALUES1, 
                           checkpoint = checkVALUES1),
                      list(x = xVALUES2, 
                           y = yVALUES2, 
                           training_frame = tfVALUES2, 
                           model_id = miVALUES2, 
                           checkpoint = checkVALUES2),
                     )

тогда вы можете сделать следующее:

lapply(paramListList, function(paramlist) do.call(h2o.gbm, paramlist))

который поместит все ваши результаты в один список

person Shape    schedule 25.11.2015