我正在使用一个巨大的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列。)(我的直觉是一个深层的随机森林会效果最好...但是我肯定会尝试一下。)