如何在 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
据我所知有两种前进方式:
- 将长、整洁、高效的数据形式上传到 H2O 中,并在 H2O 中进行重塑 "spread" 操作。
- 用 R(或任何其他语言)进行数据整形,将生成的稀疏矩阵以稀疏格式保存到磁盘,然后从那里上传到 H2O
据我所知,H2O 没有执行#1 的功能,即相当于 R 中的 tidytext::cast_sparse
或 tidyr::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。
我有规范化、整洁的 "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
据我所知有两种前进方式:
- 将长、整洁、高效的数据形式上传到 H2O 中,并在 H2O 中进行重塑 "spread" 操作。
- 用 R(或任何其他语言)进行数据整形,将生成的稀疏矩阵以稀疏格式保存到磁盘,然后从那里上传到 H2O
据我所知,H2O 没有执行#1 的功能,即相当于 R 中的 tidytext::cast_sparse
或 tidyr::spread
。它的 data munging capabilities 看起来是非常有限。但也许我错过了什么?所以我的第一个(不是很乐观)问题是 可以(以及如何)H2O "cast" 或 "spread" 数据从长格式到宽格式?.
选项 #2 与此 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。