如何在H2O中将数据从长格式转换为宽格式?

时间:2016-12-27 06:26:32

标签: sparse-matrix reshape tidyr h2o tidytext

我的数据是标准化的,整洁的" long"数据结构我想上传到H2O,如果可能的话,在一台机器上进行分析(或者有一个明确的发现,我需要比现有的硬件和软件更多的硬件和软件)。数据很大但不是很大;当它被投入稀疏矩阵(绝大多数单元为零)时,可能有7千万行3列的有效归一化形式,300k乘80k。

H2O中的分析工具需要采用后者,广泛的格式。总体动机的一部分是看到各种硬件设置的限制在分析这些数据的位置,但目前我只是努力将数据放入H2O集群(在R可以将其全部保存在一台机器上) RAM)因此无法对分析的大小限制做出判断。

试用数据如下所示,其中三列是" documentID"," wordID"和"计算": 1 61 2 1 76 1 1 89 1 1 211 1 1 296 1 1 335 1 1 404 1

这并不重要 - 因为这对我来说甚至不是真实的数据集,只是一个测试集 - 这个测试数据来自https://archive.ics.uci.edu/ml/machine-learning-databases/bag-of-words/docword.nytimes.txt.gz(谨慎,大量下载)。

要进行分析,我需要在矩阵中为每个documentID添加一行,每个wordID为一列,单元格为计数(该文档中该单词的编号)。在R(例如)中,可以使用tidyr::spread或(在此特定情况下由spread创建的密集数据框太大)tidytext::cast_sparse来完成,这可以正常工作这个大小的数据,只要我对数据留在R中感到高兴。

现在,最新版本的H2O(可从h2o.ai获得但尚未在CRAN上)具有R函数as.h2o,它可以理解稀疏矩阵,这适用于较小但仍然非平凡的数据(例如,在3500行×7000列的测试用例中,当密集版本需要22秒时,它会在3秒内导入稀疏矩阵),但是当它获得我的300,000 x 80,000稀疏矩阵时,它会因此错误消息而崩溃:

  

asMethod(object)出错:     Cholmod错误'问题太大'在文件../Core/cholmod_dense.c,第105行

据我所知,前进有两种方法:

  1. 将一个长而整齐,高效的数据形式上传到H2O中并进行重塑"传播"在H2O中运作。
  2. 以R(或任何其他语言)进行数据整形,以稀疏格式将生成的稀疏矩阵保存到磁盘,然后从那里上传到H2O
  3. 据我所知,H2O没有做#1的功能,即相当于R中的tidytext::cast_sparsetidyr::spreaddata munging capabilities看来是非常有限。但也许我错过了什么?所以我的第一个(不是很乐观)的问题是可以(以及如何)H2O" cast"或"传播"数据从长到宽格式?

    选项#2与此older question相同,其中接受的答案是以SVMlight格式保存数据。但是,我不清楚如何有效地做到这一点,并且不清楚SVMlight格式对于不打算用支持向量机建模的数据是有意义的(例如,数据可能只是为了无人监督的学习问题)。如果我可以将我的稀疏矩阵保存在MatrixMarket格式中会更方便,这种格式由R中的Matrix包支持,但据我所知,H2O并不是这样。 MatrixMarket格式看起来与我原来的长数据非常相似,它基本上是一个空格分隔的文件,看起来像colno rowno cellvalue(带有两行标题)。

1 个答案:

答案 0 :(得分:4)

我认为#2是你现在最好的选择,因为我们目前还没有在H2O中做到这一点的功能。我认为这将是一个有用的实用程序,因此为它创建了一个JIRA票证here。我不知道什么时候会开始工作,所以我仍然建议暂时编码#2。

SVMLight / LIBSVM格式最初是为特定的SVM实现而开发的(顾名思义),但它是通用的,并不完全特定于SVM。如果您没有标记数据,那么您可以在需要标签的地方填写虚拟值。

要以此格式导出R data.frame,您可以使用此package,还有更多信息here。您可以通过在"svmlight"上搜索"libsvm"http://rdocumentation.org来找到更好的套餐。

然后,您可以使用带有h2o.importFile()的{​​{1}}函数将稀疏文件直接读入H2O。