6

我有一个规范化、整洁的“长”数据结构中的数据,我想上传到H2O,如果可能的话,可以在单台机器上进行分析(或者有一个明确的发现,我需要比目前可用的更多的硬件和软件)。数据量大但并不庞大;可能有 7000 万行 3 列的有效归一化形式,当它被转换为稀疏矩阵(大部分单元格为零)时,可能是 30 万乘 8 万行。

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

试用数据如下,其中三列分别为“documentID”、“wordID”和“count”: 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::spreador 来完成(因为在这种特殊情况下,由创建的密集数据框spread会太大)tidytext::cast_sparse,只要我很高兴数据留在里面,它就可以很好地处理这种大小的数据R。

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

asMethod(object) 中的错误:文件 ../Core/cholmod_dense.c 中的 Cholmod 错误“问题太大”,第 105 行

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

  1. 将长、整洁、高效的数据形式上传到 H2O 中,并在 H2O 中进行重塑“传播”操作。
  2. 用 R(或任何其他语言)进行数据整形,将生成的稀疏矩阵以稀疏格式保存到磁盘,然后从那里上传到 H2O

据我所知,H2O 不具备执行#1 的功能,即相当于 R 中的tidytext::cast_sparseortidyr::spread的功能。它的数据处理能力看起来非常有限。但也许我错过了什么?所以我的第一个(不是很乐观)问题是可以(以及如何)H2O“投射”或“传播”从长格式到宽格式的数据?.

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

4

1 回答 1

5

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

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

要以这种格式导出 R data.frame,您可以使用这个包,这里有更多信息。您可以通过在http://rdocumentation.org上搜索“svmlight”“libsvm”找到更好的软件包。

h2o.importFile()然后,您可以使用函数将稀疏文件直接读入 H2O parse_type = "SVMLight"

于 2017-01-03T23:49:10.280 回答