чтение разреженных данных в h2o с использованием svmlight

Я пытаюсь прочитать набор данных в формате SVMLight в h2o. Запись его в файл на диске и обратное чтение работает нормально, но чтение непосредственно из памяти R — нет. Я хотел бы знать, есть ли другая функция или другой способ вызова функции, которую я использовал ниже.

Вот пример R 3.3.3, h2o 3.10.3.6:

require(data.table)
require(h2o)

set.seed(1000)
tot_obs <- 100
tot_var <- 500
vars_per_obs <- round(.0*tot_var,0):round(.1*tot_var,0)

#randomly generated data
mat.dt <- do.call('rbind', lapply(1:tot_obs, function(n) {
    nvar <- sample(vars_per_obs,1)
    if(nvar>0) data.table(obs=n, var=sample(1:tot_var,nvar))[, value:=sample(10:50,.N,replace=TRUE)]
}))

event.dt <- data.table(obs=1:tot_obs)[, is_event:=sample(0:1,.N,prob=c(.9,.1),replace=TRUE)]

#SVMLight format
setorder(mat.dt, obs, var)
mat.agg.dt <- mat.dt[, .(feature=paste(paste0(var,":",value), collapse=" ")), obs]
mat.agg.dt <- merge(event.dt, mat.agg.dt, by="obs", sort=FALSE, all.x=TRUE)
mat.agg.dt[is.na(feature), feature:=""]
mat.agg.dt[, svmlight:=paste(is_event,feature)][, c("obs","is_event","feature"):=NULL]
fwrite(mat.agg.dt, file="svmlight.txt", col.names=FALSE)

#h2o
localH2o <- h2o.init(nthreads=-1, max_mem_size="4g")
h2o.no_progress()

#works
h2o.orig <- h2o.importFile("svmlight.txt", parse=TRUE)

#does NOT work
tmp <- as.h2o(mat.agg.dt)
h2o.orig.1 <- h2o.parseRaw(tmp, parse_type="SVMLight")

person ironv    schedule 27.04.2017    source источник


Ответы (1)


Простой ответ заключается в том, что у вас, вероятно, недостаточно памяти R для выполнения этого действия, поэтому одним из решений является увеличение объема памяти в R (если это вариант для вас). Это также может означать, что у вас недостаточно памяти в кластере H2O, поэтому вы также можете увеличить ее.

Единственный способ напрямую перейти из памяти R в кластер H2O — это функция as.h2o(), поэтому вы определенно используете правильную команду. Под капотом функция as.h2o() записывает кадр из памяти R на диск (хранящийся во временном файле), а затем считывает его непосредственно в кластер H2O, используя собственные функции параллельного чтения H2O.

Недавно мы добавили возможность использовать функцию чтения/записи data.table в любом месте, где мы используем базу R, поэтому, поскольку у вас установлен data.table, вам, вероятно, следует вы сможете обойти это узкое место, добавив это в начало вашего скрипта: options("h2o.use.data.table"=TRUE). Это заставит использовать data.table вместо базы R для записи на диск в первой половине процесса преобразования as.h2o(). Это должно работать для вас, поскольку он делает то же самое, что и ваш код, когда вы используете fwrite для записи на диск и h2o.importFile() для его чтения обратно.

Также вам не нужна последняя строка с h2o.parseRaw():

tmp <- as.h2o(mat.agg.dt)
h2o.orig.1 <- h2o.parseRaw(tmp, parse_type="SVMLight")

Вы можете просто сделать:

h2o.orig.1 <- as.h2o(mat.agg.dt)

Существует соответствующий пост, в котором показано, как использовать data.table для решения обратной проблемы (используя as.data.frame() вместо as.h2o()) здесь.

person Erin LeDell    schedule 27.04.2017
comment
Не думаю, что это связано с памятью. Я пробовал с 12g, и это не помогает. Код автономный... попробуйте с меньшими tot_obs и tot_var. Все та же проблема: ERROR: Unexpected HTTP Status code: 500 Server Error (url = http://localhost:54321/3/ParseSetup) water.util.DistributedException [1] "DistributedException from localhost/127.0.0.1:54321, caused by java.lang.ClassCastException: water.fvec.Vec cannot be cast to water.fvec.ByteVec" - person ironv; 28.04.2017
comment
Я попробовал другое ваше предложение options("h2o.use.data.table"=TRUE), а затем tmp <- as.h2o(mat.agg.dt). Теперь я получаю сообщение об ошибке Error in h2o.parseSetup(data, pattern = "", destination_frame, header, : length of col.names must equal to the number of columns in dataset - person ironv; 28.04.2017
comment
Вам не нужна последняя строка (я обновил свой ответ выше, чтобы уточнить это). - person Erin LeDell; 28.04.2017
comment
Я получаю сообщение об ошибке «h2o.parseSetup», когда запускаю as.h2o. Только эта линия. Не следующая строка. - person ironv; 28.04.2017
comment
Проблема в версии h2o? Нужна ли более поздняя версия? - person ironv; 28.04.2017
comment
Код (без использования data.table) у меня работает на ноутбуке с 16 ГБ ОЗУ, но я получаю ту же ошибку, что и вы, когда использую data.table. Я подал отчет об ошибке здесь: 0xdata.atlassian.net/browse/PUBDEV-4365 - person Erin LeDell; 28.04.2017
comment
Спасибо. Это также не работает с версией без data.table. Он не возвращает ошибку. Однако SVMLight не анализируется. Я получаю 1 столбец. Попробуйте запустить dim(). - person ironv; 28.04.2017
comment
Конечно, вы можете попробовать обновиться до последней версии. Я только что попробовал это на версии H2O для разработчиков, и у меня была такая же ошибка, поэтому я предполагаю, что ошибка есть и в последней стабильной версии. - person Erin LeDell; 28.04.2017
comment
Давайте продолжим это обсуждение в чате. - person Erin LeDell; 28.04.2017