【问题标题】:Adding additional data to each row in an H2OFrame向 H2OFrame 中的每一行添加附加数据
【发布时间】:2018-03-01 05:18:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python h2o sparkling-water


    【解决方案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,那么您的选择就是循环遍历数据框以按照自己的方式处理元素。根据您的数据,以下选项可能会花费很少的时间,但它不会要求您移动环境。

    • 创建一个新的 H2O 框架,方法是仅选择您的“ip”列,然后使用 NA 向其中添加位置、城市和其他空列。
    • 遍历所有 ip 值并基于“ip”,找到 location/city 并将 location、city 和其他列值添加到现有列中
    • 终于cbind新的h2oFrame和原来的H2OFrame
    • 检查“ip”和“ip0”列是否正确合并,100% 匹配,然后删除重复的“ip0”列之一。
    • 移除另一个额外的 H2OFrame 以节省内存

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-14
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        相关资源
        最近更新 更多