
机器学习深度学习AutoML大数据后端【免费下载链接】h2o-3H2O 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.项目地址https://gitcode.com/gh_mirrors/h2/h2o-3点击查看免费下载导读H2OAssembly是 H2O 3 提供的一个 Python 端数据预处理编排类它允许你将多步 H2OFrame 操作列选择、数学变换、字符串清洗、类型转换、二元运算等定义在同一个对象中一次fit即可在分布式后端顺序执行整条数据清洗流水线并可将整条流水线导出为自包含的 Java POJO 或 MOJO 2 制品用于逐行、高吞吐的生产评分环境。读完本文你将掌握H2OAssembly的步骤链构建、各类H2OTransformer变换器、10 个帧间元素级静态方法以及 POJO / MOJO 2 导出的完整配置与调用方式并了解其从 Python 到 Java 后端Rapids AST的底层实现链路。1. H2OAssembly 是什么一处定义、整链执行H2OAssembly的核心定位是将多个帧操作集中在一处指定源码类注释The H2OAssembly class can be used to specify multiple frame operations in one place.。它本质上是对 H2O 分布式数据变换的编排层每个 Assembly 由一组**步骤steps**组成每个步骤是一个(名称, 操作)元组其中操作是某个H2OTransformer变换器类的实例h2o-py/h2o/assembly.pyfit时所有步骤按顺序依次作用于输入帧前一步的输出即后一步的输入fit返回的是清洗后的新 H2OFrame而 Assembly 对象本身会被保存在后端 DKV 中供后续 POJO / MOJO 导出使用。import h2o from h2o.assembly import * from h2o.transforms.preprocessing import * iris h2o.load_dataset(iris) assembly H2OAssembly(steps[ (col_select, # 步骤 1列选择 H2OColSelect([Sepal.Length, Petal.Length, Species])), (cos_Sepal.Length, # 步骤 2对列求余弦原地替换 H2OColOp(opH2OFrame.cos, colSepal.Length, inplaceTrue)), (str_cnt_Species, # 步骤 3统计含 s 的字符数生成新列 H2OColOp(opH2OFrame.countmatches, colSpecies, inplaceFalse, patterns)), ]) result assembly.fit(iris) result输出前 10 行示意Sepal.Length Petal.Length Species Species0 -------------- -------------- ----------- ---------- 0.377978 1.4 Iris-setosa 3 0.186512 1.4 Iris-setosa 3 -0.0123887 1.3 Iris-setosa 3 -0.112153 1.5 Iris-setosa 3 0.283662 1.4 Iris-setosa 3 0.634693 1.7 Iris-setosa 3 -0.112153 1.4 Iris-setosa 3 0.283662 1.5 Iris-setosa 3 -0.307333 1.4 Iris-setosa 3 0.186512 1.5 Iris-setosa 3 [150 rows x 4 columns]该示例演示了三种典型的清洗模式列选择只保留 5 列中的 3 列H2OColSelect原地数学变换对Sepal.Length求余弦并替换原列inplaceTrue非原地变换统计类别列中字符s出现的次数由于inplaceFalse结果以新列Species0追加到帧末尾。对应的最小可运行示例还可以参考仓库中的 h2o-py/assembly_demo.py它使用smalldata/iris/iris_wheader.csv演示了同样的三步链并调用result.show()查看结果。2. 步骤链的组成H2OTransformer 变换器家族H2OAssembly构造函数的签名是H2OAssembly(steps)其中steps必须是[(str, H2OTransformer)]形式的列表源码通过assert_is_type(steps, [(str, H2OTransformer)])校验。每个操作都必须继承自抽象基类H2OTransformerh2o-py/h2o/transforms/transform_base.py该类定义了fit、transform、inverse_transform、export、fit_transform、get_params、set_params与to_rest等标准接口——其中to_rest是把变换器序列化为后端可执行的字符串的关键见第 6 节。2.1 H2OColSelect列选择H2OColSelect(cols)接收一个列名列表transform阶段等价于X[cols]fit阶段为恒等操作h2o-py/h2o/transforms/preprocessing.py。它可用于在链的早期裁掉无关列减少后续计算量。2.2 H2OColOp单列/整帧算子H2OColOp是用途最广的变换器构造参数为h2o-py/h2o/transforms/preprocessing.py参数类型说明op可调用对象一般是H2OFrame上的方法引用如H2OFrame.cos、H2OFrame.gsub、H2OFrame.countmatches、H2OFrame.asnumeric、H2OFrame.strsplit、H2OFrame.trim等colstr / None作用的列名None表示作用于整个帧。注意col只能是单列名传入列表/元组会触发ValueErrorinplaceboolTrue时用结果替换原列False时用cbind将结果追加为新列默认Truenew_col_namestr / list指定新列名仅在inplaceFalse时有意义若同时设inplaceTrue会发出警告并忽略该参数**paramsdict透传给op的关键字参数例如gsub的pattern、replacementstrsplit的patternround的digitsH2OColOp.transform的实现逻辑是先在col或整个帧上执行opinplaceTrue时执行X[col] res否则return X.cbind(res)h2o-py/h2o/transforms/preprocessing.py。注意源码 docstring 中对inplace的描述存在字面歧义——If inplace is True, then cbind the result onto original frame, otherwise, perform the operation in place 与类注释相反以实际transform实现为准inplaceTrue为原地替换inplaceFalse为追加新列。文档示例也印证了这一点inplaceFalse时a new column is generated to hold the result。2.3 H2OBinaryOp二元列运算H2OBinaryOp继承自H2OColOp用于两个列或列与常量之间的二元运算。关键参数left/right决定运算顺序若leftNone则op(X[col], X[right.col])right可以是H2OCol包装的列名也可以是常量否则op(X[left.col], X[col])left与right不能同时为None否则抛出ValueError。配合H2OCol包装类h2o-py/h2o/transforms/preprocessing.py可以表达用另一列计算得到新列的业务逻辑例如在第 4 节的 Lending Club 示例中计算issue_d_Year - earliest_cr_line_Year得到授信时长。2.4 H2OScaler标准化H2OScaler(centerTrue, scaleTrue)对帧按列去均值并缩放默认使每列均值为 0、方差为 1。center与scale既可以是布尔值也可以是长度等于列数的数值列表h2o-py/h2o/transforms/preprocessing.py。fit阶段计算均值与标准差X.mean(return_frameTrue).getrow()、X.sd()transform阶段调用X.scale(means, stds)并支持inverse_transform还原。后端对应 Java 类 H2OScaler.java其fit逐列计算mean()与sigma()transformImpl用MRTask并行完成逐行scaleInPlace。2.5 H2OPCA / H2OSVD模型代理变换器h2o.transforms.decomposition模块h2o-py/h2o/transforms/decomposition.py还提供H2OPCA与H2OSVD——它们通过_H2OTransformerProxy将 PCA/SVD 估计器包装为变换器transform阶段调用底层模型的predict。这意味着你可以在 Assembly 步骤链中嵌入训练-预测式的降维步骤。3. 帧间元素级静态方法10 个二元运算H2OAssembly提供一组静态方法用于对两个行数相同、列类型相同的 H2OFrame 做逐元素element-wise运算统一调用形式为H2OAssembly.op(frame1, frame2)支持的 10 个操作及语义如下均直接映射到H2OFrame的 Python 魔法方法定义见 h2o-py/h2o/assembly.py静态方法映射语义结果示例4 / 2H2OAssembly.divideH2OFrame.__truediv__逐元素相除2H2OAssembly.plusH2OFrame.__add__逐元素相加6H2OAssembly.multiplyH2OFrame.__mul__逐元素相乘8H2OAssembly.minusH2OFrame.__sub__逐元素相减2H2OAssembly.less_thanH2OFrame.__lt__小于0/1 布尔0H2OAssembly.less_than_equalH2OFrame.__le__小于等于0/10H2OAssembly.equal_equalH2OFrame.__eq__相等0/10H2OAssembly.not_equalH2OFrame.__ne__不等0/11H2OAssembly.greater_thanH2OFrame.__gt__大于0/11H2OAssembly.greater_than_equalH2OFrame.__ge__大于等于0/11典型调用方式python_list1 [[4,4,4,4],[4,4,4,4]] python_list2 [[2,2,2,2], [2,2,2,2]] frame1 h2o.H2OFrame(python_objpython_list1) frame2 h2o.H2OFrame(python_objpython_list2) H2OAssembly.divide(frame1, frame2) # 全列值为 2 H2OAssembly.plus(frame1, frame2) # 全列值为 6 H2OAssembly.multiply(frame1, frame2) # 全列值为 8 H2OAssembly.minus(frame1, frame2) # 全列值为 2仓库测试 pyunit_h2oassembly_static_methods.py 对全部 10 个静态方法逐一断言了结果值例如H2OAssembly.less_than(frame2, frame1)恒为 1.0、less_than(frame2, frame2)恒为 0.0可作为这些方法语义的权威验证。4. 实战案例Lending Club 贷款数据清洗链官方测试 pyunit_assembly_munge_large.py 与 pyunit_lending_club_munging_assembly_large.py 展示了在真实贷款数据集上构建的 18 步清洗链几乎覆盖了所有常用清洗手法types {int_rate: string, revol_util: string, emp_length: string, earliest_cr_line: string, issue_d: string, last_credit_pull_d: factor} data h2o.import_file(pathtrain, col_typestypes) assembly H2OAssembly(steps[ # ---- int_rate去掉 %、去空白、转数值三步全部原地---- (intrate_rm_junk_char, H2OColOp(opH2OFrame.gsub, colint_rate, inplaceTrue, pattern%, replacement)), (intrate_trim_ws, H2OColOp(opH2OFrame.trim, colint_rate, inplaceTrue)), (intrate_as_numeric, H2OColOp(opH2OFrame.asnumeric, colint_rate, inplaceTrue)), # ---- revol_util与 int_rate 同构的清洗 ---- (revol_rm_junk_char, H2OColOp(opH2OFrame.gsub, colrevol_util, inplaceTrue, pattern%, replacement)), (revol_trim_ws, H2OColOp(opH2OFrame.trim, colrevol_util, inplaceTrue)), (revol_as_numeric, H2OColOp(opH2OFrame.asnumeric, colrevol_util, inplaceTrue)), # ---- earliest_cr_linemm-YYYY 格式按 - 拆分为月、年两列年份转数值 ---- (earliest_cr_line_split, H2OColOp(H2OFrame.strsplit, colearliest_cr_line, inplaceFalse, new_col_name[earliest_cr_line_Month, earliest_cr_line_Year], pattern-)), (earliest_cr_line_Year_as_numeric, H2OColOp(opH2OFrame.asnumeric, colearliest_cr_line_Year, inplaceTrue)), # ---- issue_d同样的拆分与类型转换 ---- (issue_date_split, H2OColOp(opH2OFrame.strsplit, colissue_d, inplaceFalse, new_col_name[issue_d_Month, issue_d_Year], pattern-)), (issue_d_Year_as_numeric, H2OColOp(opH2OFrame.asnumeric, colissue_d_Year, inplaceTrue)), # ---- emp_length正则去 year/Years/n/a翻译 1 与 10转数值 ---- (emp_length_rm_years, H2OColOp(opH2OFrame.gsub, colemp_length, inplaceTrue, pattern([ ]*[a-zA-Z].*)|(n/a), replacement)), (emp_length_trim, H2OColOp(opH2OFrame.trim, colemp_length, inplaceTrue)), (emp_length_lt1_point5,H2OColOp(opH2OFrame.gsub, colemp_length, inplaceTrue, pattern 1, replacement0.5)), (emp_length_10plus, H2OColOp(opH2OFrame.gsub, colemp_length, inplaceTrue, pattern10\\, replacement10)), (emp_length_as_numeric,H2OColOp(opH2OFrame.asnumeric, colemp_length, inplaceTrue)), # ---- 用 H2OBinaryOp H2OAssembly.minus 计算授信时长新列---- (credit_length, H2OBinaryOp(opH2OAssembly.minus, colissue_d_Year, inplaceFalse, new_col_namelongest_credit_length, rightH2OCol(earliest_cr_line_Year))), ]) res assembly.fit(data) res.show()该示例展示了H2OAssembly的实际价值将脏数据 → 可直接训练的数据整条清洗逻辑封装为声明式步骤链代码可读、可复用、可导出。清洗后的帧可直接用于训练测试中还在此基础上训练了H2OGradientBoostingEstimator并对模型调用model.download_pojo()与清洗链的 POJO 配套用于 Java 端逐行预测。5. 命名与元信息names 属性assembly.names属性返回步骤链中除最后一步外各步骤的名称源码实现list(zip(*self.steps))[0][:-1]h2o-py/h2o/assembly.py可用于快速核对链中每一步的意图result assembly.fit(iris) result.names # [uSepal.Length, uPetal.Length, uSpecies, uSpecies0]6. fit 的底层链路Python 步骤 → REST → Rapids AST → 分布式执行fit(fr)的完整工作流程h2o-py/h2o/assembly.py值得单独拆解序列化步骤对每个步骤调用step.to_rest(step_name)将 Python 变换器编码为name__class__ast__inplace__names形式的字符串以__连接见 transform_base.py 的to_rest与H2OColOp.to_restAST 部分通过_dummy_frame()在 Python 侧构造表达式树并_to_string()得到REST 调用h2o.api(POST /99/Assembly, data{steps: steps, frame: fr.frame_id})后端处理AssemblyHandler.fitAssemblyHandler.java按__拆分每个步骤用反射实例化water.rapids.transforms包中对应的Transform子类H2OColSelect、H2OColOp、H2OScaler等并构造Assembly对象Assembly.java顺序执行Assembly.fit(Frame)对Transform[]逐个调用fitTransform后一步消费前一步产出的帧返回结果后端把清洗后帧的 key 写入响应Python 侧self.id j[assembly][name]保存 Assembly 的 key并返回H2OFrame.get_frame(j[result][name])。REST 端点的注册见 RegisterV3Api.javaPOST /99/Assembly与GET /99/Assembly.java/{assembly_id}/{file_name}请求/响应 Schema 定义在 AssemblyV99.java字段steps、frame、file_name、assembly_id输出result、assembly。后端Transform.transform会记录每一步的输入列名/类型与输出列名/类型_inNames、_outNames、_inTypes、_outTypes这些元信息正是后续生成 POJO 时Step类构造参数的数据来源Transform.java。7. 导出为 Java POJOto_pojoH2OAssembly是Pipeline的扩展类额外实现了to_pojo把整条清洗链导出为自包含的 Java POJO适用于逐行、高吞吐的在线预测环境。7.1 参数说明assembly.to_pojo(pojo_name, path, get_jarTrue)参数类型默认值说明pojo_namestrPOJO 类名为空时自动生成AssemblyPOJO_ uuid4()pathstr输出目录。为空时只把 Java 源码打印到屏幕非空时写入path/pojo_name.javaget_jarboolTrue是否同时下载编译 POJO 所需的h2o-genmodel.jar到path目录实现上to_pojo调用GET /99/Assembly.java/{id}/{pojo_name}获取 Java 源码若get_jarTrue且path非空则再通过GET /3/h2o-genmodel.jar下载依赖 jarh2o-py/h2o/assembly.py。注意POJO 下载入口受water.EnterpriseGate.block(POJO download)的企业版门禁控制AssemblyHandler.java。7.2 生成的 POJO 结构后端Assembly.toJavaAssembly.java生成的类继承hex.genmodel.GenMunger构造函数把每个步骤实例化为内嵌的Step子类如col_select extends Stepcol_select每个Step通过Transform.genClass()生成携带输入/输出列名、类型与参数并实现RowData transform(RowData row)逐行变换逻辑如H2OColOp.genClassImpl生成GenMunger.fun(...)调用见 H2OColOp.java。7.3 在 Java 端与模型 POJO 配合使用官方测试与 assembly_demo.py 注释中给出了完整的 Java 端用法模板String rawRow framework.nextTuple(); H2OMungingPOJO munger new GeneratedH2OMungingPojo_001(); // 清洗链 POJO EasyPredictModelWrapper model new EasyPredictModelWrapper(new GeneratedH2OGbmPojo_001()); // 模型 POJO RowData row new RowData(); row.fill(rawRow); row munger.transform(row); // 先清洗 BinomialModelPrediction pred model.predictBinomial(row); // 再预测即先跑清洗 POJO再跑模型 POJO保证训练与推理时的数据预处理完全一致。对应测试见 pyunit_h2oassembly_to_pojo.py该测试同时断言了h2o-genmodel.jar会被正确下载。8. 导出为 MOJO 2download_mojodownload_mojo把整条清洗链转换为MOJO 2 制品h2o-py/h2o/assembly.pyassembly.download_mojo(file_nameiris_mojo, path)file_name制品名为空时自动生成AssemblyMOJO_ uuid4()path制品存放的目标本地路径内部调用GET /99/Assembly.fetch_mojo_pipeline/{assembly_id}/{file_name}。8.1 前置依赖mojo2-runtime 库MOJO 2 功能依赖额外的mojo2-runtime库本仓库文档指明版本2.7.11.1两种加入 Java classpath 的方式方式一命令行启动 H2O 节点时加入 classpathjava -cp path_to_h2o_jar:path_to_mojo2-runtime_library water.H2OApp方式二从 Python 启动集群时传入 extra_classpathimport h2o h2o.init(extra_classpath[path_to_mojo2-runtime_library])测试 pyunit_h2oassembly_download_mojo_documented_pipeline.py 即通过standalone_test(..., init_options{extra_classpath: [/tmp/mojo/mojo2-runtime-2.7.11.1.jar]})注入该依赖后运行。8.2 加载 MOJO 2 并做预测变换MOJO 2 制品可通过H2OMojoPipeline加载并对新帧做变换mojo_pipeline.pyfrom h2o.pipeline import H2OMojoPipeline mojo_file assembly.download_mojo(file_nameiris_mojo, path/tmp/) pipeline H2OMojoPipeline(mojo_pathmojo_file) result pipeline.transform(new_frame)H2OMojoPipeline.transform(data, allow_timestampsFalse)返回变换后的新 H2OFrame。其中allow_timestamps建议保持默认False官方注释明确建议在使用 MOJO Pipeline 时把日期时间列解析为 String因为 Pipeline 对某些日期格式的解读可能与直接解析不同仅当数据来自二进制格式如 Parquet时可安全打开。重要提示download_mojo产出的 MOJO 2 制品在使用时除了 mojo2-runtime还要求 Java classpath 上存在h2o-genmodel.jar。此外由于 MOJO2 库要求管线内所有列名全局唯一生成制品中的输出列名会带有assembly_前缀。9. 与 sklearn Pipeline 的类比与差异H2OAssembly在设计上对标 scikit-learn 的Pipeline源码注释明确写着Extension class of Pipeline implementing additional methods但存在关键差异算子不同步骤中的变换器必须是 H2O 自定义的H2OTransformer子类而非 sklearn 估计器/转换器执行引擎不同步骤并非在本地 Python 逐帧执行而是被序列化为 Rapids AST 后在分布式 H2O 后端顺序执行产物不同除fit返回的清洗帧外还能导出 Java POJO 与 MOJO 2 两类生产制品框架差异fit仅有一个帧参数fit(fr)没有X/y拆分——它专门面向帧整体清洗场景而不是监督式管道。如果你需要把 PCA/SVD 等模型嵌入链中可使用第 2.5 节介绍的H2OPCA/H2OSVD代理变换器。10. 测试矩阵与可靠性验证仓库h2o-py/tests/testdir_apis/H2OAssembly/目录下存在一组覆盖H2OAssembly各 API 的系统测试可视为行为契约pyunit_h2oassembly_fit.py验证fit返回 H2OFramepyunit_h2oassembly_static_methods.py逐一验证 10 个静态二元方法的数值结果pyunit_h2oassembly_to_pojo.py验证 POJO 导出与 jar 下载pyunit_h2oassembly_download_mojo_*.py按算子类型数学一元/二元、字符串一元/二元/属性、字符串转换、时间一元、列选择、inplace 管线等分组验证download_mojo并以pyunit_utils.compare_frames(expected, result, tol_numeric1e-5)断言直接 fit 的结果与MOJO 2 管线变换的结果数值一致如 pyunit_h2oassembly_download_mojo_col_op_math_unary.py 覆盖abs、acos、cos、exp、log、sqrt等 30 余个一元数学函数pyunit_assembly_munge_large.py在 Lending Club 大数据集上验证 18 步清洗链 POJO 导出。这些测试同时说明了H2OColOp对op的广泛兼容性任何以 H2OFrame或其单列帧为输入、可被 Rapids AST 序列化的帧方法都可作为算子包括数学类cos、log、round、signif、字符串类gsub、trim、strsplit、countmatches、asnumeric以及时间/类型转换类。结语H2OAssembly把多步、声明式、可导出三条核心诉求统一在一个 Python 类中steps步骤链定义清洗逻辑fit在分布式后端顺序执行并返回清洗帧to_pojo与download_mojo则将整条链固化为 Java 生产制品配合H2OMojoPipeline与模型 POJO/MOJO 实现训练-推理预处理一致性。其底层链路Pythonto_rest序列化 →POST /99/Assembly→ Rapids AST → JavaTransform链与配套测试矩阵共同保证了从原型清洗到生产落地的平滑过渡。建议进一步阅读 assembly.py 源码与 H2OAssembly 测试目录以掌握每个算子与导出的确切行为。赞分享机器学习深度学习AutoML大数据后端【免费下载链接】h2o-3H2O 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.项目地址https://gitcode.com/gh_mirrors/h2/h2o-3点击查看免费下载相关推荐H2O-3 生产化部署实战指南从 MOJO/POJO 生成、Java 集成到实时评分H2O 3 生产化部署实战指南从 MOJO/POJO 生成、Java 集成到实时评分 H2O 3 训练出的模型只是起点真正体现价值的是把它们生产化Pr机器学习深度学习AutoML大数据后端LLM.swift思维链技术揭秘如何分离思考过程与最终输出LLM.swift思维链技术揭秘如何分离思考过程与最终输出 LLM.swift是一个简单易读的Swift库让你能够轻松地在macOS、iOS、watchOSH2O-3 模型接入 MLflowh2o_mlflow_flavor 的 MOJO/POJO 注册、加载与评分实战H2O 3 模型接入 MLflowh2o_mlflow_flavor 的 MOJO/POJO 注册、加载与评分实战 本篇技术指南聚焦 H2O 3 官方提供的机器学习深度学习AutoML大数据后端上一篇IndoBERT Large P2 OpenMind微调教程定制你的印尼语NLP模型下一篇【亲测免费】 aspJSON 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考