向 H2OFrame 中的每一行添加额外的数据

Adding additional data to each row in an H2OFrame

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

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

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

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

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

是的,当与 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并将位置、城市和其他列值添加到现有列
  • 最后 cbind 新的 h2oFrame 与原来的 H2OFrame
  • 检查 "ip" 和 "ip0" 列以 100% 匹配正确合并,然后删除重复的 "ip0" 列之一。
  • 删除其他额外的 H2OFrame 以节省内存

如果您的 ip --> 城市算法是查找 table,您可以将其创建为数据框,然后使用 h2o.merge。例如,this video(从第 59 分钟标记处开始)展示了如何将天气数据合并到航空公司数据中。

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

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

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