首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用svmlight读取h2o中的稀疏数据

使用svmlight读取h2o中的稀疏数据
EN

Stack Overflow用户
提问于 2017-04-28 02:06:01
回答 1查看 516关注 0票数 1

我正在尝试将SVMLight格式的数据集读取到h2o中。将其写入磁盘上的文件并将其读回是正常的,但直接从R的内存中读取则不是。我想知道是否有不同的函数或调用我在下面使用的函数的不同方式。

下面是一个R 3.3.3, h2o 3.10.3.6示例

代码语言:javascript
复制
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")
EN

回答 1

Stack Overflow用户

发布于 2017-04-28 06:32:44

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

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

我们最近添加了使用data.table的读/写功能的功能,所以既然您已经安装了data.table,那么您应该能够通过将以下代码添加到脚本顶部来绕过这个瓶颈:options("h2o.use.data.table"=TRUE)。这将强制在as.h2o()转换过程的前半部分使用data.table而不是base R写入磁盘。这对您来说应该是可行的,因为它所做的事情与您的代码已经在做的事情完全相同,您使用fwrite将数据写入磁盘,使用h2o.importFile()将数据读回磁盘。

而且你也不需要h2o.parseRaw()的最后一行

代码语言:javascript
复制
tmp <- as.h2o(mat.agg.dt)
h2o.orig.1 <- h2o.parseRaw(tmp, parse_type="SVMLight")

你可以这样做:

代码语言:javascript
复制
h2o.orig.1 <- as.h2o(mat.agg.dt)

有一篇相关的文章展示了如何使用data.table来解决反向问题(使用as.data.frame()而不是as.h2o()) here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43665020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档