在H2oframe中向每行添加其他数据



我正在使用一个巨大的H2OFrame(〜150GB,〜2亿行),我需要进行一些操纵。更具体地说:我必须使用框架的ip列,以找到每个IP的位置/城市名称,然后将此信息添加到每个帧的行中。

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

我的问题与这里提出的问题有点相似,我从这个问题的答案中收集的是,H2O中没有办法对每个框架行进行复杂的操作。是真的吗? H2OFrame's apply功能毕竟只接受没有自定义方法的lambda。

我想到的一个选项是将Spark/Sparkling Water用于此类数据操作,然后将火花框架转换为H2oframe以进行机器学习操作。但是,如果可能的话,我宁愿避免这种情况并仅使用H2O,尤其是由于这种转换创造的开销。

所以我想这归结为:有什么方法可以使用H2O进行这种操作?如果没有,还有其他选择可以执行此操作,而无需更改我的群集体系结构(即不必将我的H2O群集变成闪闪发光的水集群?)

是的,当与h2oframe一起使用时,您无法传递功能而不是接受lambda。例如,如果尝试通过尝试函数,您将获得以下错误显示限制:

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

您已经知道,苏打水是首先在Spark中执行所有数据的另一个选择,然后将您的数据推入ML。

如果您想坚持使用H2O,那么您的选择就是循环浏览数据框架即可处理元素。根据您的数据,以下选项可能会耗时不足,但是它并不要求您移动环境。

  • 通过仅选择您的" IP"列,并使用NA添加位置,城市和其他空列来创建新的H2O框架。
  • 循环浏览所有IP值并基于" IP",查找位置/城市,并将位置,城市和其他列值添加到现有列
  • 最终用原始的H2oframe cbind cbind cbind
  • 检查" IP"one_answers" IP0"列与100%匹配的正确合并,然后删除重复的" IP0"列之一。
  • 删除其他额外的H2oframe来保存内存

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

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

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

顺便说一句,凉爽而时尚的方法是采样100万个IP地址,在客户端上查找正确的答案以制定培训数据集,然后使用H2O来构建机器学习模型。然后,您可以使用h2o.predict()在实际数据中创建新的城市列。(不过,您将至少要将IP地址首先分为4列。)(我的直觉是一个深层的随机森林会效果最好...但是我肯定会尝试一下。)

最新更新