资讯动态

H2O GBM 构建第一棵树:输入参数、数据预处理与直方图分箱机制全解

发布时间:2026/10/15 1:55:57 来源:尧图企业网站定制
机器学习深度学习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 中训练一个 GBM梯度提升树模型最核心的起点是回答一个问题构建第一棵树需要哪些参数本篇文章以官方 FAQ 文档《Building the First Tree》为主体骨架完整梳理从training_frame到balance_classes等输入参数的语义、默认值与使用场景并进一步结合 H2O 源码讲清两件事建树前数据是否被排序/洗牌/预处理以及第一棵树的 split 是如何通过直方图分箱被决定的。读完本文你将能独立完成一个 GBM 模型的最小可运行配置并理解其背后的实现原理为后续调参见 Tuning a GBM打下基础。一、构建 GBM 模型所需的输入参数全景官方文档明确指出构建一个 GBM 模型时用到的参数分为两类必需参数与可选参数。其中真正强制要求的只有训练数据框和响应列其余均可按需省略使用 H2O 内置默认值。参数是否必需作用training_frame必需指定训练所用的 H2O Frame数据框模型的所有树都基于该数据框构建validation_frame可选指定验证数据框用于在训练过程中评估模型、驱动早停与网格搜索选优response_column必需指定响应变量目标列决定了问题的类型回归 / 二分类 / 多分类ignored_columns可选指定训练时要忽略的列名列表这些列不参与任何 splitignore_const_cols可选是否忽略常量列取值恒定不变的列默认开启balance_classes可选是否对类别不平衡做重采样平衡仅对分类问题有效以上参数定义均可在核心 REST 参数 Schema 中找到对应实现ModelParametersSchemaV3.java 中定义了training_frame#L43-L49、response_column#L86-L90以及ignored_columns/ignore_const_cols#L131-L138。1.1 training_frame 与 validation_frame训练与验证的数据边界training_frame是构建模型的唯一数据来源。H2O 的 GBM 直接基于 H2O Frame 训练因此在调用建模前需要先通过 parse 将数据加载为 Frame可以是 CSV、Parquet、ORC、Hive 等来源。validation_frame不是必需的但强烈建议提供它一方面用于输出独立的验证集指标另一方面是stopping_rounds/stopping_metric/stopping_tolerance驱动的早停机制以及交叉验证结果评估的基础详见 FAQ 文档 Scoring。1.2 response_column决定模型类别的关键response_column指定响应列后H2O 会根据响应列的数据类型自动推导模型类别响应列为数值numeric构建回归模型响应列为二分类因子2-class categorical构建二分类binomial模型响应列为多分类因子≥3 类构建多分类multinomial模型。这一点在 GBM.java 的init()中体现得很直接当distribution AUTO时源码依据响应列的类别数自动选择分布族#L101-L105if (_parms._distribution DistributionFamily.AUTO) { if (_nclass 1) _parms._distribution DistributionFamily.gaussian; // 回归 if (_nclass 2) _parms._distribution DistributionFamily.bernoulli; // 二分类 if (_nclass 3) _parms._distribution DistributionFamily.multinomial;// 多分类 }同时init()还会对distribution与响应类型做严格校验例如bernoulli要求响应为二分类因子、multinomial要求响应为分类列、tweedie/quantile等要求响应为数值列#L133-L179。若配置不匹配H2O 会直接报错拒绝训练。1.3 ignored_columns 与 ignore_const_cols剔除无用特征ignored_columns显式列出不需要参与训练的特征名。REST Schema 中标注了它与其他关键列的互斥约束——ignored_columns与response_column、weights_column、offset_column、fold_column互斥即被忽略的列不能同时被指定为响应列/权重列等ModelParametersSchemaV3.java#L86-L112。ignore_const_cols默认true自动丢弃所有常量列。常量列无法提供任何 split 信息保留它们只会浪费直方图构建的计算资源。1.4 一个最小的可运行示例在 Python 客户端中一个只使用必需参数构建 GBM 的最小调用如下import h2o from h2o.estimators import H2OGradientBoostingEstimator h2o.init() train h2o.import_file(train.csv) train[y] train[y].asfactor() # 将响应列转为因子构建二分类 model H2OGradientBoostingEstimator( ntrees50, # 树的数量默认 50 max_depth5, # 最大深度默认 5 ) model.train( training_frametrain, response_columny, )GradientBoostingEstimator 的完整参数清单由 GBMV3.java 中的fields数组定义#L12-L77包括上表参数以及ntrees、max_depth、min_rows、nbins、learn_rate、histogram_type、sample_rate、col_sample_rate等全部建树控制项它们共同决定了第一棵树乃至每一棵树的形态。二、balance_classes类别不平衡的内置处理balance_classes默认false是 FAQ 文档中列出的最后一个可选参数用于应对分类任务中的类别不平衡问题。开启后H2O 会对训练数据做重采样使各类别在训练时获得大致均衡的权重其配套参数在 SharedTreeV3.java 中定义#L20-L34class_sampling_factors手动指定每个类别按字典序的过采样/欠采样比率若不指定H2O 会自动计算采样因子以达到类别均衡。使用前提是必须开启balance_classes。max_after_balance_size类别平衡后训练数据相对原始数据的最大规模倍数可以小于 1.0。同样要求先开启balance_classes用于限制过采样带来的数据膨胀避免内存与训练时间失控。需要注意两点balance_classes只对分类问题有意义回归任务中该参数不生效它改变的是训练时的样本权重分配不会改变原始 Frame 的行数因此不会对验证集评分造成污染。三、从参数校验到第一棵树训练链路概览当所有参数校验通过后H2O 会经历一条清晰的训练链路源码均位于 h2o-algos/src/main/java/hex/tree/gbm/GBM继承自SharedTree是模型构建器入口trainModelImpl()返回GBMDriver实例GBM.java#L61-L63GBMDriver.buildNextKTrees()是每轮建树的引擎#L464 附近先通过DistributionFactory.getDistribution(_parms)取得分布族实现再调用ComputePredAndRes计算预测值与残差、GammaPass等任务最后逐层逐节点生长下一批树每棵树的每个节点处由ScoreBuildHistogram一个分布式MRTask见 ScoreBuildHistogram.java#L31扫描全部落点数据为每个备选特征构建直方图再依据平方误差squared error等准则挑选最优切分点。可以这样理解training_frame、response_column等输入参数定义了“用什么数据、预测什么目标”而nbins、histogram_type、max_depth、min_rows等参数则直接控制“第一棵树长成什么样”。四、建树前的预处理不排序、不洗牌、不手工编码FAQ 文档《Preprocessing Steps》详细回答了建树前数据预处理的一系列问题这些结论与“构建第一棵树”直接相关4.1 算法不依赖数据顺序无需排序与洗牌不排序H2O GBM 不需要对数据做任何排序。整个训练过程是迭代式的可以无修改地扩展到超大数据集。不洗牌算法不依赖数据的排列顺序因此训练前无需 shuffle。官方文档也坦诚说明排序式方法在小数据集上可能更快H2O 的可扩展方案在小数据上未必是最快路径这是刻意取舍。4.2 分类变量自动编码无需手工处理H2O自动处理分类变量的 level用户不需要做 one-hot 编码。Frame 在解析时就把因子内部存储为整数并维护一张“整数 → 字符串”的映射表。缺失值与分类数据同样由算法自动处理用户无需任何预处理详见 Missing Values。从源码看categorical_encoding参数默认AUTO提供了Enum、OneHotInternal、Binary、Eigen等编码方案可选但对 GBM 而言默认的枚举编码整数存储 映射表已足够高效。4.3 特征分布与直方图类型建树前算法不会预先计算每个特征的分布与分位数——这恰好是histogram_type参数存在的意义默认AUTO通常落到uniformAdaptive每个特征被分入等步长而非等人口的桶中。这是最快的方法通常表现良好但特征分布严重偏斜时可能导致切分点不够精确。quantilesGlobal基于分位数的分箱桶内人口大致相等能够考虑特征分布适合处理高度偏斜的特征详见下文第五节。FAQ 明确建议如果特征尾部高度偏斜或存在大离群值可以新增一个预分箱列如 small/median/giant 分类或做 log 变换并保留原始列。五、直方图与分箱第一棵树的 split 如何产生“构建第一棵树”本质上是逐层寻找最优切分点而切分点来自直方图。FAQ 文档《Histograms and Binning》对此给出了权威解释。5.1 直方图是“每个节点”而不是“每个特征”构建的GBM不会在建树前为每个特征预建全局直方图而是在每个节点处、仅用落入该节点的样本为每个特征构建直方图——因为直方图决定了“在哪里切分”必须基于节点数据。当节点内观测数很少但大于 10而nbins保持默认 20 时会出现空桶——没有足够观测填满每个桶是正常现象。每一层构建时H2O 会为每个节点、每个候选列构建精确直方图并遍历全部数据完成这些直方图完成当前层后再分析下一层应该如何构建见 histograms_and_binning.rst 中“How is each level created?”一节。这就是“避免排序与洗牌但以数据全扫描为代价”的实现路径。5.2 数值列分箱UniformAdaptive 与 QuantilesGlobal分箱模式实现方式适用场景UniformAdaptive默认等宽直方图桶宽根据节点内该列数据的实际范围自适应调整大部分常规数据速度最快QuantilesGlobal先为每个数值列计算nbins个分位数再把每个分位桶两分位数之间均匀细化/填充为nbins_top_level个桶此后所有层级共用这组切分点每个叶子节点直方图再按自身 population 范围做 min/max 调整并线性细化到恰好nbins个桶特征分布高度偏斜、含大量离群值的数据整型列若细化后桶数超过唯一取值数会回退到纯整型桶FAQ 特别举过一个等宽分箱的极端例子某整型列只出现-9999, 0, 1, 2, 3, 4默认nbins_top_level 1024时桶宽约 10结果几乎所有桶都是空的只剩[-9999]与[0,1,2,3,4]两端有数据。此时基于平方误差的切分准则可能不会切开这两端除非该列的误差下降足够大——这正是考虑使用分位数直方图的原因。5.3 分类列分箱字典序分组与 bitset 编码nbins_cats控制分类分箱默认 1024。因子如 dog/cat/mouse按字典序映射到名称查找数组的索引cat→0, dog→1, mouse→2。这是实现细节映射关系只要保持一致即可。当类别数少于nbins_cats时每个唯一 level 独占一个桶一次切分即可完美分离所有 level当类别数多于nbins_cats时类别按字典序分组如 A/B/C、D/E/F 一组同组 level 在同一层切分中走相同方向只能在更深的树层继续细分或永远不再细分。Java 实现中分类切分通过bitset编码在某切分点一部分桶被送入左分支其余进右分支最优切分通过对桶按响应值排序、在排序后的桶中找最优切分点、再还原排序求得。这些 bitset 在 POJO 中编码为 byte 数组每个 byte 打印为 -128..127 的整数。与 one-hot 编码对比one-hot 会增加列数列采样可能只选中部分因子 level 参与切分决策仅当 animalcat 走左而分箱方式一旦选中分类列每个 level 都参与切分cat 或 dog 或 mouse 走左其余走右。因此分箱拟合更精确但也更易过拟合——这正是需要认真调nbins_cats的原因。5.4 与分箱相关的关键默认值源码确认从 SharedTreeModel.java 的SharedTreeParameters#L49-L98可以直接读出 GBM 分箱相关的硬编码默认值参数默认值含义nbins20数值列直方图的桶数nbins_top_level1024110数值列顶层第一层的最大桶数nbins_cats1024分类列直方图的桶数histogram_typeAUTO直方图类型UniformAdaptive/QuantilesGlobal/Random/RoundRobin/UniformRobustmin_split_improvement1e-5触发切分所需的最小相对平方误差改进六、默认值策略先跑基准再网格搜索FAQ 文档《Default Values》给出明确建议GBM 的默认值是为了“快速产出、结果尚可”而设计的并非为了追求最优模型性能。应当先用默认值跑出一个性能基准benchmark然后总是使用网格搜索 交叉验证来调整超参数。也就是说直接调用H2OGradientBoostingEstimator()不传任何参数即可得到一个合法可运行的基线模型但它只是起点。GBM 相关的全部默认值都可以在源码中核实SharedTreeModel.java#L49-L98、GBMModel.java#L33-L35参数默认值ntrees50max_depth5min_rows10sample_rate0.632每棵树行采样比例col_sample_rate1.0col_sample_rate_per_tree1.0learn_rate0.1learn_rate_annealing1.0r2_stoppingDouble.MAX_VALUE即默认不启用score_tree_interval0表示由 H2O 自动决定评分节奏七、从第一棵树到完整模型调参与列采样构建第一棵树之后整个模型在迭代中生长相关的调参知识也属于“建树”主题的延伸详见 Tuning a GBM调参参数清单offset_column、weights_column、nbins_top_level、nbins_cats、nbins、ntrees、max_depth、min_rows、learn_rate、r2_stopping、stopping_rounds、stopping_metric、stopping_tolerance、max_runtime_secs、learn_rate_annealing、quantile_alpha、tweedie_power、huber_alpha。列采样的两级机制col_sample_rate_per_tree决定每棵树随机挑选多少比例的列col_sample_rate再在“每树可用列”中按比例挑选参与每次切分决策的列。FAQ 给出了一个具体例子100 列数据集col_sample_rate_per_tree0.754、col_sample_rate0.8每棵树先随机取floor(0.754×100)75列每次切分再从这 75 列中随机取floor(0.754×0.8×100)60列。源码中col_sample_rate_change_per_level还允许逐层改变列采样率SharedTreeModel.java#L97-L102。早停三件套stopping_rounds设为 ≥1 即开启早停、stopping_tolerance、stopping_metric配套score_tree_interval或score_each_iteration控制评分频次——因为早停统计的是“已完成的评分迭代数”小而规律的评分间隔对早停控制最有效。max_runtime_secs则是基于墙钟时间而非验证数据的另一种提前终止手段。最重要的参数组合learn_rate与ntrees。学习率越低达到同样拟合水平所需的树越多但更不容易过拟合——一般来说在算力允许的前提下尽量压低学习率。结语回到“构建第一棵树”这个问题本身H2O GBM 只需要一个训练框和一根响应列即可开始建树其余输入参数都在控制“这棵树怎么长”。数据无需排序、无需洗牌、分类无需手工编码树内的每个节点通过遍历落点数据构建直方图来寻找最优切分而nbins、nbins_cats、histogram_type等分箱参数直接决定了切分质量的边界。理解了这些输入参数与底层机制你就能在 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-Lite Binning 完全指南直方图、分箱颜色与预分箱数据处理Vega Lite Binning 完全指南直方图、分箱颜色与预分箱数据处理 Binning分箱是 Vega Lite 中最常用的数据处理手段之一它将连数据可视化H2O-3 GBM / DRF 分类不平衡数据采样参数 sample_rate_per_class 全面解析H2O 3 GBM / DRF 分类不平衡数据采样参数 sample_rate_per_class 全面解析 导读 本文围绕 H2O 3 分布式机器学习平台当机器学习深度学习AutoML大数据后端H2O-3 GBM 学习率退火learn_rate_annealing参数详解原理、公式与实战调参H2O 3 GBM 学习率退火learn_rate_annealing参数详解原理、公式与实战调参 learn_rate_annealing 是 H2O机器学习深度学习AutoML大数据后端上一篇Multiverse-Core 项目推荐下一篇Plot社区贡献指南如何为这个开源项目添加新功能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑