资讯动态

H2O-3 `standardize` 参数深度指南:数值列标准化(零均值单位方差)的原理、默认行为与实战用法

发布时间:2026/10/15 6:39:11 来源:尧图企业网站定制
机器学习深度学习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点击查看免费下载导读standardize是 H2O-3 机器学习平台中一个影响面极广的建模参数它决定是否将数值型预测列标准化为零均值mean0、单位方差variance1并直接决定模型输出系数是标准化系数还是原始尺度系数。本文以官方参数文档 standardize.rst 为骨架结合 GLM、Deep Learning、K-Means、GAM、HGLM、ANOVAGLM、ModelSelection 等算法的源码实现系统讲解该参数的适用算法、默认值、底层数学变换、开启/关闭后的不同表现以及完整可运行的 R 与 Python 实战示例帮助你理解何时应保留默认开启、何时只有高级用户才应关闭它。适用范围与参数类型根据官方文档standardize参数在以下算法中可用Deep Learning深度学习GLM广义线性模型GAM广义可加模型HGLM分层广义线性模型K-MeansK 均值聚类ANOVAGLM方差分析 GLMModelSelection模型选择同时它被标记为Hyperparameter: yes即可以在网格搜索grid search中作为超参数参与调优。从源码角度看各算法都在自己的参数类中显式声明了该字段例如h2o-algos/src/main/java/hex/glm/GLMModel.java中public boolean _standardize true;h2o-algos/src/main/java/hex/kmeans/KMeansModel.java中public boolean _standardize true; // Standardize columnsh2o-algos/src/main/java/hex/deeplearning/DeepLearningModel.java中public boolean _standardize true;h2o-algos/src/main/java/hex/anovaglm/ANOVAGLMModel.java中public boolean _standardize true;h2o-algos/src/main/java/hex/modelselection/ModelSelectionModel.java中public boolean _standardize true;可以看到除 GAM 外绝大多数算法默认值为true开启。GAM 是一个例外在h2o-algos/src/main/java/hex/gam/GAMModel.java中其_standardize字段声明为false且注释明确说明该参数会传递给 GLM 算法// pass to GLM algoGAM 还额外提供了独立的standardize_tp_gam_cols参数用于控制薄板样条thin plate预测列的标准化详见h2o-algos/src/main/java/hex/gam/GAMModel.java中的_standardize_tp_gam_cols字段。Python 客户端各估计器中均可找到对应的属性例如 glm.py、deeplearning.py、kmeans.py、gam.py、model_selection.py、anovaglm.py 中均有standardizeTrue的默认声明及standardize()属性的 getter/setter。核心语义数值列标准化与标准化系数官方文档对standardize的定义是该选项指定是否将数值列标准化为零均值、单位方差。开启该选项后模型输出中会产生标准化系数standardized coefficient magnitudes。文档同时给出强烈建议强烈推荐开启标准化且该选项默认开启。如果不使用标准化结果中会出现被看起来方差更大的变量主导的成分——这只是尺度scale效应而非真实贡献。只有高级用户才应关闭此选项。这段描述背后有一个经典的建模问题当不同数值特征的量纲差异巨大时例如年龄约 0~100收入约 0~1000000直接建模会让绝对值大的特征在目标函数与距离计算中天然占优。标准化将这些特征统一到同一尺度避免模型把数值大误判为贡献大。底层实现DataInfo 的 TransformType在 H2O-3 的 Java 核心实现中标准化并不是一个简单的预处理开关而是通过DataInfo的**预测列变换类型TransformType**来落地的。h2o-algos/src/main/java/hex/DataInfo.java中定义了五种变换类型public enum TransformType { NONE, STANDARDIZE, NORMALIZE, DEMEAN, DESCALE; }当standardizetrue时预测列变换被设置为STANDARDIZE否则设置为NONE。例如 GLM 在h2o-algos/src/main/java/hex/glm/GLM.java中的构造逻辑boolean standardizeQ _parms._standardize; _dinfo new DataInfo(_train.clone(), _valid, 1, _parms._use_all_factor_levels || _parms._lambda_search, standardizeQ ? DataInfo.TransformType.STANDARDIZE : DataInfo.TransformType.NONE, DataInfo.TransformType.NONE, ...);ModelSelection 在h2o-algos/src/main/java/hex/modelselection/ModelSelection.java中采用完全相同的模式_parms._standardize ? DataInfo.TransformType.STANDARDIZE : DataInfo.TransformType.NONE, DataInfo.TransformType.NONE, ...标准化的具体数学变换DataInfo.setTransform方法h2o-algos/src/main/java/hex/DataInfo.java中对STANDARDIZE分支的实现揭示了具体数学形式case STANDARDIZE: ... normMul[idx] (v.sigma() ! 0) ? 1.0 / v.sigma() : 1.0; normSub[idx] v.mean(); ...即对每个数值列vnormSub减数 列均值meannormMul乘数 列标准差sigma的倒数1/sigma当标准差为 0 即常数列时退化为 1避免除零。标准化后的值满足x (x - mean) / sigma这正是零均值、单位方差的标准 z-score 变换。特别地对于由交互项生成的列InteractionWrappedVec代码会逐列取出对应的乘子与减数进行同样的处理。在 K-Means 中h2o-core/src/main/java/water/fvec/Frame.java的mults()方法给出了同样语义的实现——每列标准差的倒数/** One over the standard deviation of each column. * return Reciprocal the standard deviation of each column */ public double[] mults() { ... double sigma vecs[i].sigma(); mults[i] standardize(sigma) ? 1.0 / sigma : 1.0; ... } private static boolean standardize(double sigma) { return sigma 1e-6; // 常数列sigma 过小不缩放 }注意这里有一个保护条件sigma 1e-6才进行1/sigma缩放否则乘子取 1。这保证了常数列方差趋于 0不会被放大成无穷大是数值稳定性的关键细节。响应列是否标准化标准化主要作用于预测列。但在部分算法中响应列也可能参与变换。例如 Deep Learning 在h2o-algos/src/main/java/hex/deeplearning/DeepLearning.java中的变换选择逻辑非常典型parms._standardize ? (parms._autoencoder ? DataInfo.TransformType.NORMALIZE : parms._sparse ? DataInfo.TransformType.DESCALE : DataInfo.TransformType.STANDARDIZE) : DataInfo.TransformType.NONE, //transform predictors !parms._standardize || train.lastVec().isCategorical() ? DataInfo.TransformType.NONE : identityLink ? DataInfo.TransformType.STANDARDIZE : DataInfo.TransformType.NONE, //transform response从这段源码可以推断开启standardize时预测列默认使用STANDARDIZE但在**自编码器autoencoder场景下改用NORMALIZEmin-max 归一化在稀疏数据sparse**场景下改用DESCALE仅按1/sigma缩放、不减均值以保持稀疏性。响应列仅在非分类响应 恒等链接identity link回归场景下才做标准化且以开启standardize为前提。这也是为什么文档特别提醒如果关闭标准化用户必须自行提供尺度正确的输入数据——因为关闭后 H2O 将不再为你处理任何尺度问题模型对输入的缩放方式完全依赖用户的数据准备。开启 vs 关闭系数输出的两种形态standardize不仅影响训练过程中的数据变换还直接决定模型输出系数是哪种形态。在 GLM 中h2o-algos/src/main/java/hex/glm/GLMModel.java的isStandardized()方法以预测列变换类型为判据public boolean isStandardized() { return _dinfo._predictor_transform TransformType.STANDARDIZE; }对应地getNormBeta()返回标准化系数当isStandardized()为真否则返回原始尺度系数GLMModelOutput中的_varimp字段注释明确写着应与标准化系数内容相同should contain the same content as standardized coefficients。也就是说开启standardizeh2o.coef()/coef()返回的是标准化系数可直接用于比较各特征对响应的影响大小即变量重要性。关闭standardize返回的是原始尺度系数反映自变量每变化一个原始单位响应变化多少系数绝对值会随量纲不同而天然参差。在 GLM 训练主循环中关闭标准化时的 Gram 矩阵XX求解还会调用qrCholesky(ignoredCols, _parms._standardize)见h2o-algos/src/main/java/hex/glm/GLM.java并针对非标准化问题放宽默认目标 epsilon——源码注释为lower default objective epsilon for non-standardized problems (mostly to match classical tools)说明 H2O 在关闭标准化时有意向经典统计工具的行为靠拢。对于 K-Means标准化直接影响距离计算与聚类中心。在h2o-algos/src/main/java/hex/kmeans/KMeans.java中训练前计算means各列均值与mults_parms._standardize ? _train.mults() : null并在标准化空间中运行 Lloyd 迭代完成后通过destandardize(centers, ...)将标准化空间中的质心还原为原始尺度的质心输出到_centers_raw总平方和TotSS统计同样基于标准化后的数据。K-Means 的 Python 文档字符串将这一语义总结为 Standardize columns before computing distances见 kmeans.py。若不开启量纲大的特征会在欧氏距离中占据支配地位聚类结果等价于权重按尺度自动分配——这正是文档所说的尺度假象。ModelSelection 中的CoeffNormalizationh2o-algos/src/main/java/hex/modelselection/ModelSelectionUtils.java也基于dinfo._normMul即1/sigma生成系数归一化因子用于在比较不同子集模型的系数大小时保持公平。实战示例波士顿房价数据集上的 GLM官方文档为standardize提供了完整的 R 与 Python 示例二者均使用波士顿房价Boston Housing数据集该数据集描述波士顿郊区的特征并用于预测房价中位数示例以https://s3.amazonaws.com/h2o-public-test-data/smalldata/gbm_test/BostonHousing.csv为数据来源H2O 公开测试数据。R 语言示例library(h2o) h2o.init() # import the boston dataset: boston - h2o.importFile(https://s3.amazonaws.com/h2o-public-test-data/smalldata/gbm_test/BostonHousing.csv) # set the predictor names and the response column name predictors - colnames(boston)[1:13] # set the response column to medv, the median value of owner-occupied homes in $1000s response - medv # convert the chas column to a factor (chas Charles River dummy variable ( 1 if tract bounds river; 0 otherwise)) boston[chas] - as.factor(boston[chas]) # split into train and validation sets boston_splits - h2o.splitFrame(data boston, ratios 0.8) train - boston_splits[[1]] valid - boston_splits[[2]] # try using the standardize parameter: boston_glm - h2o.glm(x predictors, y response, training_frame train, validation_frame valid, standardize TRUE) # print the mse for the validation data print(h2o.mse(boston_glm, valid TRUE))Python 语言示例import h2o from h2o.estimators.glm import H2OGeneralizedLinearEstimator h2o.init() # import the boston dataset: boston h2o.import_file(https://s3.amazonaws.com/h2o-public-test-data/smalldata/gbm_test/BostonHousing.csv) # set the predictor names and the response column name predictors boston.columns[:-1] # set the response column to medv, the median value of owner-occupied homes in $1000s response medv # convert the chas column to a factor (chas Charles River dummy variable ( 1 if tract bounds river; 0 otherwise)) boston[chas] boston[chas].asfactor() # split into train and validation sets train, valid boston.split_frame(ratios [.8]) # try using the standardize parameter: # initialize the estimator then train the model boston_glm H2OGeneralizedLinearEstimator(standardize True) boston_glm.train(x predictors, y response, training_frame train, validation_frame valid) # print the mse for the validation data print(boston_glm.mse(validTrue))示例要点解读数据准备chas查尔斯河哑变量被转换为因子列。标准化只作用于数值列分类列以 one-hot 编码展开后不参与 z-score 变换——DataInfo.normalizeBeta的源码注释即明确denormalize only the numeric coefs (categoricals are not normalized)。train/valid 划分split_frame(ratios[.8])按 80/20 划分训练集与验证集验证集用于输出独立的 MSE 指标。参数传递R 侧通过h2o.glm(..., standardize TRUE)传参Python 侧在构造H2OGeneralizedLinearEstimator(standardizeTrue)时传入。此处显式传入True即默认值目的是演示参数写法把它改成False即可对比验证集 MSE 与系数形态的变化。输出验证h2o.mse(boston_glm, valid TRUE)/boston_glm.mse(validTrue)打印验证集上的均方误差如需查看系数可调用h2o.coef(boston_glm)标准化系数或h2o.coef_norm(boston_glm)与标准化的完整系数表对比。在其他算法中使用补充同一参数在其他算法中的传法完全一致例如from h2o.estimators.deeplearning import H2ODeepLearningEstimator from h2o.estimators.kmeans import H2OKMeansEstimator # Deep Learning开启自动标准化默认 dl H2ODeepLearningEstimator(standardizeTrue) # K-Means距离计算前标准化默认 km H2OKMeansEstimator(k3, standardizeTrue)Deep Learning 的 Python 文档特别注明If enabled, automatically standardize the data. If disabled, the user must provide properly scaled input data见 deeplearning.py再次印证关闭后需自备尺度正确的数据这一要求。何时关闭——高级用户的使用边界文档明确将关闭 standardize限定为高级用户的操作核心考量如下回归系数的原始尺度可解释性当你希望报告自变量每变化 1 个单位、因变量平均变化多少这样的原始单位解读如经济计量、医学统计报告需要未标准化的系数。此时关闭standardize配合 GLM 中为经典统计工具行为专门放宽的求解精度设置可得到与传统软件更接近的原始尺度结果。数据已预缩放如果数据在进入 H2O 前已经完成过等价的标准化或使用了明确的特征工程缩放管线可以关闭以节省一次全列统计计算。特殊算法场景Deep Learning 的自编码器与稀疏场景下H2O 会自行切换为NORMALIZE/DESCALE变换若这些内部行为不符合你的预期或你需要完全原始尺度的输入可考虑关闭后自行缩放。GAM 的默认差异GAM 默认standardizefalse且薄板样条列另由standardize_tp_gam_cols控制。使用 GAM 时请确认这两个参数的组合是否符合预期而非默认假定标准化已开启。需要强调关闭标准化并不能消除量纲影响只是把尺度管理的责任转移到用户身上在常规建模中保留默认开启是避免大尺度变量喧宾夺主的最稳妥做法。相关参数官方文档中该参数的相关参数Related Parameters一栏标注为None——standardize没有强绑定的配套参数各算法均独立生效。从源码结构看可以认为它是一个相对独立的数据变换开关不过在具体算法内部会与其他变换机制协同如 Deep Learning 的自编码器NORMALIZE、稀疏DESCALEGAM 的standardize_tp_gam_cols使用时需结合所在算法整体理解。总结standardize是 H2O-3 中横跨 GLM、Deep Learning、K-Means、GAM、HGLM、ANOVAGLM、ModelSelection 七大算法的通用数据变换开关默认开启GAM 除外。开启后数值列被变换为(x - mean) / sigma的零均值单位方差形式DataInfo.TransformType.STANDARDIZE见 DataInfo.java模型输出呈现标准化系数从而避免大尺度变量因量纲差异在求解、距离计算与变量重要性评估中被误判为高贡献关闭后则输出原始尺度系数、由用户自行保证输入数据的尺度合理性更适合需要原始单位解释力的高级场景。理解这一开关是正确解读 H2O-3 线性类、聚类类与神经网络类模型系数和变量重要性的前提。赞分享机器学习深度学习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 数据缺失值插补Impute实战指南基于 h2o-3 的均值/中位数/众数分组插补原理与用法H2O 数据缺失值插补Impute实战指南基于 h2o 3 的均值/中位数/众数分组插补原理与用法 导读 在机器学习建模前数据清洗中最常见的任务之一就是机器学习深度学习AutoML大数据后端如何用Python BitcoinLib快速构建安全的HD钱包新手入门教程如何用Python BitcoinLib快速构建安全的HD钱包新手入门教程 Python BitcoinLib是一个功能强大的开发库为开发者提供了丰富的工具终极JavaScript数学统计指南Just.js均值、中位数、标准差实战终极JavaScript数学统计指南Just.js均值、中位数、标准差实战 在JavaScript开发中处理数学统计计算是常见需求。Just.js提供了一套开发工具上一篇复制组件导致GUID冲突怎么办guid-based-reference自动修复机制源码解析下一篇揭秘TIGER-DnR的多尺度选择性注意力MSA模块如何捕捉关键声学特征创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价 →
↑