☰
H2O-3 GLM/GAM 的 lambda_search:自动正则化路径搜索参数完全指南
2026/10/15 16:35:05 网站建设 项目流程
  • 机器学习
  • 深度学习
  • AutoML
  • 大数据
  • 后端

【免费下载链接】h2o-3

H2O 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
点击查看免费下载

lambda_search是 H2O-3 中 GLM(广义线性模型)与 GAM(广义加性模型)最核心的正则化自动调参开关之一。开启后,算法不再需要你手工指定一个正则化强度,而是自动从最大正则化(lambda_max)出发,沿一条指数递减的 lambda 路径逐步搜索,并通过 warm-start 与递归强规则(recursive strong rules)大幅降低计算成本,最终返回基于最优 lambda 的训练模型。本文以官方参数文档为主体,结合h2o-algos模块的 GLM 源码实现,完整讲解该参数的工作原理、默认行为、相关参数矩阵、限制条件与 R/Python 实战用法。

参数概览

属性值
适用算法GLM、GAM
是否为超参数(Hyperparameter)否
数据类型布尔(bool/logical)
默认值FALSE/False

参数默认值可分别在 Java 端 GLMModel.java、Python 端 glm.py 与 R 端 glm.R 中得到确认。GAM 估计器同样暴露该参数,见 gam.py。

工作原理:从 lambda_max 出发的递减搜索

官方文档对lambda_search的描述是:将其设为TRUE后,GLM/GAM 会先拟合一个最大正则化(最高 lambda 值)的模型,然后逐步减小 lambda,直到达到最小 lambda 或出现过拟合为止,最终模型基于最佳 lambda 值构建。从源码结构看,这一过程对应 GLM 训练主流程中的几大关键步骤:

  1. 计算 lambda_max:算法先计算出让解退化为全零/截距模型的最小正则化强度_lmax(即满足"解为全 0 模型"的最小 lambda),相关计算位于 GLM.java。每个 alpha 值都有自己对应的最佳 lambda(_gmax = _lmax * max(1e-2, alpha))。
  2. 生成指数递减的 lambda 序列:若用户未显式提供 lambda 数组,且开启了 lambda search,算法会以nlambdas为长度构造序列:首元素为lambda_max,相邻元素按固定比例dec = pow(lambda_min_ratio, 1.0/(nlambdas - 1))指数递减,直至lambda_min = lambda_min_ratio * lambda_max。这段实现位于 GLM.java,与官方文档 lambda_min_ratio.rst 中"指数递减序列"的描述完全一致。
  3. 从大到小依次求解并 warm-start:H2O 按 lambda 递减顺序逐个拟合子模型,用前一个 lambda 的解作为当前 lambda 的初始解(warm start)。由于相邻 lambda 的解很接近,通常每个 lambda 只需要两三次迭代即可收敛,从而获得显著的性能提升,同时数值稳定性更好——先求解更容易的高惩罚模型,再做小幅调整。这一机制在 nlambdas.rst 中有详细说明。
  4. 递归强规则加速:在稀疏场景(alpha > 0)下,搜索过程借助递归强规则(recursive strong rules)筛掉不活跃的预测因子(噪声),只在少数候选预测因子上构建模型。源码中强规则的实现可见于 ComputationState.java。需要注意的是,强规则对相邻 lambda 的"接近程度"敏感,因此lambda_min_ratio与nlambdas同时决定了序列中任意两个 lambda 的相对距离——保持接近默认值通常能获得最佳效果。
  5. 内置早停:lambda search 拥有自己独立的早停机制。若用户同时设置stopping_rounds > 0与lambda_search = TRUE,训练会直接报错,提示"Lambda_search has its own early-stopping mechanism",见 GLM.java。搜索会在达到 lambda_min 之前,若验证集偏差不再下降(即出现过拟合迹象)就提前终止。

宽数据集与稀疏解

官方文档特别指出:当寻找稀疏解(alpha > 0)时,lambda search 可以高效处理超宽数据集,因为它能过滤掉不活跃的预测因子,只对一小部分预测因子构建模型。典型应用场景是:数据集中预测因子非常多,但期望活跃预测因子数量保持在一个相对较小的值。从源码看,这一能力由两类机制共同支撑:

  • 递归强规则(applyStrongRules)在每次 lambda 变化时动态收缩活跃特征集合,见 ComputationState.java;
  • max_active_predictors上限保护:当求解器为 IRLSM、COORDINATE_DESCENT、COORDINATE_DESCENT_NAIVE,或 AUTO 结合 lambda search 时,max_active_predictors默认被设为 5000,防止活跃预测因子无限膨胀导致内存/算力失控。这一默认逻辑在 GLM.java 与 max_active_predictors.rst 中均有记载。

求解器选择

lambda search 还会影响求解器的自动选择。从源码看,当活跃特征数不超过 5000 且启用了 lambda search 时,H2O 会优先选择 COORDINATE_DESCENT(坐标下降),因为"L1 lambda search 用坐标下降效果更好"(lambda search prefers coordinate descent),见 GLM.java。相应地,收敛阈值也会被收紧:objective_epsilon在 lambda search 下默认取1e-4,gradient_epsilon再乘1e-2,见 GLM.java。

lambda_min_ratio 与最小 lambda 的自动计算

官方文档指出:除非显式指定lambda_min_ratio,否则算法会自动计算最小 lambda 值;一旦指定,该值便成为搜索的下界lambda_min。

lambda_min_ratio的默认值依赖数据集形状。文档 lambda_min_ratio.rst 的描述是:当行数大于列数时默认1e-4,否则默认1e-2。源码中的实现细节略有收紧——判断条件为(nobs >> 4) > fullN(即行数除以 16 后仍大于特征数时取1e-4,否则取1e-2),且当alpha == 0(纯岭回归)时该默认值会再乘以1e-2进一步缩小,见 GLM.java。

与用户提供 lambda 值的交互

文档中有一条极易被忽略的规则:如果用户手动传入了一个或多个lambda值,那么 lambda search 将只在这几个指定 lambda 上执行,而不是自动生成序列。源码在参数校验阶段对此做了明确处理:若同时指定lambda与lambda_search,会给出警告"lambda_search disabled when user specified any lambda value(s)",见 GLMModel.java。换言之,lambda_search = TRUE的"自动搜索"仅在lambda未提供时生效;提供 lambda 后,它退化为对给定值集合的依次评估。

默认 nlambdas:30 还是 100?

nlambdas指定 lambda search 中尝试的模型数量。若用户未设置(默认-1),源码会根据 alpha 取值自动决定:

  • alpha == 0(纯岭回归):默认nlambdas = 30,注释表明"岭回归需要的 lambda 更少";
  • alpha > 0(含 L1 惩罚):默认nlambdas = 100。

对应实现见 GLM.java,与 nlambdas.rst 的说明一致。当alpha > 0且lambda_min_ratio取默认1e-4时,100 个 lambda 对应的相邻递减比例为0.912——这是递归强规则表现最佳的经验区间,建议保持接近。

参数校验与兼容性限制

结合 GLMModel.java 的validate方法,lambda_search存在以下明确限制,使用时需特别注意:

冲突配置行为
lambda与lambda_search同时指定警告:lambda search 被禁用,仅按给定 lambda 值求解
stopping_rounds > 0与lambda_search报错:lambda search 自带早停机制,不可叠加
ordinal 回归(family=ordinal)报错:Ordinal regression 不支持 lambda search
control_variables报错:与 lambda search 不兼容
remove_offset_effects报错:与 lambda search 不兼容
remove_collinear_columns警告:本应与无正则化(lambda=0)配合使用,与 lambda search 混用不当
dispersion_parameter_method = "ml"报错:ML 分散度估计仅支持无正则化,lambda search 会与之冲突
influence = "dfbetas"报错:lambda search 与 dfbetas 影响分析不可同时开启(GLM.java)

另外,开启 lambda search 时 H2O 会强制use_all_factor_levels = true(使用因子全水平编码),相关代码见 GLM.java。

R 与 Python 实战示例

官方文档给出了基于波士顿房价数据集(Boston Housing,响应变量为medv)的端到端示例。以下为完整可运行的代码。

R 版本

library(h2o) h2o.init() # 导入 boston 数据集: # 该数据集考察波士顿郊区的房屋特征,用于预测房价中位数 boston <- h2o.importFile("https://s3.amazonaws.com/h2o-public-test-data/smalldata/gbm_test/BostonHousing.csv") # 设置预测变量名与响应列名 predictors <- colnames(boston)[1:13] # 将响应列设为 "medv",即房主自住房价格中位数(单位:千美元) response <- "medv" # 将 chas 列转换为因子(chas = 查尔斯河虚拟变量,1 表示临河,0 表示不临河) boston["chas"] <- as.factor(boston["chas"]) # 拆分为训练集与验证集 boston_splits <- h2o.splitFrame(data = boston, ratios = 0.8) train <- boston_splits[[1]] valid <- boston_splits[[2]] # 开启 lambda_search 参数(布尔值)并训练模型 boston_glm <- h2o.glm(x = predictors, y = response, training_frame = train, validation_frame = valid, lambda_search = TRUE) # 打印验证集上的 MSE print(h2o.mse(boston_glm, valid = TRUE))

Python 版本

import h2o from h2o.estimators.glm import H2OGeneralizedLinearEstimator h2o.init() # 导入 boston 数据集: # 该数据集考察波士顿郊区的房屋特征,用于预测房价中位数 boston = h2o.import_file("https://s3.amazonaws.com/h2o-public-test-data/smalldata/gbm_test/BostonHousing.csv") # 设置预测变量名与响应列名 predictors = boston.columns[:-1] # 将响应列设为 "medv",即房主自住房价格中位数(单位:千美元) response = "medv" # 将 chas 列转换为因子 boston['chas'] = boston['chas'].asfactor() # 拆分为训练集与验证集 train, valid = boston.split_frame(ratios=[.8]) # 初始化估计器并开启 lambda_search,然后训练 boston_glm = H2OGeneralizedLinearEstimator(lambda_search=True) boston_glm.train(x=predictors, y=response, training_frame=train, validation_frame=valid) # 打印验证集上的 MSE print(boston_glm.mse(valid=True))

两个版本均完成了数据导入、列类型转换、训练/验证集划分、lambda_search = TRUE训练与验证 MSE 评估的完整流程。GAM 中的用法完全一致,只需将估计器替换为H2OGeneralizedLinearEstimator对应的 GAM 估计器(R 中为h2o.gam,Python 中为H2OGeneralizedAdditiveEstimator)。

从模型输出中读取搜索边界与最佳 lambda

开启 lambda search 后,模型输出中会附带搜索路径的关键信息,可用于后续分析或迁移到生产环境:

  • lambda_max:搜索起始的最大 lambda(若未开启 lambda search,该值为 -1);
  • lambda_min:计算得到或用户指定的最小 lambda(未开启时为 -1);
  • lambda_best:最终选定子模型对应的最佳 lambda;
  • lambda_1se:在交叉验证场景下,取"最优 lambda ± 1 倍标准误差"规则对应的 lambda(GLMModel.java)。

Python 端提供getLambdaMax(model)与getLambdaMin(model)两个辅助函数,R 端对应h2o.getLambdaMax(model)与h2o.getLambdaMin(model);两者都会在 lambda search 未开启时抛出明确的错误提示(见 glm.py 与 glm.R)。训练完成后的模型摘要会汇总展示nlambda、lambda.max、lambda.min(即lambda_best)与lambda.1se,见 GLMModel.java。

若你在交叉验证(nfolds > 0)下运行 lambda search,H2O 还会利用各折模型的结果计算 xval deviance 及其标准差,并在主模型上收缩 lambda 搜索范围(将序列截断到 CV 估计值附近),从而让最终模型聚焦于更有希望的区间,相关逻辑位于 GLM.java 与 GLM.java。

总结

lambda_search是 H2O-3 GLM/GAM 用户应对"不知道 lambda 该取多大"这一核心问题的标准答案。它将正则化强度选择从手工调参转变为自动化的路径搜索:以lambda_max起步、沿指数递减序列逐点拟合、借助 warm-start 与递归强规则保证计算效率、以内置早停防止过拟合。理解它与lambda、lambda_min_ratio、nlambdas、max_active_predictors、alpha以及求解器选择的交互关系,是充分发挥该参数价值的关键——同时也要注意 ordinal 回归、control variables 等场景下的明确限制,避免配置冲突。

  • 机器学习
  • 深度学习
  • AutoML
  • 大数据
  • 后端

【免费下载链接】h2o-3

H2O 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
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询