资讯详情

H2O-3 GBM 的 `pred_noise_bandwidth` 参数:高斯乘性噪声实现树节点预测正则化的原理与实战

📅 2026/10/15 2:06:28 | 华诺云谱 👁 阅读
H2O-3 GBM 的 `pred_noise_bandwidth` 参数:高斯乘性噪声实现树节点预测正则化的原理与实战
机器学习深度学习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点击查看免费下载导读pred_noise_bandwidth是 H2O-3 梯度提升机GBM中一个面向专家用户的超参数用于为每棵树的叶节点预测引入高斯乘性噪声Gaussian multiplicative noise作为正则化手段缓解过拟合。本文以官方参数文档为骨架结合 H2O-3 仓库中 GBM.java 的底层实现、GBMV3.java 的 Schema 定义以及 Python/R 客户端的真实调用方式完整讲解该参数的数学含义、参数校验规则、与随机种子的关系并给出可直接运行的训练与网格搜索示例帮助你在实际建模中正确评估与使用这一参数。参数总览属性值可用算法GBMGradient Boosting Machine是否为超参数可参与网格搜索是gridable true默认值0禁用取值范围 0取值小于 0 会被拒绝参数层级专家级expert见 GBMV3.java相关参数无从 REST 层 Schema 定义可以看到它的完整帮助文本API(help Bandwidth (sigma) of Gaussian multiplicative noise ~N(1,sigma) for tree node predictions, level API.Level.expert, gridable true) public double pred_noise_bandwidth;这段定义同时说明了两件事该参数是可网格搜索的超参数gridable true并且被归类为专家级API.Level.expert参数——它适用于需要深度调优、对噪声注入原理有清晰认识的场景而不是日常建模的首选参数。工作原理叶节点预测的高斯乘性噪声数学含义启用pred_noise_bandwidth sigma后每一个叶节点的预测值都会被一个随机因子随机缩放该因子服从以 1 为中心、带宽为sigma的正态分布factor ~ N(1, sigma) leaf_prediction_final factor * leaf_prediction_original其中sigma即用户传入的带宽值。当sigma 0时因子恒等于 1等价于关闭该功能默认行为当sigma 0时等效于在每个叶节点的预测值上叠加与预测值大小成比例的随机扰动属于信号处理意义上的乘性噪声multiplicative noise——噪声的幅度随信号本身的幅度变化与常见的加性噪声additive noise行为不同。训练阶段的源码调用链该噪声并非在最终预测阶段加入而是在训练过程中逐棵树生成时注入。在 GBM.java 中每完成一棵树的构建H2O 就会调用AddTreeContributions任务把新树的贡献累加到累积预测列上同时把_pred_noise_bandwidth和_seed一并传入new AddTreeContributions( frameMap, ktrees, _parms._pred_noise_bandwidth, _parms._seed, _parms._ntrees, _model._output._ntrees ).doAll(_train);核心的噪声注入逻辑位于AddTreeContributions.map()GBM.javadouble factor 1; if (_pred_noise_bandwidth ! 0) { rand.setSeed(baseseed nid); // bandwidth is a function of tree number, class and node id (but same for all rows in that node) factor rand.nextGaussian() * _pred_noise_bandwidth; } // Prediction stored in Leaf is cut to float to be deterministic in reconstructing // tree_klazz fields from tree prediction ct_vals[row] ((float) (ct.atd(row) factor * ((LeafNode) tree.node(nid))._pred));从这段实现可以提炼出几个关键行为每个叶节点一个共享因子factor由baseseed nid树编号/类别与叶节点 id决定因此落入同一叶节点的所有行共享同一个缩放因子而不同叶节点获得不同的随机缩放。源码注释明确写到 bandwidth is a function of tree number, class and node id (but same for all rows in that node)。对累积预测而非单棵树生效代码把factor * leaf_pred加进跨树累积的预测列ct_vals后续树的拟合会基于这个被噪声污染的累积预测继续迭代从而影响整个提升过程。多分类场景逐类注入外层循环for (int k 0; k _nclass; k)对每一棵树/类别分别处理且baseseed通过(0xDECAF _seed) * (0xFAAAAAAB k * _ntrees1 _ntrees2)与类别编号k绑定保证各类别使用相互独立的噪声序列。与随机种子seed的关系由于因子由baseseed其本身是seed的派生值与叶节点 id 决定该噪声的生成完全由 GBM 的seed参数驱动同一seed下训练噪声序列可完全复现官方 Python 测试 pyunit_PUBDEV_7578_gbm_reproducibility.py 将pred_noise_bandwidth0.0禁用态与复现性断言搭配使用验证了默认关闭时模型可精确复现启用噪声后若想复现实验务必固定seed。参数校验规则在 GBM.java 的init()阶段参数会被严格校验if (_parms._pred_noise_bandwidth 0) error(_pred_noise_bandwidth, pred_noise_bandwidth must be 0.);即传入负数会导致训练直接报错错误信息为pred_noise_bandwidth must be 0.。该默认值0定义在 GBMModel.java 的GBMParameters构造器中public double _pred_noise_bandwidth; // 字段定义 ... _pred_noise_bandwidth 0; // 默认值禁用同时值得注意的是即便sigma取值合法如果噪声使因子为负N(1, sigma)的极端左尾仍可能产生符号异常的叶预测因此实际使用时建议保持sigma相对较小如 0.1~0.5 量级并与seed一起固定以便观察效果。Python 实战训练 GBM 并评估 AUC以下示例完整来自官方参数文档titanic 数据集并保持可直接运行import h2o from h2o.estimators.gbm import H2OGradientBoostingEstimator h2o.init() # 导入 titanic 数据集 # 该数据集用于分类乘客是否幸存1 幸存 / 0 未幸存 titanic h2o.import_file(https://s3.amazonaws.com/h2o-public-test-data/smalldata/gbm_test/titanic.csv) # 将响应列转换为因子类型 titanic[survived] titanic[survived].asfactor() # 设置预测变量名与响应列名 # 预测变量包含除 name 与响应列 (survived) 之外的所有列 predictors titanic.columns del predictors[1:3] response survived # 拆分训练集与验证集 train, valid titanic.split_frame(ratios[.8], seed1234) # 使用 pred_noise_bandwidth 参数训练 titanic_gbm H2OGradientBoostingEstimator(pred_noise_bandwidth0.1, seed1234) titanic_gbm.train(xpredictors, yresponse, training_frametrain, validation_framevalid) # 打印验证集 AUC print(titanic_gbm.auc(validTrue))Python 客户端中该参数的默认值与类型定义见 h2o-py/h2o/estimators/gbm.py默认0.0类型为 float其 docstring 与官方文档一致并在 gbm.py 中提供了配套的 getter/setterproperty def pred_noise_bandwidth(self): return self._parms.get(pred_noise_bandwidth) pred_noise_bandwidth.setter def pred_noise_bandwidth(self, pred_noise_bandwidth): assert_is_type(pred_noise_bandwidth, None, numeric) self._parms[pred_noise_bandwidth] pred_noise_bandwidthR 实战训练 GBM 并评估 AUCR 客户端的等价用法同样来自官方文档示例library(h2o) h2o.init() # 导入 titanic 数据集 # 该数据集用于分类乘客是否幸存1 幸存 / 0 未幸存 titanic - h2o.importFile(https://s3.amazonaws.com/h2o-public-test-data/smalldata/gbm_test/titanic.csv) # 将响应列转换为因子类型 titanic[survived] - as.factor(titanic[survived]) # 设置预测变量名与响应列名 # 预测变量包含除 name 与响应列 (survived) 之外的所有列 predictors - setdiff(colnames(titanic), colnames(titanic)[2:3]) response - survived # 拆分训练集与验证集 titanic_splits - h2o.splitFrame(data titanic, ratios 0.8, seed 1234) train - titanic_splits[[1]] valid - titanic_splits[[2]] # 使用 pred_noise_bandwidth 参数训练 titanic_gbm - h2o.gbm(x predictors, y response, training_frame train, validation_frame valid, pred_noise_bandwidth 0.1, seed 1234) # 打印验证集 AUC print(h2o.auc(titanic_gbm, valid TRUE))R 客户端中该参数位于 h2o-r/h2o-package/R/gbm.R默认值同样为0并在 gbm.R 中由h2o.gbm()组装进参数列表后提交给后端。网格搜索调优pred_noise_bandwidth由于该参数被标记为gridable true你可以直接把它放入超参数空间进行网格搜索。官方示例给出了 Cartesian笛卡尔与 RandomDiscrete随机离散两种策略的用法。Python 网格搜索from h2o.grid.grid_search import H2OGridSearch # 选择参与网格搜索的 pred_noise_bandwidth 取值 # 注意该参数面向比本例大得多的数据集 hyper_params {pred_noise_bandwidth: [0.0, 0.1, 0.3]} # 搜索空间较小时使用笛卡尔网格搜索以观察所有模型的性能 # 搜索空间较大时改用随机网格搜索{strategy: RandomDiscrete} titanic_gbm_2 H2OGradientBoostingEstimator(seed 1234) grid H2OGridSearch(model titanic_gbm_2, hyper_params hyper_params, search_criteria {strategy: Cartesian}) grid.train(x predictors, y response, training_frame train, validation_frame valid) # 按 AUC 降序排序查看网格结果 sorted_grid grid.get_grid(sort_byauc, decreasingTrue) print(sorted_grid)R 网格搜索# pred_noise_bandwidth 的网格搜索取值示例 # 注意该参数面向比本例大得多的数据集 hyper_params - list(pred_noise_bandwidth c(0, 0.1, 0.3)) # 搜索空间较小时使用笛卡尔网格搜索以观察所有模型的性能 # 搜索空间较大时改用随机网格搜索list(strategy RandomDiscrete) grid - h2o.grid(x predictors, y response, training_frame train, validation_frame valid, algorithm gbm, grid_id titanic_grid, hyper_params hyper_params, search_criteria list(strategy Cartesian), seed 1234) # 按 AUC 降序排序查看网格结果 sorted_grid - h2o.getGrid(titanic_grid, sort_by auc, decreasing TRUE) sorted_grid官方文档特别提醒该参数的设计目标是远大于示例数据规模的数据集。在小数据集如仅 1000 余行的 titanic上噪声注入带来的差异可能不明显建议在大规模数据上使用网格搜索寻找合适的sigma取值。源码级验证官方测试用例仓库中的测试为这一参数的实际行为提供了可验证依据Java 单测GBMTest.java 中的testHuberNoise在 BostonHousing 数据上以distribution huber、huber_alpha 0.9、pred_noise_bandwidth 0.2、seed 0xdecaf训练 GBM并断言训练集 MSE 为4.8056900203、平均残差偏差为2.5683696486误差允许范围内。这同时验证了固定 seed 时噪声注入结果可复现以及噪声可与 Huber 分布等非高斯分布联合使用。Python 测试pyunit_ecology_gbm_random_noise.py在 ecology 数据集上以pred_noise_bandwidth0.5训练 GBM验证该参数在真实数据上的训练流程可正常完成。使用建议与注意事项先固定 seed 再比较噪声序列完全由seed驱动见上文baseseed的计算比较不同sigma的效果时务必保持seed一致否则观测到的差异可能来自随机种子本身。从较小带宽开始sigma过大会让叶预测的随机缩放幅度过大破坏提升过程的方向性官方示例的网格取值0.0、0.1、0.3可以作为起步参考。结合验证集/交叉验证评估该参数属于正则化手段应在验证集 AUC或其他评估指标上评估其增益而不是只看训练集指标。数据规模决定其价值该参数面向大规模数据设计小数据集上建议保持默认值0禁用。输入必须非负传入负数会在参数校验阶段直接报错错误信息为pred_noise_bandwidth must be 0.。相关文档参数官方文档h2o-docs/src/product/data-science/algo-params/pred_noise_bandwidth.rstREST Schema 定义GBMV3.java训练期噪声注入实现GBM.java、GBM.java参数默认值与校验GBMModel.java、GBM.javaPython API 定义h2o-py/h2o/estimators/gbm.pyR API 定义h2o-r/h2o-package/R/gbm.R测试用例GBMTest.java、pyunit_ecology_gbm_random_noise.py赞分享机器学习深度学习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 GBM 学习率退火learn_rate_annealing参数详解原理、公式与实战调参H2O 3 GBM 学习率退火learn_rate_annealing参数详解原理、公式与实战调参 learn_rate_annealing 是 H2O机器学习深度学习AutoML大数据后端Natron 噪声节点完全指南Rand 与 Noise 节点的参数、原理与实战用法Natron 噪声节点完全指南Rand 与 Noise 节点的参数、原理与实战用法 Natron 的 Draw 节点组工具栏中的铅笔图标下提供了两个与噪声音视频视频处理图形学桌面应用H2O-3 GBM 可复现性完全指南单节点与多节点集群的确定性训练实践H2O 3 GBM 可复现性完全指南单节点与多节点集群的确定性训练实践 本文围绕 H2O 3 官方 GBM 常见问题文档 h2o docs/src/prod机器学习深度学习AutoML大数据后端上一篇localGPT脚本索引创建命令行批量处理的自动化方案下一篇零信任防护Capacitor跨平台应用安全加固指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑