23、H2O 数据处理、安装、集群搭建及算法应用全解析

H2O 数据处理、安装、集群搭建及算法应用全解析

1. 数据处理策略

在处理数据时,尤其是涉及缺失值,需要采取合适的策略。以生日数据为例,如果营销部门想给客户发送生日贺卡,“跳过”是一个选择;若要基于此数据构建模型,“移除列”可能是最佳选择。不过,也可以将未知生日作为一个分类级别保留,但这可能会使模型运行变慢且无明显优势。此外,开展营销活动询问客户生日,或者从其他数据库获取有用的预测信息(如某人 Facebook 动态中某一天朋友帖子数量明显增多)也是可行的办法。

对于响应变量中的缺失数据,应直接移除相应的行,H2O 监督算法会自动处理这一情况。在进行数据插补时,务必保留原始数据,不要直接覆盖原始数据,因为未来可能会有更好的处理方法,政府法规也可能有不同要求,而且今天的预测变量可能成为明天的响应变量。

2. 获取最新文档与信息

H2O 有完善的文档,http://docs.h2o.ai 是获取信息的首要途径,最新用户指南可在 http://docs.h2o.ai/h2o/latest-stable/h2o-docs/index.html 找到。若想查看 GBM 是否添加了新参数,可前往 REST API 参考文档查找 GBMParametersV3,也可定期查看 GitHub 上的 Changes.md 文件。若想了解 GBM 在 Java 中的实现,可从 Java 文档入手,找到 “hex.tree.gbm” 再到 “GBM”,对应的代码在 GitHub 上。随机森林在 REST 端点中称为 DRF,在 Java 源码中为 hex.tree.drf,其他名称大多符合预期。

3. 安装最新版本

对于大多数人来说,按照之前章节介绍的从包安装 H2O(如使用 R 的 CRAN 或 Python 的 pip)就足够了。但安装最新稳定版甚至最新前沿版本也并不困难。由于最新版本没有像 “stable” 和 “nightly” 这样的便捷别名,需前往 H2O 下载页面,点击最新稳定版的链接,然后按照 R 或 Python 的安装说明进行操作。也可以直接访问 H2O R 下载页面或 H2O Python 下载页面获取安装指导。

4. 从源代码构建

有些人可能需要从源代码编译 H2O,虽然这比直接安装多了一些依赖项,但并非难事,且针对不同平台(包括 Hadoop)都有相应的说明。

5. 从命令行运行

在之前的使用中,我们通常让 R 或 Python 客户端启动 H2O,这是最简单的方式,还能确保版本兼容。但如果客户端发现 H2O 已在运行,会自动连接。单独从命令行启动 H2O 有一定优势,主要是稳定性方面。当关闭客户端时,客户端会同时关闭 H2O,若只使用一个客户端且不需要在客户端关闭时 H2O 仍运行,这没问题;否则会有问题。

以下是在本地 IP 地址和默认端口以 3GB 内存启动 H2O 的示例:

java -Xmx3g -jar /path/to/h2o.jar

若需要获取当前所有命令行选项的帮助,可使用:

java -jar /path/to/h2o.jar --help

启动的 H2O 版本必须与安装的客户端版本一致。如果需要向 S3 或 HDFS 传递认证信息,可按以下方式指定 “core-site.xml”:

java -jar h2o.jar -hdfs_config core-site.xml

若要选择不参与 H2O 调用 Google Analytics 记录版本使用情况,除了在主目录创建 .h2o_no_collect 文件外,还可使用命令行参数 -ga_opt_out:

java -Xmx3g -jar /path/to/h2o.jar -ga_opt_out

6. H2O 集群

6.1 集群限制

H2O 集群在设计时考虑了集群应用,但也存在一些限制:
- 集群中的每个 H2O 节点必须大小相同。例如,如果集群中最小的机器有 3GB 可用内存,那么每个节点都应分配 3GB,即使有些节点有 64GB 内存。
- 集群启动后不能添加新的机器。
- 若任何一台机器出现故障,整个集群必须重建,不支持高可用性。
- 每个节点必须运行相同版本的 h2o.jar,若使用 R 客户端控制集群,客户端的 API 版本也必须与 h2o.jar 一致。
- 节点应在物理上靠近,以减少网络延迟。

基于以上原因,建议使用少量大节点而非大量小节点。对于需要数小时才能创建的模型,可使用定期检查点和模型保存功能。

6.2 集群创建方式

H2O 集群可以通过以下两种方式创建:
- Flatfile :这是一个简单的文本文件,包含集群中每个节点的 IP 地址和端口。需要在每台机器上准备相同的文件,并在启动 h2o.jar 时使用 -flatfile myfile.txt 指定该文件。
- Auto-discovery :在启动 h2o.jar 时指定 -network 192.168.1.0/24,H2O 会在该子网中搜索所有节点并将它们组成一个集群。这种方式比 Flatfile 慢,但无需提前在每个节点创建并上传文件。

还可以为集群命名,并在每个节点启动时指定该名称,这在同一子网中运行多个集群时非常必要。启动所有节点的时间有限,否则第一个节点会报错并关闭。一旦有客户端(R、Python、Flow)连接到集群中的任何节点,集群将锁定,无法再添加新节点。连接集群时,只需使用 h2o.init() 并提供任何节点的 IP 地址即可。虽然集群中没有主节点,所有节点都是平等的,但在导入或导出数据或模型时,集群状态中列出的第一个节点有时具有特殊地位,建议在使用本地文件系统进行导入或导出时连接到第一个节点,以避免混淆。导入数据时,数据必须对集群中的所有节点可见,通常意味着每个节点都要有一份相同位置的副本,使用 S3 或 HDFS 会更方便,也可以在有数据的节点上运行 R 或 Python 客户端,使用上传文件而非导入文件的方式。

6.3 在不同环境中搭建集群

  • EC2 :在 Amazon EC2 机器上搭建 H2O 集群相对容易,有预定义的脚本。这些脚本依赖 Python/boto,但仅用于运行 AWS 命令。如果已经有其他语言的脚本用于设置 AWS 服务器,可以借鉴这些脚本并集成到现有代码中。集群中每台机器的端口 54321 可访问 Flow UI,可从脚本输出或 EC2 管理控制台提取全局 DNS 名称。每台机器还预装了 RStudio,可在端口 8787 访问。脚本实现的步骤如下:
    1. 启动一组 EC2 实例并记录其 IP 地址。
    2. 当所有实例都运行后,将相关信息和 h2o.jar 传输到每个节点。
    3. 在每个节点启动 h2o.jar。
      步骤 2 和 3 使用 SSH 进行。建议创建一个名为 “for_h2o” 的安全组,允许 TCP 端口 22、8787、54321 和 54322 以及 UDP 端口 54321 和 54322 的入站连接,然后在 h2o-cluster-launch-instances.py 中设置 “securityGroupName” 为 ‘for_h2o’。
  • 其他云提供商 :Azure、Google、Rackspace、Digital Ocean 等云提供商没有现成的脚本,但 H2O 可以在这些平台上运行。如果熟悉这些平台的 API 脚本编写,可借鉴 EC2 脚本进行修改。
  • Hadoop :在 Hadoop 上运行 H2O 与常规设置类似,需前往 H2O 下载页面,选择最新稳定版,点击 “Install on Hadoop” 标签,按照说明获取并安装适合特定 Hadoop 设置的版本。之后使用 hadoop jar h2odriver.jar 代替 java h2o.jar(有额外参数,可查看相关链接获取最新信息)。之后可以像使用本地版本一样使用 Flow 或通过 R 或 Python 客户端连接 H2O,数据可从 HDFS 加载。

6.4 集群创建流程 mermaid 图

graph LR
    A[选择集群创建方式] --> B{Flatfile}
    A --> C{Auto - discovery}
    B --> D[准备相同的文本文件]
    D --> E[启动 h2o.jar 并指定文件]
    C --> F[启动 h2o.jar 时指定子网]
    E --> G[为集群命名并启动节点]
    F --> G
    G --> H[等待节点启动]
    H --> I{客户端连接}
    I --> J[集群锁定]

6.5 不同环境搭建集群对比表格

环境 搭建方式 优势 注意事项
EC2 使用预定义脚本 搭建相对容易 需要创建安全组,依赖 Python/boto
其他云提供商 借鉴 EC2 脚本修改 可在多平台运行 无现成脚本,需熟悉 API 脚本编写
Hadoop 按特定说明安装 与 Hadoop 集成 有额外参数,需注意版本适配

7. Spark / Sparkling Water

在大数据分析领域,Spark 和 H2O 都是内存计算的有力工具,它们各有优势。Spark 在数据准备和数据处理步骤上表现出色,而 H2O 的算法运行速度较快。“Sparkling Water” 则提供了一种让两者紧密合作的方式,能让用户充分发挥它们的优势。目前有适用于 Spark 2.0、1.6、1.5、1.4 和 1.3 的版本。

Sparkling Water 作为常规的 Spark 应用程序运行,使用 Scala 调用 H2O 函数。当数据进入 H2O 数据框后,可以通过 asRDD() 或 asDataFrame() 函数与 Spark 函数共享数据,而无需进行内存复制。若想了解更多关于 Sparkling Water 的信息,可参考 http://docs.h2o.ai 或直接访问 http://bit.ly/2g2zfJg 上的手册,以及 GitHub 上的示例目录。

8. 朴素贝叶斯算法

朴素贝叶斯是一种监督式机器学习算法,它的应用场景相对有限,主要用于二项式和多项式分类,且参数较少。不过,它常与自然语言处理(NLP)应用相关,如垃圾邮件识别或情感分析。下面是一个使用朴素贝叶斯算法处理鸢尾花数据集的 R 代码示例:

library(h2o)
h2o.init(nthreads = -1)
datasets <- "https://raw.githubusercontent.com/DarrenCook/h2o/bk/datasets/"
data <- h2o.importFile(paste0(datasets, "iris_wheader.csv"))
y <- "class"
x <- setdiff(names(data), y)
parts <- h2o.splitFrame(data, 0.8)
train <- parts[[1]]
test <- parts[[2]]
m <- h2o.naiveBayes(x, y, train)
p <- h2o.predict(m, test)

这个示例取得了与之前使用深度学习算法相同的成绩(30 个样本中正确预测 28 个),说明朴素贝叶斯算法并非仅适用于 NLP 应用。若想进一步了解该算法,可查阅 API 文档,它在 R、Python 和 Flow 中均有支持。

9. 集成算法

9.1 集成算法原理

集成算法的基本思想类似于组建一个团队参加知识竞赛。一个团队中多个算法共同决策最终答案,比单个算法更能平衡各自的弱点和疏忽,且算法之间的差异越大,效果越好。

9.2 决策要点

决定使用集成算法后,需要做出三个主要决策:
- 是否使用库或自行实现 :H2O 有一个集成包,但需要单独安装,目前仅支持 R。
- 选择成员模型 :可以为每个算法训练最佳模型,也可以通过随机网格搜索在广泛的参数范围内选择具有不同模型参数的最佳几个模型。例如,两个深度学习算法具有不同的网络布局(如一个是 (200,200) 隐藏层,另一个是 (50,40,40,40)),它们可能是有用的集成成员。
- 结果组合方式 :可以借鉴随机森林的方法,回归问题使用平均值,分类问题使用最常见的结果;也可以使用本书介绍的任何监督学习算法,根据每个成员模型的输出决定集成的输出。

9.3 堆叠集成示例

以 H2O 的 h2o.ensemble() 集成包为例,目前它仅支持回归和二项式分类。下面是一个应用于建筑能源数据集(回归问题)的示例:

library(h2oEnsemble)
source("load.building_energy.R")
RFd <- h2o.randomForest(x, y, train, model_id="RF_defaults", nfolds=10,
                        fold_assignment = "Modulo", keep_cross_validation_predictions = T)
GBMd <- h2o.gbm(x, y, train, model_id="GBM_defaults", nfolds=10,
                fold_assignment = "Modulo", keep_cross_validation_predictions = T)
GLMd <- h2o.glm(x, y, train, model_id="GLM_defaults", nfolds=10,
                fold_assignment = "Modulo", keep_cross_validation_predictions = T)
DLd <- h2o.deeplearning(x, y, train, model_id="DL_defaults", nfolds=10,
                        fold_assignment = "Modulo", keep_cross_validation_predictions = T)
models <- c(RFd, GBMd, GLMd, DLd)
m_stack <- h2o.stack(models, response_frame = train[,y])
h2o.ensemble_performance(m_stack, test)

以上代码先准备模型(默认设置,但需满足集成所需的交叉验证设置),将它们放入列表对象,然后调用 h2o.stack 并指定包含正确答案的单列 H2O 框架。最后调用 h2o.ensemble_performance 评估在测试数据上的表现。结果显示,最初的集成效果略逊于最佳单个模型,但使用最佳模型和相近强度的模型组成的集成(如随机森林和 GBM)有轻微改进。

9.4 集成算法流程 mermaid 图

graph LR
    A[确定使用集成算法] --> B[做出三个决策]
    B --> C[选择成员模型]
    B --> D[确定结果组合方式]
    B --> E[选择使用库或自行实现]
    C --> F[训练成员模型]
    F --> G[组合模型结果]
    G --> H[评估集成效果]

9.5 不同决策选择对比表格

决策要点 选择方式 特点
成员模型选择 训练最佳模型 基于每个算法的最优设置
随机网格搜索 选择具有不同参数的模型,增加多样性
结果组合方式 借鉴随机森林 回归用平均,分类用多数
使用监督学习算法 灵活根据输出决定集成结果
使用库或自行实现 使用 H2O 集成包 仅支持 R,需单独安装
自行实现 可根据需求定制

综上所述,H2O 在数据处理、集群搭建、与其他工具集成以及多种算法应用方面都有丰富的功能和特点。通过合理运用这些技术和方法,可以更高效地进行大数据分析和模型构建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值