新闻详情

新闻详情

首页 / 资讯中心 / 详情

H2O 数据缺失值插补(Impute)实战指南:基于 h2o-3 的均值/中位数/众数分组插补原理与用法

发布时间:2026/9/29 2:40:24来源:尧图网络
H2O 数据缺失值插补(Impute)实战指南:基于 h2o-3 的均值/中位数/众数分组插补原理与用法
机器学习深度学习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点击查看免费下载导读在机器学习建模前数据清洗中最常见的任务之一就是处理缺失值NA。H2O 的impute函数提供了一种**原地in-place**的缺失值填补机制用na.rm之后的聚合统计量填充缺失值并支持按数据集内部若干列分组后分别插补同时支持使用预先计算好的分组框架group by frame复用插补结果。本文以 h2o-3 仓库中的 imputing-data.rst 为骨架结合底层 Java 实现AstImpute.java、Python 绑定frame.py与 R 绑定frame.R的源码细节系统讲解impute的全部参数语义、调用语法、分组插补原理与测试验证方式读完即可在 Python 与 R 中正确完成各类缺失值插补。H2Oimpute是什么面向分布式 Frame 的原地插补H2O 的插补imputation功能与 pandas、R 中常见的返回新数据式插补不同它的核心设计是原地修改impute直接修改传入的 H2OFrame用聚合统计量默认情况下数值列用均值、分类列用众数填充该列中的 NA 值。从底层源码看插补操作最终被编译为 Rapids 语言中的一个 AST 节点h2o.impute其签名如下见 AstImpute.javaargs(): {ary, col, method, combineMethod, groupByCols, groupByFrame, values} str(): h2o.impute nargs(): 1 7即 Rapids 层面的完整调用形式为(h2o.impute data col method combine_method groupby groupByFrame values)Python 与 R 客户端最终都会把用户友好的 API 调用翻译成这一 AST 表达式发给集群执行。值得注意的是源码注释明确说明插补可作用于整个 Framecol -1数值列用均值、分类列用众数或Frame 中的某个 Vec特定列String、Time、UUID 类型的列永远不会被插补所有插补都是**原地in place**完成的若指定了分组列但没有指定待插补列或把待插补列放进了分组列中会抛出IllegalArgumentException。这解释了文档中反复强调Revert imputations的原因——因为修改是直接作用在原 Frame 上的若想保留原始数据需要重新导入数据。参数全解impute的七个核心参数原文档 imputing-data.rst 列出了以下参数结合源码可得到更精确的语义参数Python 端R 端语义与默认值bybyby分组列可传列索引或列名R 端传 1 基索引Python 端传 0 基索引或列名columncolumncolumn指定待插补列默认0Python/-1内部表示插补整个 Framecombine_methodcombine_methodcombine_method仅当methodmedian时生效偶数样本量下如何组合分位数可选average、high、interpolate、lowdatasetself隐式data包含待插补列的数据集group_by_framegroup_by_framegroupByFrame用预计算的分组框架来插补列methodmethodmethod插补方式mean、median、modevaluesvaluesvalues插补值向量每列一个值NaN表示跳过该列method三种插补策略及其适用列类型mean用列均值na.rm TRUE替换 NA。仅适用于数值列。源码中对应AstMean节点res[col] vec.mean()见 AstImpute.java。median用列中位数替换 NA。仅适用于数值列。底层调用AstMedian.median(new Frame(vec), combine)其中combine就是QuantileModel.CombineMethod枚举见 AstImpute.java。mode用出现次数最多的因子水平替换 NA。仅适用于分类列。底层调用AstMode.mode(vec)AstImpute.java而ArrayUtils.maxIndex(vec.bins())用于整个 Frame 的众数计算AstImpute.java。重要限制原文档也强调如果待插补列是分类factor列则 method 必须是mode同理源码中也只会对数值列计算 mean/median、对分类列计算 mode。在 R 端h2o.impute还会在 method 传入默认的三选一候选向量c(mean,median,mode)时自动选择mean默认插补策略按列类型决定数值列选mean分类列选mode。combine_method中位数在偶数样本下的分位数组合规则当methodmedian时偶数样本量下中位数的取值需要定义。combine_method提供四种规则其底层直接映射为 H2O 分位数模型QuantileModel中的CombineMethod枚举INTERPOLATE, AVERAGE, LOW, HIGH见 AstImpute.javainterpolate默认在相邻分位数之间插值是统计意义上最常见的中位数定义average取两个中间值的平均low取两个中间值中较小的那个high取两个中间值中较大的那个。需要留意两点该参数仅在中位数插补时生效其余情况全部忽略且在 R 端h2o.impute中lo与hi会被分别规整为low与high再传给后端见 frame.R。by 与 column指定插补范围与分组方式column决定插哪一列by决定按什么分组后分别计算插补值。两者配合的语义为对by指定的每一组使用该组内部非 NA 数据计算聚合值再回填该组内的 NA。Python 端支持按**列名字符串或 0 基索引整数**传参by可以是列名列表传入字符串时会先通过self.names.index(column)转换为索引frame.py。R 端column默认值为0内部转换为-1表示整帧插补传数值时按1 基索引处理col.id - column - 1L传字符串时按列名匹配frame.R。R 端目前对median与by的组合会直接报错Unimplemented: No by and median. Please select a different method.frame.R这是 R 绑定侧的限制Python 端无此限制。从底层看by的分组列在 Rapids 侧既可以传数字列表AstNumList也可以传单个数AstNum或字符串列表AstStrList会通过fr.find(name)解析为列索引AstImpute.java。分组插补的执行分两步先用AstGroupRapids 的 group-by 原语对原始 Frame 按by分组并求聚合数值列mean、分类列moderm表示 na.rm得到一个组 → 插补值的映射表随后启动一个MRTask遍历原始 Frame对非分组列中的每个 NA 单元格从映射表中取出对应组的聚合值回填AstImpute.java。group_by_frame复用预计算的分组插补结果当by对应的分组插补已经被执行过一次并返回了分组聚合结果 Frame后可以把这个结果 Frame 通过group_by_frame传给下一次impute从而对另一列复用同一套分组边界避免重复计算。源码中groupByFrame nullR 端/NonePython 端会被替换成_占位符frame.R、frame.py后端根据是否为_判断是否需要现场执行 GroupByAstImpute.java。若使用group_by_frame而未提供by且结果列数超过 2后端会抛出Ambiguous group-by frame异常提示需要补充by列来消歧AstImpute.java。values逐列指定插补值values接受一个长度等于列数的向量为每一列显式指定插补值NaN表示跳过该列。它适合用已知业务规则而非统计量填充的场景。源码中values缺省时为null此时后端会为数值列计算mean()、为分类列计算众数索引ArrayUtils.maxIndex(vec.bins())来填充res数组AstImpute.java随后启动MRTask对每个 chunk 中所有 NA 单元格写入对应列的值AstImpute.java。Python 端会校验len(values) len(self.columns)并把分类列的字符串值转换成对应的枚举序号找不到水平时抛出H2OValueErrorframe.pyR 端也会在 values 长度不匹配或 factor 值不在既有水平中时报错frame.R。Python 实战三种插补方式的完整演示原文档使用航空公司数据集allyears2k给出了可直接运行的 Python 示例以下是完整还原并附注释的版本import h2o h2o.init() # 导入航空公司数据集 air_path https://s3.amazonaws.com/h2o-public-test-data/smalldata/airlines/allyears2k.zip air h2o.import_file(pathair_path) air.dim # [43978, 31] # 1) 按 Origin 与 Distance 分组对 DepTime 列做均值插补 DeptTime_impute air.impute(DepTime, methodmean, by[Origin, Distance]) DeptTime_impute # 返回分组聚合结果Origin / Distance / mean_DepTime共 1497 行 # Origin Distance mean_DepTime # ABE 253 1149.7 # ABE 481 812 # ABQ 223 1229.33 # ...共 1497 行 x 3 列 # 原地插补已修改 air若需保留原始数据请重新导入 air h2o.import_file(pathair_path) # 2) 对 TailNum 分类列做众数插补 mode_impute air.impute(TailNum, methodmode) # 返回值为逐列的插补值列表除第 10 列TailNum为 3499.0 外其余均为 nan # [nan, nan, ..., 3499.0, nan, ...] # 3) 按 Month 与 Year 分组对 TailNum 做众数插补 air h2o.import_file(pathair_path) mode_impute air.impute(TailNum, methodmode, by[Month, Year]) # 返回分组结果Year / Month / mode_TailNum共 22 行 # 1987 10 3499 # 1988 1 3499 # ...几个要点返回值语义不带by/group_by_frame时Python 端通过_eager_scalar()返回一个标量值列表每个被插补列一个值未被插补列为 NaN带分组时返回分组聚合结果 Frame_frame()也就是后续可复用于group_by_frame的那个框架frame.py。原地修改确认Python 端在调用后执行self._ex._cache.flush()并重新fill(10)刷新本地缓存确保调用方能立即读到修改后的数据frame.py。其余等价写法air.impute(8, methodmean)0 基索引与air.impute(VOL, methodmean)列名等价methodmedian时可配combine_method。这些均被仓库测试 pyunit_impute.py 覆盖验证。R 实战h2o.impute的完整调用示例原文档同样给出了 R 侧示例并补充了分组结果中若某组全部为 NA 则该组不插补仍为 NA的重要语义。完整还原如下library(h2o) h2o.init() # 上传航空公司数据集 file_path - https://s3.amazonaws.com/h2o-public-test-data/smalldata/airlines/allyears2k.zip air - h2o.importFile(file_path, air) print(dim(air)) # 43978 31 # 查看 DepTime 列的 NA 数量与均值 print(numNAs - sum(is.na(air$DepTime))) # [1] 1086 DepTime_mean - mean(air$DepTime, na.rm TRUE) print(DepTime_mean) # [1] 1345.847 # 1) 均值插补 DepTime 列 h2o.impute(air, DepTime, method mean) # 返回逐列插补值向量DepTime 位置为 1345.847其余为 NaN # 2) 按 Dest 分组对 DepTime 做均值插补 air - h2o.importFile(file_path, air) h2o.impute(air, DepTime, method mean, by c(Dest)) # Dest mean_DepTime # 1 ABE 1671.795 # 2 ABQ 1308.074 # ...共 134 行 x 2 列 # 注意若 Origin/Distance 的组合在分组后整组为 NA则该组不插补NA 保留 # 3) 对 TailNum 分类列做众数插补 air - h2o.importFile(file_path, air) h2o.impute(air, TailNum, method mode) # [1] NaN ... NaN 3499 NaN ...TailNum 位置为 3499 # 4) 按 Month 分组对 TailNum 做众数插补 air - h2o.importFile(file_path, air) h2o.impute(air, TailNum, method mode, by c(Month)) # Month mode_TailNum # 1 1 3499 # 2 10 3499R 端的内部处理流程见 frame.R与 Python 端保持一致列索引统一转换为0 基索引后拼装 AST 表达式(h2o.impute data col.id method combine_method gb.cols groupByFrame values)无分组时走.eval.scalar()返回标量有分组gb.cols ! []或传入 groupByFrame时走.eval.frame()返回分组结果 Frame调用结束后通过.flush.data(data)与.fetch.data(data, 10L)刷新客户端缓存。R 端特有限制提醒methodmedian时暂不支持与by组合使用会直接报错combine_method传lo/hi会被自动转为low/high。分组插补 结果复用的组合用法group_by_frame仓库 R 测试 runit_h2oimpute.R 演示了一个非常有价值的进阶模式先用by做一次分组插补并保存返回的 group by 结果 Frame再把这个结果传给groupByFrame去插补另一列从而复用同一套分组聚合避免重复计算fr - as.h2o(iris) h2o.insertMissingValues(fr) # 随机向 iris 中注入缺失值 # 第一次按第 5 列Species分组插补第 1 列并保存分组结果 grpdRes - h2o.impute(fr, 1, by 5) # 第二次复用 grpdRes 的分组聚合插补第 2 列 h2o.impute(fr, 2, groupByFrame grpdRes) # 第三次用显式 values 插补整帧剩余缺失 h2o.impute(fr, values c(1.2, 2.2, 1.3, 0.2, setosa))这个模式对应源码中的双路径设计当groupByFrame为null时后端现场执行AstGroup生成分组聚合当传入预计算 Frame 时直接Gather该 Frame 建立group_impute_mapIcedHashMapAstGroup.G, Freezable[]再以 MRTask 原地回填AstImpute.java。对同一数据集多列做同分组插补时这种复用能显著减少集群端的聚合计算开销。分布式实现的底层原理Aggregate MRTask 原地回填从实现角度看一次impute调用在 H2O 集群内部经历如下阶段可结合 AstImpute.java 全文件阅读参数解析与校验解析col、method、combine_method、by、groupByFrame、values校验col是否越界、method 是否为 mean/median/modeffill/bfill已定义枚举但在当前版本中通过H2O.unimpl抛未实现异常见 AstImpute.java。column为 -1 时doAllVecs true即整帧插补。非分组路径未传by/groupByFrame时直接计算聚合值数值列vec.mean()、中位数AstMedian.median(...)、分类列AstMode.mode(vec)或在values已给定情况下直接用用户值构造res[]数组然后一个MRTask并行遍历所有 chunk对每个isNA(row)的单元格set(row, res[c])AstImpute.java。分组路径AstGroup执行分布式 group-by 聚合na.rm为rmGather内部类把分组结果 Frame 摊平为IcedHashMap组 key → 每列插补值通过reduce()合并各节点局部结果AstImpute.java最终 MRTask 依据bycols构造AstGroup.G组键对非分组列中的 NA 用组内聚合值回填。结果返回非分组路径返回ValNums插补值列表分组路径返回ValFrame分组聚合结果 Frame可继续作为groupByFrame复用。正因为聚合与回填都被拆成可并行化的 MRTaskimpute在数百 GB、多节点的分布式 Frame 上依然能高效执行——这也是 H2O 插补与单机 pandas 插补在设计上的根本差异。测试与验证仓库中的插补用例如何印证行为仓库为impute提供了多语言测试可作为验证理解的参考Pythonpyunit_impute.py 使用prostate_missing.csv验证了均值插补后DPROS列 NA 数量归零并覆盖了0 基索引、列名等不同参数写法的等价性以及median插补VOL列。Rrunit_h2oimpute.R 使用insertMissingValues注入缺失后验证整帧按 values 插补、按by5Species分组插补第 1 列、用groupByFrame复用分组结果插补第 2 列、再以 values 收尾整帧插补——完整覆盖了本文介绍的全部四种调用形态。API 测试pyunit_h2oH2OFrame_impute.py 从 H2OFrame API 层面进一步验证了impute的公开接口行为。如需在自己环境中复现可以运行python h2o-py/tests/testdir_munging/pyunit_impute.pyPython或对应的 R 测试脚本观察插补前后 NA 数量的变化。关键注意事项速查原地修改impute直接改写原 Frame想保留原始数据务必在插补前备份重新导入或h2o.assign复制。列类型约束String/Time/UUID 列从不参与插补分类列只能用mode数值列可用mean/median。分组整组为 NA 时不插补若某分组在目标列上全部缺失则聚合值为 NA该组 NA 不会被填充。combine_method只影响median且仅在偶数样本量下体现差异其他场景一律忽略。R 端限制R 绑定暂不支持median by组合R 端列索引为 1 基Python 端为 0 基也支持列名。values需与列数匹配分类列传字符串值时需是该列既有水平否则客户端直接报错。分组结果可复用带by的插补返回的分组 Frame 可作为下一次调用的group_by_frame多列同分组插补时优先复用以省去重复聚合计算。总结H2O 的impute是一个兼具简单统计插补与分组上下文插补能力的分布式数据清洗原语。本文以 imputing-data.rst 为主线完整覆盖了by、column、combine_method、dataset、group_by_frame、method、values七个参数的语义与边界条件并下沉到 AstImpute.java 解释了聚合计算、分组映射与 MRTask 原地回填的底层机制同时给出了 Python、R 两端可复现的实战示例与仓库测试佐证。理解这些细节后无论是单列均值插补、按业务维度分组插补还是跨列复用分组结果的高效插补都能在 H2O 集群上正确且高效地完成。赞分享机器学习深度学习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点击查看免费下载相关推荐Vega Impute Transform 完全指南缺失数据的补全原理与实战Vega Impute Transform 完全指南缺失数据的补全原理与实战 Vega 的 impute transform 用于对数据集中缺失的数据对象进行数据可视化Altair Impute 插补变换实战指南用 transform_impute 补齐缺失数据、修复折线图断点Altair Impute 插补变换实战指南用 transform_impute 补齐缺失数据、修复折线图断点 本指南围绕 AltairPython 声明式数据可视化TDengine 缺失数据补值imputation基于 moment 时序基础模型的自动补齐实战指南TDengine 缺失数据补值imputation基于 moment 时序基础模型的自动补齐实战指南 导读 TDengine 自 v3.3.8.0 起提供数据库时序数据库物联网大数据实时分析云原生上一篇IOE库存管理系统高级技巧库存预警与智能盘点功能详解下一篇OSQP嵌入式部署教程如何在资源受限设备上运行二次规划求解器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Windows 一键部署 OpenClaw 教程|5 分钟搞定本地 AI 智能体,TaoToken 统一 Key 接入告别复杂配置 2026/9/29 3:27:24

Windows 一键部署 OpenClaw 教程|5 分钟搞定本地 AI 智能体,TaoToken 统一 Key 接入告别复杂配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Python 操作 Oracle 数据库查询实战:cx_Oracle 配置与验证 2026/9/29 3:27:24

Python 操作 Oracle 数据库查询实战:cx_Oracle 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Woodpecker Go SDK 使用指南:用 woodpecker-go 在 Go 程序中调用 Woodpecker CI API 2026/9/29 3:27:11

Woodpecker Go SDK 使用指南:用 woodpecker-go 在 Go 程序中调用 Woodpecker CI API

CI/CDDevOps 【免费下载链接】woodpecker Woodpecker is a simple, yet powerful CI/CD engine with great extensibility. 项目地址: https://gitcode.com/gh_mirrors/wo/woodpecker 点击查看 免费下载 Woodpecker 是一个简单而强大的 CI/CD 引擎,其官…

阅读更多 →
Axure 9.0日期函数分类(系统时间函数) 2026/9/29 3:27:11

Axure 9.0日期函数分类(系统时间函数)

函数名称功能描述使用示例[[Now.getFullYear()]]获取当前年份(4位数字)[[Now.getFullYear()]] → 返回2025[[Now.getMonth()1]]获取当前月份(返回0-11,需1转换为1-12格式)[[Now.getMonth()1]] → 返回8(8月…

阅读更多 →
TFLM_day2 2026/9/29 3:27:11

TFLM_day2

轻松学习 TFLM Day 2:推理调用链图 摘要:本文是「轻松学习 TFLM」系列 Day 2,聚焦 TFLM(TensorFlow Lite for Microcontrollers)的推理调用链。文章先用一张总览图讲清 .tflite 模型从应用代码到 kernel 的完整路径,再通过一个 STM32 上运行 MNIST 手写数字识别的端到端实…

阅读更多 →
Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(二) 2026/9/29 3:27:11

Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(二)

子文档二:wdi-simple —— 命令行极简安装器 wdi-simple.c 是 libwdi 提供的最简单的驱动安装示例,其代码行数不足 200 行,但却完整地展示了 libwdi 的核心工作流程。它非常适合开发者快速理解如何在自己的应用程序中集成驱动安装功能。 核心…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉