机器学习深度学习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 分布式机器学习平台当前仓库h2o-3中 GBM、DRF、Uplift DRF 三类树模型的sample_rate_per_class参数展开介绍其在不平衡分类数据上的按类别分层采样机制、取值与校验规则、与全局sample_rate的优先级关系并结合源码与单元测试剖析其底层实现最终给出 R 与 Python 双语言的可运行实战示例与超参调优建议。阅读完本文你将掌握如何对多数类降采样、对少数类按需调整采样比例以改善不平衡数据下的分类模型表现。参数概览属性说明可用算法GBM、DRF、Uplift DRF是否超参数是可参与网格搜索默认值未指定时为null此时回退到全局sample_rate取值范围文档声明为 0.01.0源码实际校验要求每个值落在开区间(0, 1]即严格大于 0 且小于等于 1数据类型浮点数数组长度必须等于响应变量的类别数该参数的官方定义位于 sample_rate_per_class.rst当训练数据类别严重不平衡时此选项要求集成中每棵树都从完整训练数据集中按每个类别各自的采样率进行无放回抽样而不是像sample_rate那样使用一个全局采样因子。核心机制按类别分层采样与全局sample_rate的关系当sample_rate_per_class被显式指定时sample_rate将被忽略该约束同时写在官方文档与本仓库源码中。若不指定sample_rate_per_class树模型退回到sample_rate全局行采样在 SharedTreeModel.java 中可以看到基类默认_sample_rate 0.632DRF 即此默认值而 GBM 在具体实现中默认值为 1同时useRowSampling()判定只要_sample_rate 1或_sample_rate_per_class ! null即启用行采样。数组语义每类一个采样率数组中的第 i 个元素对应响应变量按**字典序排列lexicographic order**的第 i 个类别的行采样率。以 CovType 数据集7 类森林覆盖类型为例数组长度必须为 71表示该类 100% 保留0.4表示该类仅保留 40% 的行通过给少数类更高的比例、给多数类更低的比例即可实现对多数类降采样、对少数类过采样的类间平衡同时每一类内部仍然是无放回随机抽样。源码级工作机制参数的实际校验发生在 SharedTree.java 的validateRowSampleRate()方法中protected void validateRowSampleRate() { if (!(0.0 _parms._sample_rate _parms._sample_rate 1.0)) error(_sample_rate, sample_rate should be in interval ]0,1] but it is _parms._sample_rate .); if (_parms._sample_rate_per_class ! null) { warn(_sample_rate, _sample_rate is ignored if _sample_rate_per_class is specified.); if (_parms._sample_rate_per_class.length ! nclasses()) error(_sample_rate_per_class, _sample_rate_per_class must have nclasses() values (one per class).); for (int i0;i_parms._sample_rate_per_class.length;i) { if (!(0.0 _parms._sample_rate_per_class[i] _parms._sample_rate_per_class[i] 1.0)) error(_sample_rate_per_class, sample_rate_per_class for class response().domain()[i] should be in interval ]0,1] but it is _parms._sample_rate_per_class[i] .); } } }从中可以确认三点实现细节长度校验数组长度必须与类别数nclasses()严格一致否则直接报错不会静默截断或补全取值校验官方文档表述的 0.01.0 区间在代码层面被进一步收紧为(0, 1]即值为0会触发异常需注意 0.0 与 1.0 的边界差异优先级警告指定该参数后系统会对sample_rate发出_sample_rate is ignored if _sample_rate_per_class is specified的警告而非报错。实际抽样逻辑由hex.tree.Sample任务完成见 Sample.javafor (int row 0; row nids._len; row) { boolean skip ys.isNA(row); if (!skip) { double rate _rate_per_classnull ? _rate : _rate_per_class[(int)ys.at8(row)]; rand.setSeed(_seed row nids.start()); //seeding is independent of chunking skip rand.nextFloat() rate; //float is good enough, half as much cost } if (skip) is[row] _ignoreMarker; // Flag row as being ignored by sampling else if (_useMarker ! 0) is[row] _useMarker; }从源码结构可以推断出该实现的关键特征对每个类取对应的_rate_per_class[class]与全局_rate二选一抽样结果只是标记行OUT_OF_BAG等 marker而非真正拷贝数据分布式框架下按块chunk独立处理、行号偏移参与随机种子生成从而保证抽样确定性与分块无关即同样的seed在不同节点数下可复现被抽掉的行不参与该棵树的直方图统计与分裂达到“每棵树数据不同”的随机森林/随机梯度提升效果。该Sample任务被三个算法分别调用DRF 见 DRF.javaGBM 见 GBM.javaUplift DRF 见 UpliftDRF.java。需要注意的概率影响在 SharedTree.java 中训练阶段会输出如下日志Sample rates per tree (this affects the distribution of probabilities): sample rate for class class-name : rate这意味着按类采样会改变每棵树的训练类分布进而影响最终预测概率的分布。这是使用该参数时必须理解的副作用——它不是简单的“数据增强”而是刻意改变模型看到的类先验。若需要以校正后的概率输出如校准到原始类分布可结合校准calibration机制使用。与相关参数的分工参数作用维度与sample_rate_per_class的关系sample_rate行x 轴全局采样被sample_rate_per_class覆盖忽略并告警col_sample_rate列y 轴采样默认 1.0二者可同时启用互不冲突一个控制行、一个控制列col_sample_rate_per_tree每棵树列采样与col_sample_rate相乘生效同样可与行采样组合sample_rate官方文档见 sample_rate.rst其明确指出“对于高度不平衡的分类数据集基于响应类别的分层行采样有助于提升预测精度可通过sample_rate_per_class按字典序为每个响应类别一个比例的数组配置”。col_sample_rate官方文档见 col_sample_rate.rst行采样与列采样可同时改善泛化能力降低验证集与测试集误差。实践中建议对大型数据集将行、列采样率取 0.70.8 区间而针对类别不平衡场景则应优先考虑sample_rate_per_class逐类控制。完整实战示例CovType 不平衡分类以下示例完整继承自官方文档使用 CovType 数据集用于识别森林覆盖类型响应变量共 7 类。示例将 Class 2 降采样到 40%其余类别保持 100%。Python 版本import h2o from h2o.estimators.gbm import H2OGradientBoostingEstimator h2o.init() # 导入 covtype 数据集 covtype h2o.import_file(https://s3.amazonaws.com/h2o-public-test-data/smalldata/covtype/covtype.20k.data) # 将响应列转换为因子类型 covtype[54] covtype[54].asfactor() # 设置预测变量名与响应列名 predictors covtype.columns[0:54] response C55 # 划分训练集与验证集 train, valid covtype.split_frame(ratios [.8], seed 1234) # 查看训练集中每个类别的样本计数 print(train[response].table()) # 使用 sample_rate_per_class # 对 Class 2 降采样其余类别保持不变 rate_per_class_list [1, .4, 1, 1, 1, 1, 1] cov_gbm H2OGradientBoostingEstimator(sample_rate_per_class rate_per_class_list, seed 1234) cov_gbm.train(x predictors, y response, training_frame train, validation_frame valid) # 打印验证集上的 logloss print(logloss, cov_gbm.logloss(valid True))R 版本library(h2o) h2o.init() # 导入 covtype 数据集 covtype - h2o.importFile(https://s3.amazonaws.com/h2o-public-test-data/smalldata/covtype/covtype.20k.data) # 将响应列转换为因子类型 covtype[, 55] - as.factor(covtype[, 55]) # 设置预测变量名与响应列名 predictors - colnames(covtype[1:54]) response - C55 # 划分训练集与验证集 covtype_splits - h2o.splitFrame(data covtype, ratios 0.8, seed 1234) train - covtype_splits[[1]] valid - covtype_splits[[2]] # 查看训练集中每个类别的样本计数 h2o.table(train[response]) # 使用 sample_rate_per_class # 对 Class 2 降采样其余类别保持不变 rate_per_class_list - c(1, 0.4, 1, 1, 1, 1, 1) cov_gbm - h2o.gbm(x predictors, y response, training_frame train, validation_frame valid, sample_rate_per_class rate_per_class_list, seed 1234) # 打印验证集上的 logloss print(h2o.logloss(cov_gbm, valid TRUE))示例关键点拆解训练前先用train[response].table()Python或h2o.table(train[response])R确认各类别分布从而针对性设计采样率数组数组下标与类别按字典序一一对应示例中把相对过大的 Class 2 采样率降至 0.4实现对该类的随机降采样使用seed 1234保证划分、采样与建模可复现结果指标采用logloss多分类对数损失训练完成后在验证集上评估。超参数搜索与调优建议由于sample_rate_per_class标记为“Hyperparameter: yes”它可以直接放入网格搜索的超参空间中。注意其取值本身是一个数组网格搜索时应对应传入数组类型的候选值。调优时建议先统计类别分布观察少数类与多数类的比例将采样率数组的初值设为少数类保留 1.0、多数类按比例下调如 0.30.8与全局采样错开使用只要设置了sample_rate_per_classsample_rate就会被忽略因此不要同时设置两者避免混淆结合col_sample_rate行类间平衡与列特征多样性两个维度的随机性可以叠加进一步提升泛化配合balance_classes取舍仓库源码中还存在独立的balance_classes类平衡过采样机制见 SharedTree.java它基于class_sampling_factors与max_after_balance_size在训练帧层面做分层重采样而sample_rate_per_class是在每棵树构建层面控制行抽样两者作用层面不同可根据是否需要对整帧重采样来分别选择。源码与测试佐证参数定义SharedTreeModel.java 中public double[] _sample_rate_per_class; //fraction of rows to sample for each tree, per class且useRowSampling()将它与sample_rate一起纳入行采样开关。Schema 暴露sample_rate_per_class在 REST/Schema 层出现于 SharedTreeV3.java并分别被 GBMGBMV3.java、DRFDRFV3.java、Uplift DRFUpliftDRFV3.java纳入算法参数列表印证了文档所述的三种可用算法。单元测试GBM 的sampleRatePerClass()测试见 GBMTest.java它使用 CovType 数据设置parms._sample_rate_per_class new double[]{0.1f, 0.1f, 0.2f, 0.4f, 1f, 0.3f, 0.2f}7 类各一个采样率并以learn_rate0.05、ntrees10、max_depth5完成一次完整训练可作为该参数在真实数据上被正确消费的回归验证DRF 侧同样存在按类采样率的测试配置见 DRFTest.java说明 DRF 对该参数的支持不是文档层面的“纸面能力”而是有实际训练路径覆盖的实现事实。常见误区与注意事项汇总数组长度错误会直接报错_sample_rate_per_class must have N values (one per class)N 为响应变量类别数不是特征数值为 0 不合法源码校验区间为(0, 1]想“完全剔除某类”应改用更小的正数或考虑其他类平衡手段sample_rate会被忽略但仅告警日志出现 “_sample_rate is ignored if _sample_rate_per_class is specified” 属于预期行为不是错误类顺序按字典序数组元素必须与train[response].table()中显示的类别字典序一致顺序错位会导致采样“张冠李戴”影响概率分布按类采样改变了每棵树的训练类分布最终预测概率会随之偏移必要时结合模型校准修正可复现性依赖seed抽样采用与行号相关的确定性随机种子设置固定seed才能跨运行复现同样的抽样结果。结语sample_rate_per_class是 H2O-3 树模型中处理不平衡分类数据最细粒度的行采样控制手段它把全局的sample_rate拆解为逐类的采样率数组在保持无放回随机抽样的同时让数据科学家可以精确调节每个类别在每棵树中的“曝光度”。本文给出的参数校验源码、Sample抽样实现、CovType 双语言示例及 GBM/DRF 单元测试路径共同构成了从“如何用”到“为什么这样实现”的完整闭环可作为后续调参与阅读 GBM、DRF、Uplift DRF 源码的入口。赞分享机器学习深度学习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 中 sample_rate 行采样率参数详解GBM、DRF、XGBoost 与 Isolation Forest 的默认值、源码校验与调参实战H2O 中 sample_rate 行采样率参数详解GBM、DRF、XGBoost 与 Isolation Forest 的默认值、源码校验与调参实战 sam机器学习深度学习AutoML大数据后端终极NLP教程如何在100行代码内掌握自然语言处理核心技术终极NLP教程如何在100行代码内掌握自然语言处理核心技术 想要快速掌握自然语言处理的核心技术却不知从何开始nlp tutorial项目为你提供了一套完整示例工程Seed-VC零样本语音转换的技术架构与工程实践Seed VC零样本语音转换的技术架构与工程实践 语音克隆的技术挑战与算法突破 在语音合成领域零样本语音转换长期面临三大技术障碍声纹特征提取的精确度不足、人工智能语音音频上一篇awesome-python-login-model容器化部署Kubernetes集群配置指南下一篇Czkawka 重复文件清理工具完整使用指南从安装到清出空间创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考