2

我正在处理一个巨大的H2OFrame(~150gb,~2 亿行),我需要对其进行一些操作。更具体地说:我必须使用框架的ip列来查找每个 IP 的位置/城市名称,并将此信息添加到框架的每一行。

由于框架的巨大尺寸,将框架转换为普通的 python 对象并在本地操作它不是一种选择。所以我希望我能做的是使用我的 H2O 集群city_names使用原始框架的ip列创建一个新的 H2OFrame,然后合并两个框架。

我的问题有点类似于这里提出的问题,我从这个问题的答案中收集到的是,在 H2O 中没有办法对框架的每一行进行复杂的操作。真的是这样吗?H2OFrameapply函数毕竟只接受没有自定义方法的 lambda。

我想到的一个选择是使用Spark/Sparkling Water这种数据操作,然后将 spark 帧转换为 H2OFrame 以进行机器学习操作。但是,如果可能的话,我宁愿避免这种情况,只使用 H2O,尤其是因为这种转换会产生开销。

所以我想归结为:有没有办法只使用 H2O 来进行这种操作?如果没有,是否有另一种选择可以做到这一点而无需更改我的集群架构(即不必将我的 H2O 集群变成苏打水集群?)

4

2 回答 2

1

是的,当将 apply 与 H2OFrame 一起使用时,您不能传递函数,而只能接受 lambda。例如,如果您尝试传递 tryit 函数,您将收到以下显示限制的错误:

H2OValueError: Argument `fun` (= <function tryit at 0x108d66410>) does not satisfy the condition fun.__name__ == "<lambda>"

正如您已经知道的,Sparkling Water 是另一种选择,它首先在 spark 中执行所有数据处理,然后将数据推送到 H2O 中以进行 ML。

如果您想按原样坚持使用 H2O,那么您的选择就是循环遍历数据框以按照您的方式处理元素。根据您的数据,以下选项可能会花费很少的时间,但它不会要求您移动环境。

  • 通过仅选择“ip”列创建一个新的 H2O 框架,并使用 NA 向其中添加位置、城市和其他空列。
  • 循环遍历所有 ip 值并基于“ip”,找到 location/city 并将 location、city 和其他列值添加到现有列
  • 最后将新的h2oFrame与原始 H2OFrame 绑定
  • 检查“ip”和“ip0”列是否与 100% 匹配正确合并,然后删除重复的“ip0”列之一。
  • 移除另一个额外的 H2OFrame 以节省内存
于 2017-09-21T00:32:43.240 回答
1

如果您的 ip --> city 算法是一个查找表,您可以将其创建为数据框,然后使用h2o.merge. 例如,此视频(从大约 59 分钟开始)展示了如何将天气数据合并到航空公司数据中。

对于 ip 地址,我想您可能希望先截断到前两个或三个部分。

如果您没有查找表,那么将复杂的算法转换为该查找树并执行h2o.merge,或者坚持批量下载大量数据,在客户端本地运行,上传批量是否更快变得有趣的答案,并h2o.cbind在最后做。

顺便说一句,很酷和时髦的方法是对你的 100 万个 IP 地址进行采样,在客户端上查找正确答案以制作训练数据集,然后使用 h2o 构建机器学习模型。然后,您可以使用h2o.predict()在真实数据中创建新的城市列。(不过,您至少要先将 IP 地址分成 4 列。)(我的预感是深度随机森林效果最好……但我肯定会尝试一下。)

于 2017-09-22T08:04:32.800 回答