- 机器学习
- 深度学习
- AutoML
- 大数据
- 后端
【免费下载链接】h2o-3
H2O is an Open Source, Distributed, Fast & Scalable Machine Learning Platform: Deep Learning, Gradient Boosting (GBM) & XGBoost, Random Forest, Generalized Linear Modeling (GLM with Elastic Net), K-Means, PCA, Generalized Additive Models (GAM), RuleFit, Support Vector Machine (SVM), Stacked Ensembles, Automatic Machine Learning (AutoML), etc.
导读
本文围绕 H2O 3 开源仓库中的 Python 客户端 FAQ 文档(h2o-docs/src/product/faq/python.rst)展开,系统讲解 H2O Python 客户端(h2o-py)在使用中最常遇到的五类问题:Python 环境与包依赖的安装排错、数据导入时如何精确控制列数据类型、如何通过varimp()查看变量重要性、如何把评分历史(scoring history)接入 Pandas/Matplotlib 做自定义可视化,以及如何用H2OGridSearch完成网格搜索和早停。文中所有 API 均以当前仓库h2o-py/源码实现为准,并给出关键源码路径供读者深入追溯,读完即可在真实项目中直接套用这些可复制的 Python 代码。
一、Python 环境准备与 H2O 包安装排错
1.1 依赖安装失败的标准处理流程
FAQ 中首先记录了一个高频问题:在安装 H2O 前执行pip install scikit-learn失败时如何解决。文档给出了按顺序执行的依赖安装命令(必要时在命令前加sudo):
easy_install pip pip install numpy brew install gcc pip install scipy pip install scikit-learn这套顺序的设计逻辑是:先用easy_install确保pip存在,然后按依赖层级自底向上安装——numpy是scipy与scikit-learn的底层数值库,scipy又是scikit-learn的依赖,而gcc则是 macOS(OSX)上编译原生扩展所需。H2O 的 Python 客户端本身由纯 Python 编写(见 h2o-py/h2o/init.py),但它与 pandas、numpy、scipy 等生态库协同工作,因此这些第三方依赖的完整性直接影响 H2O 的使用体验。
1.2 macOS 上的 Python 版本选择
FAQ 特别提醒:如果上述命令在 OSX 上仍然报错,很可能是系统自带的默认 Python 版本导致。文档推荐安装 Homebrew 版本的 Python:
brew install python这是因为系统自带 Python 往往版本较旧,且对 pip 包路径、动态库的管理与 Homebrew 版本不同,容易引发权限或编译问题。使用 Homebrew 的 Python 后再重新执行 1.1 中的依赖安装,可显著减少此类错误。
1.3 H2O Python 依赖包完整清单
FAQ 文档列出了一份“与 H2O 相关的完整 Python 包(含依赖)”清单,用于排查缺失包导致的错误:
griptabulatewheelejsonliteipythonnumpyscipypandas-U gensimjupyter-U PILnltkbeautifulsoup4
其中带-U前缀的条目(-U gensim、-U PIL)表示执行pip install -U gensim这类"升级到最新版"的安装方式。ipython/jupyter是交互式 Notebook 环境,pandas是数据框接口与绘图的基础(见本文第四节),PIL用于图像处理,nltk/beautifulsoup4则服务于文本类数据场景。当前仓库对 Python 侧运行要求的具体说明可参考 h2o-py/README.md 与 h2o-py/requirements.txt。
1.4pip安装 H2O 报egg_info/bdist_wheel错误
FAQ 记录了一个典型报错场景:从h2o-release.s3.amazonaws.com下载h2o-<version>-py2.py3-none-any.whl时,pip执行setup.py egg_info阶段抛出:
IOError: [Errno 2] No such file or directory: '/tmp/pip-nTu3HK-build/setup.py' Command python setup.py egg_info failed with error code 1 in /tmp/pip-nTu3HK-build文档明确指出根因:Python 不会自动更新已安装的包,必须手动升级;同时 H2O 的包分发方式已从distutils迁移到wheel。因此当出现bdist_wheel或eggs相关错误时,应按以下完整流程先升级 pip 工具链:
# 1. 获取最新版 setuptools(用于引导旧环境) wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python # 2. Ubuntu 上安装 pip(若已有 pip 可跳过) sudo apt-get install python-pip # 3. 升级 pip 到最新版 pip install pip --upgrade # 4. 开启新 shell,确保新的 /usr/local/bin 路径生效 bash # 5. 强制重装 pip,确认无残留错误 pip install pip --upgrade --force-reinstall # 6. 升级 distribute(注意不要加 --force-reinstall,会引发问题) pip install distribute --upgrade # 7. 检查工具链版本 pip list | egrep '(distribute|pip|setuptools)' # distribute (0.7.3) # pip (7.0.3) # setuptools (17.0) # 8. 强制重装 wheel 包 pip install wheel --upgrade --force-reinstallFAQ 给出的参考版本为distribute 0.7.3 / pip 7.0.3 / setuptools 17.0,这是该 FAQ 写作时的示例输出;在当前时代,更稳妥的做法是用python -m pip install --upgrade pip setuptools wheel保证工具链为最新版本,思路完全一致——即先升级打包工具链,再安装 H2O wheel 包。
1.5 升级后的启动验证与两种启动方式
完成上述流程后,回到 Python 中执行h2o.init()即可启动 H2O。FAQ 特别给出两条使用注意:
- 用
gradlew自行构建 jar 的情况:需要先手动启动 jar,再执行h2o.init()。当前仓库中gradlew位于仓库根目录(gradlew,配套配置见 gradle.properties 与 settings.gradle)。 - 直接下载官方 jar 和 H2O 包的情况:
h2o.init()会自动拉起后端 Java 进程,像 R 客户端一样即连即用,无需手动启动 jar。
二、在 Python 中控制列数据类型
2.1 等效于 R 的as.factor():使用.asfactor()
FAQ 的第一个数据操作问题是:"如何把某个值指定为 enum(枚举/类别型)?Python 中有没有 R 的as.factor()的等价物?"答案非常直接:使用.asfactor()。
在源码层面,该方法定义于 h2o-py/h2o/frame.py 的H2OFrame.asfactor():它先对int、string等来源列做类型校验,随后通过ExprNode("as.factor", self)构造表达式节点,将结果列的缓存类型全部标记为"enum"。也就是说,asfactor()并不是在本地 Python 侧改数据,而是把as.factor这个数据变换推送到 H2O 后端分布式执行,返回一个新的 H2OFrame。其典型用法如下:
# 单列转类别型 df['cylinders'] = df['cylinders'].asfactor() # 多列同时转类别型 df[['cylinders', 'economy_20mpg']] = df[['cylinders', 'economy_20mpg']].asfactor()需要留意的是,源码中的asfactor()对类型有校验:只有int、string类型的列才能转换为 enum,若传入bool或已是enum之外的其他类型会抛出H2OValueError。另外 FAQ 中h2o.import_file(...)里用到的col_types={"CAPSULE":"enum"}是"导入时指定类型"的快捷方式(见 2.2),与导入后调用.asfactor()是两种互补的路线。
2.2 导入时指定数据类型:三种方案对比
FAQ 以 prostate.csv 为例(把第二列CAPSULE指定为类别型),给出了三种等价方案,这里逐一补充说明:
方案一:按列名到类型的字典指定
fr = h2o.import_file( "http://s3.amazonaws.com/h2o-public-test-data/smalldata/logreg/prostate.csv", col_types={"CAPSULE": "enum"}, ) fr.describe()import_file()定义于 h2o-py/h2o/h2o.py。从源码可见,col_types支持"列名到类型"的字典,也支持"类型列表",合法取值包括"unknown"、"uuid"、"string"、"float"、"int"、"numeric"、"categorical"、"factor"、"enum"、"time"等。"enum"即强制解析为类别型列。
方案二:按列顺序的类型列表
c_types = [None] * 9 # prostate.csv 共 9 列 c_types[1] = "enum" # 只指定第 2 列为类别型,其余为 None(由解析器自动猜测) fr = h2o.import_file( "http://s3.amazonaws.com/h2o-public-test-data/smalldata/logreg/prostate.csv", col_types=c_types, ) fr.describe()源码中col_types的类型断言为[coltype](类型列表)或{str: coltype}(字典),列表中元素为None时该列类型由后端解析器自动猜测,非常适合"只锁定少数几列、其余交给自动类型推断"的场景。
方案三:parse_setup()+parse_raw()两段式解析(先预览、后修正、再解析)
# 第一步:只导入不解析,拿到原始文件句柄 fraw = h2o.import_file( "http://s3.amazonaws.com/h2o-public-test-data/smalldata/logreg/prostate.csv", parse=False, ) # 第二步:让后端给出结构猜测 fsetup = h2o.parse_setup(fraw) # 第三步:人工修正第二列类型 fsetup["column_types"][1] = '"enum"' # 第四步:按修正后的配置真正执行解析 fr = h2o.parse_raw(fsetup) fr.describe()方案三是三者的"完全控制"版本,底层对应关系清晰:import_file(..., parse=False)只做惰性导入(源码中对应lazy_import路径),parse_setup()调用后端"获取解析设置"接口,返回一个包含column_types、separator、header等猜测结果的字典(h2o-py/h2o/h2o.py 中parse_setup的 docstring 明确说明"允许用户通过修改返回的字典来纠偏,再交给parse_raw生成 H2OFrame");parse_raw(setup)则按该字典执行解析,并可通过id=指定目标 frame 名、first_line_is_header=覆盖表头行为(取值-1/0/1)。
从仓库测试目录(如 h2o-py/tests/testdir_munging)可以看到大量针对col_types、asfactor的用例,印证这三种方案都是官方支持且长期维护的数据类型控制手段。
三、查看变量重要性:model.varimp()
FAQ 给出查看变量重要性的方法:model.varimp(use_pandas=False)。示例中训练了一个 GBM 模型并取变量重要性:
model = h2o.estimators.H2OGradientBoostingEstimator(seed=1111) model.train(y="IsDepDelayed", x=["Month"], training_frame=airlines) vi = model.varimp(use_pandas=False) # Out[26]: # [('Month', 69.27436828613281, 1.0, 1.0)]返回结构为列表的列表/元组序列,每个元素包含四列信息(与后端variable_importances表的列头对应):特征名、相对重要性、缩放重要性、百分比贡献。
源码实现位于 h2o-py/h2o/model/model_base.py 的ModelBase.varimp():它从模型 JSON 输出中读取variable_importances表(model["variable_importances"].cell_values与.col_header),当use_pandas=True且环境可用的 pandas 时,包装成 pandas DataFrame 返回;否则返回原始列表。若模型没有变量重要性(例如某些不产出该表的算法),会打印 "This model doesn't have variable importances" 警告。网格搜索对象H2OGridSearch也提供了同名方法(h2o-py/h2o/grid/grid_search.py),返回{model_id: 变量重要性}字典,方便一次性对比网格内所有模型的变量重要性。
需要补充的是,对于回归类等不直接产出变量重要性的场景,也可以参考同一文件中的permutation_importance(frame, metric="AUTO", n_samples=10000, n_repeats=1, ...)(排列重要性),它通过对特征做排列扰动评估重要度,是对varimp()的补充手段。
四、在 H2O 之外用第三方库绘制指标曲线
4.1 背景:Flow 中指标的可获取性
FAQ 解释了一个架构事实:Flow 中的图表由 H2O UI 通过 REST 命令生成,但后端为每个模型计算并存储了全部指标,因此 Python 客户端可以取回这些数据,再借助 Pandas 或 Matplotlib 等第三方库绘图。
4.2 以 logloss 曲线为例的完整代码
FAQ 给出的示例演示了如何绘制 GBM 训练/验证 logloss 随树数量变化的曲线:
import pandas as pd import matplotlib.pyplot as plt %matplotlib inline scoring_history = pd.DataFrame(model.score_history()) scoring_history.plot(x='number_of_trees', y=['validation_logloss', 'training_logloss'])代码中的model.score_history()是获取评分历史的入口。当前仓库中该方法已在 h2o-py/h2o/model/model_base.py 被标记为DEPRECATED,官方推荐改用model.scoring_history(as_data_frame=True):当as_data_frame=True时直接返回 pandas DataFrame,False时返回原始H2OTwoDimTable。as_data_frame()由 h2o-py/h2o/two_dim_table.py 中的H2OTwoDimTable提供。因此现代写法为:
scoring_history = model.scoring_history() # 默认 as_data_frame=True,直接得到 DataFrame scoring_history.plot(x='number_of_trees', y=['validation_logloss', 'training_logloss'])评分历史中常见的列包括number_of_trees(GBM/DRF 的迭代轮数)、training_logloss、validation_logloss、training_rmse、validation_rmse、training_auc等,可以按需选取任意两条或多条指标绘制对比曲线。FAQ 还提示 Pandas 的绘图 API 基于 Matplotlib,功能简化但足够常用;需要更精细控制(坐标轴、图例、样式)时可直接改用matplotlib.pyplot.plot()读取 DataFrame 的列。
五、PySparkling:网格搜索与早停
5.1 PySparkling 是什么
FAQ 明确说明:PySparkling 对 H2O 数据框上的所有操作,最终都调用 H2O Python 函数,因此只要 H2O Python 版本在 3.6.0.3 或以上,PySparkling 里就能使用 H2O Python 的全部功能。也就是说,下面演示的H2OGridSearch、早停参数在 PySparkling 环境与原生h2o-py环境中用法一致。在 IPython Notebook 中,可以通过H2OGridSearch?查看函数帮助。
5.2 PySparkling 中的网格搜索示例
FAQ 以鸢尾花(iris)数据为例,对 GBM 的ntrees、max_depth、learn_rate做笛卡尔网格搜索:
from h2o.grid.grid_search import H2OGridSearch from h2o.estimators.gbm import H2OGradientBoostingEstimator iris = h2o.import_file("http://s3.amazonaws.com/h2o-public-test-data/smalldata/iris/iris.csv") ntrees_opt = [5, 10, 15] max_depth_opt = [2, 3, 4] learn_rate_opt = [0.1, 0.2] hyper_parameters = { "ntrees": ntrees_opt, "max_depth": max_depth_opt, "learn_rate": learn_rate_opt, } gs = H2OGridSearch(H2OGradientBoostingEstimator(distribution='multinomial'), hyper_parameters) gs.train(x=range(0, iris.ncol - 1), y=iris.ncol - 1, training_frame=iris, nfold=10) # gs.show print(gs.sort_by('logloss', increasing=True))这里的hyper_parameters字典是网格搜索的核心输入。从 h2o-py/h2o/grid/grid_search.py 的H2OGridSearch.__init__源码可以看到完整的构造签名:
H2OGridSearch(model, hyper_params, grid_id=None, search_criteria=None, export_checkpoints_dir=None, recovery_dir=None, parallelism=1)model:算法估计器实例(如H2OGradientBoostingEstimator(...)),其中固定的参数会在所有网格模型中保持不变;hyper_params:{参数名: [候选值列表]}字典;search_criteria:控制搜索空间的字典,支持strategy(默认"Cartesian"穷举全部组合;"RandomDiscrete"则随机搜索)、max_models、max_runtime_secs、stopping_metric、stopping_tolerance、stopping_rounds、seed;parallelism:网格构建的并行度,1表示串行构建(默认),0表示由 H2O 自适应决定,大于 1 表示并行构建的模型数量。
FAQ 示例中的print(gs.sort_by('logloss', increasing=True))用于按 logloss 升序展示网格结果。需要注意sort_by()在源码中已标记为deprecated("use grid.get_grid() instead"),官方推荐改用gs.get_grid(sort_by='logloss', decreasing=False)。get_grid()(h2o-py/h2o/grid/grid_search.py)通过调用GET /99/Grids/<id>REST 接口按指定指标重新排序模型,可排序的指标包括"logloss"、"residual_deviance"、"mse"、"auc"、"r2"、"accuracy"、"precision"、"recall"、"f1"等。另有gs.show_summary()展示网格汇总。
5.3 PySparkling 中的早停示例
FAQ 的第二个 PySparkling 示例展示了深度学习中结合验证集做早停:
from h2o.grid.grid_search import H2OGridSearch from h2o.estimators.deeplearning import H2ODeepLearningEstimator hidden_opt = [[32, 32], [32, 16, 8], [100]] l1_opt = [1e-4, 1e-3] hyper_parameters = {"hidden": hidden_opt, "l1": l1_opt} model_grid = H2OGridSearch(H2ODeepLearningEstimator, hyper_params=hyper_parameters) model_grid.train(x=x, y=y, distribution="multinomial", epochs=1000, training_frame=train, validation_frame=test, score_interval=2, stopping_rounds=3, stopping_tolerance=0.05, stopping_metric="misclassification")这里有几个关键参数值得拆解:
hidden的候选值是列表的列表,每个内层列表是一种网络结构(如[32,32]表示两个隐层、每层 32 个神经元),网格搜索会在不同结构间遍历;l1候选[1e-4, 1e-3]是 L1 正则化强度;epochs=1000设定最大训练轮数,但真正的停止由早停机制决定——stopping_rounds=3表示连续 3 轮指标未改善即停止,stopping_tolerance=0.05表示改善幅度低于 5% 视为"未改善",stopping_metric="misclassification"表示以误分类率为监控指标;score_interval=2控制每 2 个 epoch 做一次评分,决定早停的检查频率;- 通过
validation_frame=test传入验证集,使早停基于验证集指标而非训练集,避免过拟合。
早停相关参数在整个 H2O 生态中通用:如 5.2 中search_criteria字典同样支持stopping_metric/stopping_tolerance/stopping_rounds,用于在随机网格搜索中按指标表现提前终止搜索(例如"MSE 在最优 5 个模型上未改善 0.0001 即停止",见__init__源码 docstring)。用户可以在 h2o-py/h2o/estimators/ 目录下各算法的估计器类中,以及 h2o-py/h2o/grid/grid_search.py 中找到这些参数的完整签名与默认值。
六、网格搜索的 Python 教程与后续深入学习
FAQ 最后指出:仓库中提供了演示 Python 网格搜索的 Notebook 教程,路径为 h2o-py/demos/H2O_tutorial_eeg_eyestate.ipynb(位于h2o-py/demos/目录)。该教程以 EEG 眼态数据集为例,完整演示了从数据导入、asfactor()处理类别列、构造H2OGridSearch、执行网格搜索到查看结果的全流程。
除该 Notebook 外,读者还可结合以下仓库资源做纵深学习:
- h2o-py/demos/:大量分主题的 Jupyter Notebook 演示(GLM、GBM、KMeans、AutoML、目标编码等);
- h2o-py/h2o/estimators/:各算法估计器源码与完整参数 docstring;
- h2o-py/tests/testdir_algos/:网格搜索、早停等功能的 Python 测试用例,可作"可运行示例"阅读;
- h2o-docs/src/product/faq/python.rst:本文所依据的原始 FAQ 文档。
结语
从环境搭建时的 pip 工具链升级,到导入阶段的col_types/parse_setup/asfactor类型控制,再到varimp()、scoring_history()与第三方绘图库的配合,以及H2OGridSearch的网格搜索与stopping_rounds/stopping_tolerance/stopping_metric早停配置,H2O 3 的 Python 客户端在这些环节上都提供了与后端分布式引擎一一对应的 API。需要特别留意的是,FAQ 成文较早,其中sort_by()、score_history()等接口在当前仓库中已被get_grid()、scoring_history()取代,使用时应以本文标注的现代写法为准。将 FAQ 的操作步骤与 h2o-py 源码、h2o-py/demos 教程互相印证,是在项目中稳定用好 H2O Python 客户端的最快路径。
- 机器学习
- 深度学习
- AutoML
- 大数据
- 后端
【免费下载链接】h2o-3
H2O is an Open Source, Distributed, Fast & Scalable Machine Learning Platform: Deep Learning, Gradient Boosting (GBM) & XGBoost, Random Forest, Generalized Linear Modeling (GLM with Elastic Net), K-Means, PCA, Generalized Additive Models (GAM), RuleFit, Support Vector Machine (SVM), Stacked Ensembles, Automatic Machine Learning (AutoML), etc.
相关推荐
H2O-3 交叉验证(Cross-Validation)参数全解析:从 nfolds 到早期停止自动调参
H2O 3 交叉验证(Cross Validation)参数全解析:从 nfolds 到早期停止自动调参 交叉验证(Cross Validation, CV)是
机器学习深度学习AutoML大数据后端Ray Tune 调参实战 FAQ 指南:超参数搜索、早停调度、资源分配与实验复现
Ray Tune 调参实战 FAQ 指南:超参数搜索、早停调度、资源分配与实验复现 Ray Tune 是 Ray 生态中面向超参数调优(Hyperparamet
人工智能分布式训练强化学习任务调度模型推理服务后端H2O-3 早停机制完全指南:max_runtime_secs、stopping_rounds 与 GLM 的 early_stopping 实战
H2O 3 早停机制完全指南:max_runtime_secs、stopping_rounds 与 GLM 的 early_stopping 实战 导读 本文以
机器学习深度学习AutoML大数据后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考