
机器学习深度学习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点击查看免费下载categorical_encoding是 H2O-3 分布式机器学习平台中控制分类特征Categorical Features如何被编码进入模型的核心超参数在 GBM、DRF、Deep Learning、K-Means、Aggregator、XGBoost、Isolation Forest、Extended Isolation Forest、Uplift DRF 等算法中均可配置。本文以官方参数文档 categorical_encoding.rst 为主体结合 h2o-core 与 h2o-algos 的源码实现系统讲解 8 种编码方案Enum、OneHotInternal、OneHotExplicit、Binary、Eigen、LabelEncoder、SortByResponse、EnumLimited的原理、适用算法、默认行为与选型建议。读完本文你将能针对不同算法与高基数high-cardinality数据场景正确选择并配置分类编码方式并理解其底层执行机制。参数速览可用算法GBM、DRF、Deep Learning、K-Means、Aggregator、XGBoost、Isolation Forest、Extended Isolation Forest、Uplift DRF是否为超参数是可参与网格搜索与 AutoML 调参默认值AUTO各算法自行决定见下文“AUTO 的解析逻辑”相关参数无该参数独立生效但与nbins_cats、max_categorical_levels等存在间接配合关系该参数的定义位于 Model.java 的CategoricalEncodingScheme枚举共包含 9 个取值public enum CategoricalEncodingScheme { AUTO(false), OneHotInternal(false), OneHotExplicit(false), Enum(false), Binary(false), Eigen(false), LabelEncoder(false), SortByResponse(true), EnumLimited(false); CategoricalEncodingScheme(boolean needResponse) { _needResponse needResponse; } final boolean _needResponse; boolean needsResponse() { return _needResponse; } }注意源码中SortByResponse(true)是唯一需要响应列response column的方案这一标记直接决定了后续的参数校验逻辑见下文“约束与校验”。八种编码方案逐项详解Enum枚举编码保留数据集原始形态内部将字符串映射为整数再使用这些整数进行切分。当分类级别数超过nbins_cats时按序数性质切分否则使用bitset 做完美分组切分perfect group split。每个类别都是独立类别类别名或编号本身无关紧要。例如字符串映射为{0,1,2,3,4,5}后可以切分为{0,4,5}与{1,2,3}无序分组。在 Extended Isolation Forest 中仅使用编码的序数性质进行切分。这是树模型GBM/DRF/Isolation Forest在AUTO下的默认行为在 IsolationForestModel.java 中可以看到AUTO被解析为Enum。EnumLimited枚举受限编码训练时自动将分类级别缩减到出现频率最高最 prevalent的T10个级别其余级别被合并处理。阈值T对应参数_max_categorical_levels其默认值定义在 Model.java 第 436 行public int _max_categorical_levels 10;。底层实现是 FrameUtils.java 的CategoricalEnumLimitedEncoder对基数超过_maxLevels且尚未被截断过的列调用Interaction.getInteraction(...)只保留 top-10 级别输出列名形如columnName.top_10_levels。在 XGBoost 中enum_limited会先做级别缩减再内部执行 one-hot 编码。适用场景分类基数极高、one-hot 展开会导致维度爆炸时用于压缩特征空间。OneHotInternal内部 One-Hot 编码保留数据集原样训练时在内部“即时”on the fly按行展开为 one-hot 向量不物理生成新列。对 N 个级别的分类特征等效产生 N 个部分算法为 N1 个含 NA 槽位指示列。这是 Deep Learning、Aggregator、XGBoost 在AUTO下的默认行为见下文。注意树方法GBM/DRF 等不允许使用此方案SharedTree.java 中会直接报错Cannot use OneHotInternal categorical encoding for tree methods.OneHotExplicit显式 One-Hot 编码对 N 个级别的分类特征物理生成N1 个新列额外一列通常表示缺失值。底层实现为 FrameUtils.java 的CategoricalOneHotEncoder每个分类列展开为cardinality 1列其中第cardinality列名为原列名.missing(NA)其余列名为原列名.级别名。适用于树模型如 GBM希望获得可解释的显式哑变量列以及 K-Means 等需要数值输入的场景。原文档的完整示例即采用该方案训练 GBM。Binary二进制编码每个分类特征最多生成32 列。原理先把每个类别映射为一个整数再把该整数写成二进制位每一位变成一个独立的 0/1 列这就是“no more than 32 columns”的由来——32 位整数。底层实现 CategoricalBinaryEncoder 的注释明确指出这是对 one-hot 变换的一种改进降低维度每个分类变量假设类别数为1 domain 基数多出的一个槽位预留给 NA数值val isNA ? 0 : 1 at8(iRow)然后逐位输出val 1并右移。输出列命名形如原列名:0、原列名:1……相比 one-hot列数从 N 降到 log₂(N)在分类基数大时显著节省内存代价是失去了可读性。Eigen特征空间投影编码对每个分类特征保留k 列即 one-hot 展开矩阵在k 维特征空间eigen space上的投影。底层实现 CategoricalEigenEncoder 的注释将其描述为“把分类变量转换为哑变量展开矩阵的第一个特征向量”构造时需要算法提供ToEigenVec源码中assert _tev ! null : Override toEigenVec for this Algo!;。这是 Aggregator 在AUTO下的实际默认行为见 Aggregator.java当需要压缩特征时会把AUTO解析为Eigen。LabelEncoder标签编码将每个枚举值转换为其索引整数level 0 - 0level 1 - 1……类别按字典序映射为数字从而失去分类性质、变成序数ordinal。映射后{0,1,2,3,4,5}只能按序数切分为{0,1,2}与{3,4,5}无法做到 Enum 那样的任意分组。底层实现 CategoricalLabelEncoder 仅做一件事对每个分类列调用toNumericVec()将其转换为数值向量。原文档特别指出该方案适合需要保持列数较少的场景如 XGBoost 或 Deep Learning 默认会做显式 one-hot 时。在 Extended Isolation Forest 中同样只使用编码的序数性质进行切分。SortByResponse按响应均值排序按**均值响应mean response**对级别重新排序响应最低的级别 - 0次低 - 1以此类推再按 Enum 的方式使用。仅适用于 GBM/DRF以及 XGBoost、K-Means、Deep Learning 文档中亦列出。典型价值当分类级别数多于nbins_cats时排序后“顶部级别切分”有机会真正把数据分开提升树模型的切分质量。硬性前提必须指定响应列。源码中SortByResponse(true)的_needResponse true并在 ModelBuilder.java 中校验若选择了该方案但无响应列则报错Categorical encoding scheme cannot be ... - no response column available.。底层触发逻辑见 ModelBuilder.java 的shouldReorder与 SharedTree.java 第 41 行当_categorical_encoding.needsResponse()且为监督学习时训练前会对分类列做级别重排框架层面修改 domain由adaptTestTrain负责测试集适配。AUTO 的解析逻辑不同算法各取所需算法AUTO 实际解析为源码依据GBM / DRF / Isolation Forest / Extended Isolation ForestEnumIsolationForestModel.java、SharedTree.javaDeep LearningOneHotInternalDeepLearningModel.javaXGBoostOneHotInternalXGBoostModel.java 经EffectiveParametersUtils.initCategoricalEncodingAggregatorEigen特征压缩场景或OneHotInternalAggregator.javaK-MeansEnum官方文档上述 AUTO 解析的通用入口是 EffectiveParametersUtils.initCategoricalEncoding仅当参数仍为AUTO时替换为算法指定的方案。约束与校验哪些方案在哪些算法下不可用分类编码不是“处处通用”源码中体现了几组硬性校验配置前务必确认树方法GBM/DRF/Isolation Forest/Uplift DRF不允许one_hot_internalSharedTree.java 报错Cannot use OneHotInternal categorical encoding for tree methods.XGBoost 不支持Enum与EigenXGBoost.java 的unsupportedCategoricalEncoding()会直接判定并报错。Deep Learning 不支持Enum与OneHotExplicitDeepLearningModel.java 分别报错Cannot use Enum encoding for categoricals - need numbers!与Wont use explicit Enum encoding for categoricals - its much faster with OneHotInternal!。sort_by_response必须有响应列ModelBuilder.java。交互约束interaction constraints仅兼容特定编码GBM 与 XGBoost 均限制交互约束只能配合AUTO即OneHotInternal/OneHotExplicit系列使用见 GBM.java 与 XGBoostModel.java。POJO/MOJO 导出兼容性DeepLearning 仅支持OneHotInternal、Binary、Eigen、LabelEncoder、SortByResponse方案的 POJO/MOJO 导出见 DeepLearningModel.java。此外在预测scoring阶段Model.java 会检查是否需要“小心处理编码”Binary、LabelEncoder、Eigen、EnumLimited、OneHotExplicit这 5 种方案会在测试帧未编码时做兼容处理按原始列名对齐缺失列自动填 NA而Enum、AUTO、SortByResponse、OneHotInternal则原样放行。这也是“训练后直接拿原始帧做预测”能够工作的底层原因。完整可运行示例GBM OneHotExplicit 航班延误预测以下示例来自官方文档使用航班准点数据allyears2k_headers.zip二分类航班是否延误IsDepDelayed演示如何通过categorical_encoding指定显式 One-Hot 编码训练 GBM。数据集在仓库测试目录中亦有本地副本可供参考见 h2o-py/h2o/h2o_data。R 版本library(h2o) h2o.init() # 导入航班数据用于判断航班是否延误 YES/NO airlines - h2o.importFile(http://s3.amazonaws.com/h2o-public-test-data/smalldata/airlines/allyears2k_headers.zip) # 将列转为因子factor airlines[Year] - as.factor(airlines[Year]) airlines[Month] - as.factor(airlines[Month]) airlines[DayOfWeek] - as.factor(airlines[DayOfWeek]) airlines[Cancelled] - as.factor(airlines[Cancelled]) airlines[FlightNum] - as.factor(airlines[FlightNum]) # 设置预测变量与响应列 predictors - c(Origin, Dest, Year, UniqueCarrier, DayOfWeek, Month, Distance, FlightNum) response - IsDepDelayed # 划分训练集与验证集80/20 airlines_splits - h2o.splitFrame(data airlines, ratios 0.8, seed 1234) train - airlines_splits[[1]] valid - airlines_splits[[2]] # 指定分类编码方案 encoding - OneHotExplicit # 训练 GBM airlines_gbm - h2o.gbm(x predictors, y response, training_frame train, validation_frame valid, categorical_encoding encoding, seed 1234) # 输出验证集 AUC print(h2o.auc(airlines_gbm, valid TRUE))Python 版本import h2o from h2o.estimators.gbm import H2OGradientBoostingEstimator h2o.init() h2o.cluster().show_status() # 导入航班数据 airlines h2o.import_file(https://s3.amazonaws.com/h2o-public-test-data/smalldata/airlines/allyears2k_headers.zip) # 将列转为 factor airlines[Year] airlines[Year].asfactor() airlines[Month] airlines[Month].asfactor() airlines[DayOfWeek] airlines[DayOfWeek].asfactor() airlines[Cancelled] airlines[Cancelled].asfactor() airlines[FlightNum] airlines[FlightNum].asfactor() # 设置预测变量与响应列 predictors [Origin, Dest, Year, UniqueCarrier, DayOfWeek, Month, Distance, FlightNum] response IsDepDelayed # 划分训练集与验证集 train, valid airlines.split_frame(ratios[.8], seed1234) # 指定分类编码方案 encoding one_hot_explicit # 初始化并训练 GBM airlines_gbm H2OGradientBoostingEstimator(categorical_encodingencoding, seed1234) airlines_gbm.train(xpredictors, yresponse, training_frametrain, validation_framevalid) # 输出验证集 AUC print(airlines_gbm.auc(validTrue))运行要点R 与 Python 均需先h2o.init()启动本地 H2O 集群categorical_encoding取值大小写不敏感如OneHotExplicit与one_hot_explicit等价验证集 AUC 通过validTrue参数计算。选型建议如何挑选编码方案结合官方文档描述与源码行为可按以下思路决策树模型GBM/DRF/Isolation Forest/Uplift DRF默认AUTO即Enum通常已是兼顾性能与准确率的选择类别数远超nbins_cats时可尝试SortByResponse需有响应列提升切分质量需要显式哑变量列做特征解释时选OneHotExplicit类别基数极大且内存吃紧时用EnumLimitedTop-10或Binary压缩维度。XGBoost默认AUTO即OneHotInternal与内部 one-hot 处理配合最好避免使用Enum、Eigen源码直接拒绝追求列数精简可考虑LabelEncoder或EnumLimited。Deep Learning / Aggregator默认OneHotInternal在内部即时展开速度最快若担心 one-hot 特征过多导致网络输入维度过大DeepLearningModelInfo.java 的日志甚至会主动建议改用enum_limited。K-Means需数值输入Enum为 AUTO 默认也可用OneHotExplicit、Binary、Eigen将分类列转成可参与距离计算的数值特征。需要生成 POJO/MOJO 部署DeepLearning 需注意其导出白名单XGBoost 的编码选择还影响交互约束interaction constraints的可用性。由于categorical_encoding本身是超参数建议在网格搜索或 AutoML 中将其作为一个维度参与调优配合seed固定随机性用验证集指标如本示例的 AUC横向比较不同编码方案在同一数据与算法下的真实效果。赞分享机器学习深度学习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 缺失值处理参数 missing_values_handling 完全指南Skip、MeanImputation 与 PlugValues 的选型与实战H2O 3 缺失值处理参数 missing_values_handling 完全指南Skip、MeanImputation 与 PlugValues 的选型与机器学习深度学习AutoML大数据后端H2O-3 模型增量训练完全指南checkpoint 参数原理、约束与实战H2O 3 模型增量训练完全指南checkpoint 参数原理、约束与实战 checkpoint模型检查点是 H2O 3 分布式机器学习平台中用于续训机器学习深度学习AutoML大数据后端3分钟掌握Statsmodels分类变量处理哑变量与效应编码实战指南3分钟掌握Statsmodels分类变量处理哑变量与效应编码实战指南 你还在为统计模型中的分类变量处理头疼吗营销数据分析时遇到地区性别等非数值变量无数据分析数据科学科研创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考