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

How to cast data from long to wide format in H2O?

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

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(注意,大量下载)。

为了进行分析,我需要将它放在一个矩阵中,每个文档 ID 一行,每个 wordID 一列,单元格是计数(该文档中该单词的数量)。在 R 中(例如),这可以通过 tidyr::spread 或(在这种特殊情况下,由 spread 创建的密集数据框太大)tidytext::cast_sparse 来完成,这与这个大小的数据,只要我很高兴数据留在 R 中。

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

Error in asMethod(object) : Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105

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

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

据我所知,H2O 没有执行#1 的功能,即相当于 R 中的 tidytext::cast_sparsetidyr::spread。它的 data munging capabilities 看起来是非常有限。但也许我错过了什么?所以我的第一个(不是很乐观)问题是 可以(以及如何)H2O "cast" 或 "spread" 数据从长格式到宽格式?.

选项 #2 与此 相同,接受的答案是以 SVMlight 格式保存数据。但是,我不清楚如何有效地执行此操作,也不清楚 SVMlight 格式对于不打算使用支持向量机建模的数据是否有意义(例如,数据可能仅用于无监督学习问题).如果我能以 MatrixMarket 格式保存我的稀疏矩阵会方便得多,R 中的 Matrix 包支持这种格式,但据我所知不是 H2O。 MatrixMarket 格式看起来与我原来的长数据非常相似,它基本上是一个 space-delimited 文件,看起来像 colno rowno cellvalue(有两行 header)。

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

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

要以这种格式导出 R data.frame,您可以使用此 package and there is more info here. You might be able to find better packages for this by searching "svmlight" or "libsvm" on http://rdocumentation.org

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