← 返回题目列表

LightGBM 如何处理类别特征?

中等 第 24 / 25 题 更新于 2026/09/19
集成学习机器学习面试题模型训练

简化版

LightGBM 可原生处理整数编码的类别特征,通过按类别目标统计排序后寻找高效二分,而不是把编号当连续大小或完全 one-hot。使用时必须声明 categorical feature,并处理高基数、稀有类和编码一致性。

详细版

  • 类别编码只需唯一整数,不代表数值顺序。

  • 原生算法避免 one-hot 高维并能组合类别集合。

  • 类别目标统计仅应来自训练节点,仍需正则防小类别过拟合。

  • 训练和推理必须共享类别到整数的映射。

  • 高基数 ID 仍可能记忆样本,不因原生支持就安全。

完整版教学

一、原生类别切分寻找集合而非数值阈值

无序 K 类穷举所有子集代价指数级。

LightGBM 可按类别的梯度/目标统计排序,再在排序后扫描边界,降低搜索。

这是一种高效近似:切分含义是某类别集合走左,而不是编码小于某数就天然相似。

二、底层机制与公式

categorical rule: category in {c2,c5,c9} -> left
not: encoded_value <= 5 as ordinal meaning

三、带数字的推演

城市编码 {北京:0,上海:1,深圳:2,成都:3}

最佳集合可能是 {北京,成都}{上海,深圳};连续阈值无法用一次切分表达该非相邻组合。

四、方案对比

方案/对象核心特点代价或边界
原生类别集合切分、维度低依赖库和正确声明
One-hot通用透明高基数维度爆炸
目标编码可跨模型泄漏与平滑复杂

五、执行流程

训练集建立映射 -> 标记 categorical columns -> 设置稀有/未知类
-> 训练与验证 -> 保存映射和模型 -> 线上拒绝映射漂移

六、边界条件与工程代价

Pandas category code 若训练与线上分别生成,整数可能对应不同城市,模型不会报错却会静默误判。

映射必须作为模型资产。

类别数接近样本数的 ID 特征会产生高方差切分,应删除、聚合或严格用时间外验证。

记忆钩子:原生类别特征的关键是“整数只是 ID,切分是类别集合”。

七、常见误区与追问

  • 误区:整数编码后可按连续特征使用。 无序编号的大小没有语义。

  • 追问:原生处理为何比穷举快? 先按统计排序再扫描有限边界。

  • 误区:原生支持就不会过拟合高基数。 小类别和 ID 仍有巨大方差。

  • 追问:未知类别怎么办? 固定 unknown 编码并验证其默认路由。

  • 追问:为何必须保存映射? 同一个整数在训练和线上必须表示同一类别。

八、加强记忆

原生类别特征的关键是“整数只是 ID,切分是类别集合”。

算法减少搜索,不替你解决高基数、未知类别和映射漂移。