- 机器学习
- 深度学习
- 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.
导读
nlambdas是 H2O 3 中 GLM(广义线性模型)与 GAM(广义加性模型)共用的正则化参数,用于控制在lambda_search=TRUE时自动生成的 λ 序列中需要求解的模型数量。本文以官方参数文档为主体,结合 GLM.java 等源码,完整讲解 λ 序列的生成公式、warm-start 顺序求解原理、默认值规则,以及它与lambda_min_ratio、strong rules 的配合关系,并给出 R 与 Python 的可运行实战示例。读完本文,你将能根据数据规模与求解精度需求,合理设置nlambdas以控制 H2O GLM/GAM 的调参搜索粒度。
一、参数概览
- 可用模型:GLM、GAM
- 超参数属性:否(不属于可用于网格搜索的超参数)
- 前置条件:该参数仅在
lambda_search=TRUE时生效。若未开启 lambda search,后端会自动隐藏该参数(见 GLMModel.java 中glm.hide("_nlambdas", "only applies if lambda search is on.")的逻辑)。
nlambdas指定了在 lambda search 过程中使用的 λ 值个数。其含义与lambda_min_ratio紧密耦合:λ 序列由 H2O 自动生成,呈指数递减分布,取值范围从λ_max一直递减到λ_min = lambda_min_ratio × λ_max。
二、核心原理:λ 序列如何自动生成
1. λ_max 与 λ_min 的定义
λ_max:使得解为全 0 模型(所有系数为 0)的最小的 λ。从源码看,H2O 通过计算初始梯度来得到_lmax(GLM.java)。λ_min:由lambda_min_ratio与λ_max相乘得到,即λ_min = lambda_min_ratio × λ_max。
2. 指数递减序列的生成公式
当用户未显式提供 λ 数组且开启了 lambda search 时,H2O 会为nlambdas个 λ 值分配数组,并按等比数列生成序列(GLM.java):
_parms._lambda = new double[_parms._nlambdas]; double dec = Math.pow(_parms._lambda_min_ratio, 1.0 / (_parms._nlambdas - 1)); _parms._lambda[0] = _lmax; double l = _lmax; for (int i = 1; i < _parms._nlambdas; ++i) _parms._lambda[i] = (l *= dec);即相邻两个 λ 之间满足固定比例:
dec = (lambda_min_ratio)^(1/(nlambdas - 1)) λ[i] = λ[i-1] × dec可以看到:nlambdas越大,序列中的 λ 越密集,相邻 λ 的比值dec越接近 1;nlambdas越小,λ 序列越稀疏,相邻 λ 间隔越大。
3. 一个可验证的数字示例
按文档默认配置:alpha > 0时lambda_min_ratio = 1e-4、nlambdas = 100,代入公式得相邻 λ 比值为:
dec = (1e-4)^(1/99) ≈ 0.912这正是文档所说的“ratio of 0.912”。这也解释了为什么 H2O 文档建议:使用 strong rules 时,最好让相邻 λ 的比值保持在 0.912 左右(详见第五节)。
三、顺序求解与 warm-start:从易到难逐步调整
λ 序列确定后,H2O按递减顺序逐一求解各 λ 对应的模型,并使用 warm-start 机制:求解λ_k时,以上一个解λ_{k-1}的系数作为初始预测值。
- 由于相邻 λ 对应的模型通常非常接近,每个 λ 只需很少的迭代次数即可收敛(通常 2~3 次);
- 先求解惩罚更重(λ 更大)的模型是一个“简单问题”,之后逐步做小幅调整,从而获得更好的数值稳定性与整体性能。
从源码可以看出nlambdas还直接参与迭代预算的计算:开启 lambda search 时,max_iterations会被放大为nlambdas * 100 * numclasses(多分类场景)或10 * nlambdas(单响应场景),见 GLM.java。因此nlambdas不仅决定 λ 路径的密度,也隐式影响着整个搜索过程的迭代上限与总工作量(_workPerIteration = WORK_TOTAL / _parms._nlambdas,见 GLM.java)。
四、默认值规则与推荐取值
1. 后端默认值(GLM.java)
if (_parms._lambda_search && _parms._nlambdas == -1) _parms._nlambdas = _parms._alpha[0] == 0 ? 30 : 100; // fewer lambdas needed for ridgealpha > 0(弹性网/套索等):默认nlambdas = 100,同时lambda_min_ratio默认1e-4,相邻 λ 比值约为 0.912;alpha = 0(纯岭回归):默认nlambdas = 30,因为岭回归所需的 λ 数量更少;同时lambda_min_ratio还会再缩小一个数量级(见下文)。
2. lambda_min_ratio 的自动默认值(GLM.java)
若用户未指定lambda_min_ratio(值为 -1),H2O 依据样本数与特征数自动选择:
if (_parms._lambda_min_ratio == -1) { _parms._lambda_min_ratio = (_nobs >> 4) > _dinfo.fullN() ? 1e-4 : 1e-2; if (_parms._alpha[0] == 0) _parms._lambda_min_ratio *= 1e-2; // smaller lambda min for ridge as we are starting quite high }即:当样本数除以 16 仍大于特征数(观测充分多)时取1e-4,否则取1e-2;若alpha=0,再乘以1e-2(即变为1e-6或1e-4)。这与 GLMV3.java 中 schema 的说明一致。
3. Python/R 接口的默认值
- Python:
H2OGeneralizedLinearEstimator(...)中nlambdas默认-1,类型为int(glm.py); - R:
h2o.glm(...)中nlambdas = -1(glm.R)。
默认值-1表示交由后端按上述alpha取值自动判定(30 或 100)。这意味着:如果你不显式设置nlambdas,H2O 会自动为岭回归选 30、为其余正则化路径选 100 个 λ。
4. 取值建议
- 数据规模大、追求更快求解:可适当减小
nlambdas(如 30~50),牺牲路径密度换取速度; - 需要精细刻画系数路径(如用于 λ 选择可视化、逼近最优 λ):可增大
nlambdas(如 100~200); - 若配合 strong rules 使用,建议保持相邻 λ 比值接近 0.912 的默认节奏(即
nlambdas=100、lambda_min_ratio=1e-4附近)。
五、相邻 λ 的距离与 strong rules
lambda_min_ratio与nlambdas共同决定了序列中任意两个相邻 λ 的相对距离。这一点在应用**递归强规则(recursive strong rules)**时尤为重要——强规则只在相邻 λ 足够“接近”时才能高效工作。
从源码看,strong rules 的实现位于 ComputationState.java:每当 λ 切换到新值(setLambda)时,会基于无 L2 惩罚的梯度应用强规则来筛除预期系数为 0 的预测变量,从而显著缩小活跃特征集。其筛选阈值与alpha × (2 × lambdaNew − lambdaOld)相关(见 ComputationState.java 的rhs计算)。
这意味着:
- 相邻 λ 越接近,上一步的活跃特征集越能准确代表下一步,强规则筛选越可靠;
- 若
nlambdas过小导致相邻 λ 相距过远,强规则可能过早剪枝掉本应活跃的特征(虽然 H2O 仍会通过 KKT 条件校验兜底)。
六、相关参数
nlambdas通常与以下参数配套使用:
- alpha:正则化分布的混合比例(L1 与 L2 权重),决定
nlambdas默认值取 30 还是 100; - lambda:正则化强度。开启 lambda search 后,此参数含义变为“λ_min”(从 λ_max 开始搜索);
nlambdas控制该路径上的求解点数; - lambda_min_ratio:
λ_min / λ_max比值,与nlambdas共同决定 λ 序列的覆盖范围与密度; - lambda_search:开启后从 λ_max 开始自动搜索,
nlambdas仅在它为 TRUE 时生效。
在模型输出层面,训练完成后 GLMModel.java 会在模型摘要中汇总nlambda、lambda.max、lambda.min与lambda.1se,方便你核对实际求解的 λ 路径。此外,当 lambda search 与交叉验证(CV)结合时,H2O 还会用lambdaCVEstimate收缩 λ 搜索范围(截断到 CV 估计值附近,见 GLM.java),此时实际求解的模型数可能小于nlambdas。
七、实战示例:波士顿房价预测
下面以经典的波士顿房价(Boston Housing)数据集演示nlambdas的用法。数据集包含 13 个预测特征,响应列为medv(自有住房中位数价格,单位千美元)。示例将chas列转换为因子,并按 8:2 划分训练/验证集,开启lambda_search并将nlambdas设为 50。
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] response <- "medv" # 自有住房中位数价格(单位:$1000) # 将 chas 列转为因子(chas = 查尔斯河哑变量) boston["chas"] <- as.factor(boston["chas"]) # 划分训练集与验证集 boston_splits <- h2o.splitFrame(data = boston, ratios = 0.8) train <- boston_splits[[1]] valid <- boston_splits[[2]] # 使用 nlambdas 参数训练模型 boston_glm <- h2o.glm(x = predictors, y = response, training_frame = train, validation_frame = valid, lambda_search = TRUE, nlambdas = 50) # 打印验证集上的 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] response = "medv" # 将 chas 列转为因子 boston['chas'] = boston['chas'].asfactor() # 划分训练集与验证集 train, valid = boston.split_frame(ratios=[.8]) # 初始化估计器并训练模型 boston_glm = H2OGeneralizedLinearEstimator(lambda_search=True, nlambdas=50) boston_glm.train(x=predictors, y=response, training_frame=train, validation_frame=valid) # 打印验证集上的 MSE print(boston_glm.mse(valid=True))示例要点说明
- 代码中
lambda_search = TRUE/True是必须的——不开启时nlambdas不生效(后端会自动隐藏该参数); - 设置
nlambdas = 50意味着 H2O 会在从λ_max到λ_min的指数递减路径上求解 50 个模型,相邻 λ 比值为(lambda_min_ratio)^(1/49); - 训练完成后可用
h2o.mse(model, valid = TRUE)/model.mse(valid=True)观察验证集误差,并可与不同nlambdas取值的结果对比,判断当前数据规模下 λ 路径密度是否足够。
八、调参小结与常见问题
| 场景 | 建议 |
|---|---|
| 快速试验、大数据集 | nlambdas = 30~50,缩短总求解时间 |
| 精细的系数路径 / 精确选择最优 λ | nlambdas = 100~200,路径更密、相邻 λ 更接近 |
| 配合 strong rules | 保持相邻 λ 比值接近 0.912(默认nlambdas=100、lambda_min_ratio=1e-4) |
纯岭回归(alpha=0) | 无需显式设置,后端默认nlambdas=30通常已足够 |
常见问题:
- 设置了
nlambdas但没开lambda_search?参数会被忽略并在 API 中隐藏,请先设置lambda_search = TRUE; nlambdas是超参数吗?不是。它不参与网格搜索的hyper_params配置(文档明确标注 Hyperparameter: no);- 为什么实际模型数有时少于
nlambdas?与 CV 结合时,H2O 会根据lambdaCVEstimate收缩 λ 搜索范围,只保留 CV 估计值附近的 λ(GLM.java)。
该参数同样适用于 GAM(广义加性模型):GAMV3.java 与 GAMModel.java 中均存在对应的nlambdas定义,其 λ 搜索行为与 GLM 一致。
- 机器学习
- 深度学习
- 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.
相关推荐
H2O 中 GLM 与 GAM 的 link 参数详解:链接函数选择、Family 兼容矩阵与实战示例
H2O 中 GLM 与 GAM 的 link 参数详解:链接函数选择、Family 兼容矩阵与实战示例 导读 本文围绕 H2O 分布式机器学习平台中 GLM(广
机器学习深度学习AutoML大数据后端用 CVXPY 实现岭回归(Ridge Regression):损失函数、参数调优与正则化路径详解
用 CVXPY 实现岭回归(Ridge Regression):损失函数、参数调优与正则化路径详解 本篇技术指南以 CVXPY 官方示例 ridge_regre
科学计算H2O-3 中 score_tree_interval 参数详解:让早停(Early Stopping)可控、可复现
H2O 3 中 score_tree_interval 参数详解:让早停(Early Stopping)可控、可复现 本文围绕 H2O 3 树模型的 score
机器学习深度学习AutoML大数据后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考