资讯动态

H2O-3 中 keep_cross_validation_predictions 参数完全指南:如何保存并利用交叉验证留出预测

发布时间:2026/9/29 2:34:54 来源:尧图企业网站定制
机器学习深度学习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 机器学习平台中的keep_cross_validation_predictions参数展开说明如何在构建带 K 折交叉验证的模型时把每个折fold上留出样本holdout的预测结果持久化保存下来并在 R 与 Python 客户端中获取这些预测帧。读完本文你将理解该参数的适用算法、默认行为、底层实现原理对应nfolds1个模型的训练与预测帧的合并逻辑并能直接复现代码示例完成交叉验证预测的导出、拼接与进一步分析如 Stacked Ensemble 的次级训练数据。参数速览属性值参数名keep_cross_validation_predictions类型布尔型boolean默认值False禁用是否为超参数Hyperparameter否适用算法GBM、DRF、Deep Learning、GLM、GAM、Naïve-Bayes、K-Means、XGBoost、AutoML上述适用范围可直接在仓库中的算法 Schema 文件中得到印证例如 GBMV3.java、DeepLearningV3.java、GLMV3.java、KMeansV3.java、NaiveBayesV3.java 等均声明了该字段Python 客户端一侧gbm.py、random_forest.py、deeplearning.py、glm.py、xgboost.py 等 Estimator 构造器中也都带有keep_cross_validation_predictionsFalse的默认入参。背景H2O 的 N 折交叉验证是如何构建模型的在深入参数之前先明确 H2O 交叉验证的构建模型机制这一点与keep_cross_validation_predictions的行为直接相关。K 折交叉验证用于在模型内部验证性能从而不必单独牺牲一个验证集。在构建交叉验证模型时H2O 会构建nfolds 1个模型nfolds个交叉验证模型cross-validation models每个模型在(nfolds-1)/nfolds的训练数据上训练1 个覆盖全部训练数据的主模型overarching model / main model。例如指定nfolds5H2O 会构建 6 个模型前 5 个为交叉验证模型各在 80% 的训练数据上训练并对各自的 20% 留出数据做预测最后 1 个主模型在 100% 的训练数据上训练。你最终从 R、Python、Flow 中拿到的就是主模型交叉验证模型同样被保存并可事后访问。更完整的交叉验证原理见仓库文档 cross-validation.rst。每个交叉验证模型都会针对自己那一折的留出数据产生一个预测帧。默认情况下这些预测帧在完成打分后即被丢弃keep_cross_validation_predictionsTRUE的作用就是要求 H2O 在打分结束后保留这些预测帧供后续检索使用。参数作用与留出预测帧的形态启用keep_cross_validation_predictions后每个折的预测帧会以独立 H2O Frame 的形式保存在集群的 DKVDistributed Key-Value store中。这些帧有两个显著特征详见 cross-validation.rst命名规律预测帧名称形如prediction_GBM_model_1452035702801_1_cv_1即prediction_算法_model_模型key_折号的结构其中包含该折的编号cv_1、cv_2…。行数与填充每个预测帧的行数与完整训练帧相同凡不属于该折留出数据的行预测值以0填充。也就是说把每个折的预测帧逐行相加就能还原出每一行都由未见过该行的模型给出的完整留出预测。这一展开到全训练行数并用 0 填充的行为在 Python 客户端的文档字符串中也有明确描述见 model_base.pythe predictions are expanded to the full number of rows of the training data, with 0 fill-in。底层实现源码级解析1. 参数定义与默认值核心参数定义位于 Model.javapublic int _nfolds 0; public boolean _keep_cross_validation_models true; public boolean _keep_cross_validation_predictions false; public int _keep_cross_validation_predictions_precision -1;_keep_cross_validation_predictions默认false与文档默认禁用一致相邻的_keep_cross_validation_predictions_precision默认-1即 AUTO用于控制留出预测的存储精度-1AUTO分类问题存储 8 位小数非分类问题不限制精度0禁用不应用精度截断逻辑正整数如分类问题设为 4只保留前 4 位小数可节省约 75% 内存设为 8 可节省约 50% 内存。也就是说在开启本参数保存预测的同时还可以通过精度参数在预测精度与内存占用之间做权衡。2. 预测帧的生成条件在 ModelBuilder.java 的交叉验证打分循环中是否真正为每个折生成并保留预测帧由以下条件决定if (nclasses() 2 /* need holdout predictions for gains/lift table */ || _parms._keep_cross_validation_predictions || (cvModel.isDistributionHuber() /*need to compute quantiles on abs error of holdout predictions*/)) { ... Model.PredictScoreResult result cvModel.predictScoreImpl(cvValid, adaptFr, predName, _job, true, ...); preds result.getPredictions(); ... }值得注意的推断即使不开启keep_cross_validation_predictions对于二分类问题nclasses()2以及 Huber 分布模型H2O 内部也会临时计算留出预测——前者是为了生成 gains/lift 表后者是为了计算绝对误差分位数。区别在于参数未开启时这些预测在收尾阶段会被删除只有显式开启时才会保留并暴露给用户。3. 主模型输出中挂载预测帧在 ModelBuilder.java 的cv_mainModelScores阶段mainModel._output._cross_validation_predictions _parms._keep_cross_validation_predictions ? predKeys : null; ... if (_parms._keep_cross_validation_predictions || (nclasses()2 /*GainsLift needs this*/ || mainModel.isDistributionHuber())) { KeyFrame cvhp Key.make(cv_holdout_prediction_ mainModel._key.toString()); if (_parms._keep_cross_validation_predictions) //only show the user if they asked for it mainModel._output._cross_validation_holdout_predictions_frame_id cvhp; holdoutPreds combineHoldoutPredictions(predKeys, cvhp); }每个折的预测帧 key 数组被存入mainModel._output._cross_validation_predictions各折预测帧再通过combineHoldoutPredictions(predKeys, cvhp)合并为一个覆盖全部训练行的留出预测帧其 key 为cv_holdout_prediction_主模型key存于_cross_validation_holdout_predictions_frame_id——这正是主模型交叉验证指标_cross_validation_metrics计算时打分的对象。对应地模型输出结构在 Model.java 中定义/** List of Keys to cross-validation models (non-null iff _parms._nfolds 1 or _parms._fold_column ! null) **/ public Key _cross_validation_models[]; /** List of Keys to cross-validation predictions (if requested) **/ public Key _cross_validation_predictions[]; public KeyFrame _cross_validation_holdout_predictions_frame_id; public KeyFrame _cross_validation_fold_assignment_frame_id;4. 保留还是删除收尾阶段ModelBuilder.java会对预测帧做分流处理if (_parms._keep_cross_validation_predictions) { for (KeyFrame k : predKeys) { Frame fr DKV.getGet(k); if (fr ! null) Scope.untrack(fr); } } else { int count Model.deleteAll(predKeys); Log.info(count CV predictions were removed); }开启时各折预测帧被移出 Scope 跟踪并留在 DKV 中供用户访问未开启时全部预测帧被删除并记入日志。同时模型在删除时也会连带清理其挂载的预测帧参见 Model.java 的deleteAll(_output._cross_validation_predictions)调用。实战示例完整可运行的 R 与 Python 代码以下示例来自该参数的官方文档keep_cross_validation_predictions.rst使用 cars_20mpg 数据集判断汽车是否经济省油演示了nfolds5与keep_cross_validation_predictionsTRUE的搭配用法。R 客户端library(h2o) h2o.init() # 导入 cars 数据集 # 该数据集用于根据汽车排量、马力、重量、加速度和出厂年份 # 判断一辆汽车是否经济省油 cars - h2o.importFile(https://s3.amazonaws.com/h2o-public-test-data/smalldata/junit/cars_20mpg.csv) # 将响应列转换为因子 cars[economy_20mpg] - as.factor(cars[economy_20mpg]) # 设置预测变量名与响应列名 predictors - c(displacement, power, weight, acceleration, year) response - economy_20mpg # 划分训练集与验证集 cars_split - h2o.splitFrame(data cars, ratios 0.8, seed 1234) train - cars_split[[1]] valid - cars_split[[2]] # 训练 GBM 模型设置 nfolds 参数并启用 keep_cross_validation_predictions cars_gbm - h2o.gbm(x predictors, y response, training_frame train, nfolds 5, keep_cross_validation_predictions TRUE, seed 1234) # 打印交叉验证预测 h2o.cross_validation_predictions(cars_gbm)Python 客户端import h2o from h2o.estimators.gbm import H2OGradientBoostingEstimator h2o.init() # 导入 cars 数据集 cars h2o.import_file(https://s3.amazonaws.com/h2o-public-test-data/smalldata/junit/cars_20mpg.csv) # 将响应列转换为因子 cars[economy_20mpg] cars[economy_20mpg].asfactor() # 设置预测变量名与响应列名 predictors [displacement, power, weight, acceleration, year] response economy_20mpg # 划分训练集与验证集 train, valid cars.split_frame(ratios [.8], seed 1234) # 初始化估计器设置 nfolds 参数并启用 keep_cross_validation_predictions cars_gbm H2OGradientBoostingEstimator(keep_cross_validation_predictions True, nfolds 5, seed 1234) # 训练模型 cars_gbm.train(x predictors, y response, training_frame train) # 打印交叉验证预测 cars_gbm.cross_validation_predictions()如何在客户端读取留出预测保存只是第一步读取同样重要。H2O 的 Python 与 R 客户端均提供了对应的访问方法。Pythoncross_validation_predictions()与cross_validation_holdout_predictions()在 model_base.py 中定义了两个关键方法cross_validation_predictions()返回一个H2OFrame列表对应每个折的预测帧从模型输出cross_validation_predictions字段中解析出各帧 key 后逐一h2o.get_frame加载cross_validation_holdout_predictions()返回合并后的完整留出预测帧对应cross_validation_holdout_predictions_frame_id其文档说明相当于把所有cross_validation_predictions()返回的帧逐行相加。若模型未开启keep_cross_validation_predictions这两个方法均返回None。例如cv_preds cars_gbm.cross_validation_predictions() # 每折一个 H2OFrame holdout cars_gbm.cross_validation_holdout_predictions() # 合并后的完整留出预测Rh2o.cross_validation_predictions()在 models.R 中实现h2o.cross_validation_predictions - function(object) { if(!is(object, H2OModel)) stop(object must be an H2O model) if (is.null(objectmodel$cross_validation_predictions)) return(NULL) lapply(objectmodel$cross_validation_predictions, function(x) h2o.getFrame(x$name)) }同样地若未开启参数返回NULL开启后返回各折预测帧的列表每个元素是一个 H2O Frame。典型应用场景Stacked Ensemble 与 AutoML留出预测最大的价值在于作为次级学习器meta-learner的训练数据这正是 Stacked Ensemble 的核心机制。仓库中 stackedensemble.py 的示例大量使用了keep_cross_validation_predictionsTruefrom h2o.estimators.stackedensemble import H2OStackedEnsembleEstimator ... base_model H2OGradientBoostingEstimator(nfolds5, keep_cross_validation_predictionsTrue, seed1) base_model.train(xx, yy, training_frametrain) ... stacked_ensemble H2OStackedEnsembleEstimator(base_models[base_model], ...)这也是官方文档把每个折的留出预测称为interesting properties的原因——因为每一行训练数据都能拿到一个模型在训练时未曾见过它的预测避免了在集成学习中常见的泄漏问题。此外AutoML 的构建控制项中也包含keep_cross_validation_predictions见 automl/_estimator.py即 AutoML 自动为候选模型保留交叉验证预测供其内部的 Stacked Ensemble 阶段使用。与其他交叉验证参数的协同该参数通常与以下参数搭配使用各参数的独立文档位于 algo-params 目录参数作用与keep_cross_validation_predictions的关系nfolds指定 K 折交叉验证的折数默认建议 510本参数生效的前提只有nfolds2或指定fold_column时才会产生各折预测帧keep_cross_validation_models是否保留各折交叉验证模型默认开启AutoML 除外二者相互独立模型与预测帧分别保留keep_cross_validation_fold_assignment是否保存每行训练数据所属折的分配结果若需把预测帧与折分配对齐分析可同时开启fold_assignment/fold_column指定折的划分方式随机/取模/分层/按事件分组等决定各折预测帧由哪些行构成对时间序列或分组数据务必用fold_column避免数据泄漏需要特别提醒的是nfolds与预测保存的关系官方 nfolds.rst 指出折数越高计算代价越大而保存每个折的预测帧同样会额外占用内存因此在实际生产中应结合_keep_cross_validation_predictions_precision精度控制或按需关闭避免不必要的内存开销。注意事项小结默认关闭不显式开启keep_cross_validation_predictions各折预测帧会在收尾阶段被删除日志中会记录被删除的预测帧数量。二分类例外即使未开启二分类模型内部仍会临时计算留出预测用于 gains/lift 表但不会暴露给用户。行数对齐每个折的预测帧行数与训练帧一致非留出行以 0 填充便于直接相加还原完整留出预测。内存权衡可通过_keep_cross_validation_predictions_precisionPython/R 中对应的参数为keep_cross_validation_predictions_precision压缩存储精度以节省内存。访问接口读取时使用 Python 的cross_validation_predictions()/cross_validation_holdout_predictions()或 R 的h2o.cross_validation_predictions()未开启时这些接口返回NULL/None。赞分享机器学习深度学习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点击查看免费下载相关推荐BlockSuite 组件体系全解析Editor、Block、Widget 与 Fragment 的架构与实践BlockSuite 组件体系全解析Editor、Block、Widget 与 Fragment 的架构与实践 BlockSuite 将编辑器拆解为四类职责清机器学习深度学习AutoML大数据后端vphone-cli post-validation补丁全解析AMFI后置验证如何被巧妙跳过vphone cli post validation补丁全解析AMFI后置验证如何被巧妙跳过 vphone cli 是一个基于 Apple Virtualiz机器学习深度学习AutoML大数据后端旧 Mac 重生实战指南用 OpenCore Legacy Patcher 让十年老机器装上最新 macOS旧 Mac 重生实战指南用 OpenCore Legacy Patcher 让十年老机器装上最新 macOS 老 Mac 的系统更新停在 High Sierr操作系统固件驱动开发上一篇终极指南如何使用XServer实现Android应用方法拦截与动态重放下一篇OpenCore Legacy Patcher深度解析内存注入与驱动补丁技术实现机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价 →
↑