【问题标题】:reading sparse data in h2o using svmlight使用 svmlight 在 h2o 中读取稀疏数据
【发布时间】:2017-04-28 09:59:00
【问题描述】:

我正在尝试将 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")

【问题讨论】:

    标签: r data.table h2o svmlight


    【解决方案1】:

    简单的答案是您可能没有足够的 R 内存来执行此操作,因此一种解决方案是增加 R 中的内存量(如果您愿意的话)。这也可能意味着您的 H2O 集群中没有足够的内存,因此您也可以增加它。

    直接从 R 内存到 H2O 集群的唯一方法是 as.h2o() 函数,因此您肯定使用了正确的命令。在后台,as.h2o() 函数将帧从 R 内存写入磁盘(存储在临时文件中),然后使用 H2O 的本机并行读取功能将其直接读入 H2O 集群。

    我们最近添加了在我们使用 base R 的任何地方使用 data.table 的读/写功能的能力,因此,既然您已经安装了 data.table,您应该可以通过将其添加到脚本顶部来解决这个瓶颈:options("h2o.use.data.table"=TRUE)。这将强制使用 data.table 而不是 base 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()here

    【讨论】:

    • 我认为这与内存无关。我试过“12g”,但没有帮助。代码是独立的...尝试使用较小的tot_obstot_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"
    • 我尝试了您的其他建议options("h2o.use.data.table"=TRUE),然后tmp &lt;- 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
    • 你不需要最后一行(我已经更新了上面的答案以澄清这一点)。
    • 运行 as.h2o 时出现“h2o.parseSetup”错误。就这一行。不是下一行。
    • 是 h2o 版本的问题吗?是否需要更高版本?
    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2013-08-19
    • 2015-08-23
    • 1970-01-01
    • 2015-12-26
    • 2020-12-01
    相关资源
    最近更新 更多