核心要点

  • One-Hot:低基数类别,每类一列,无序无偏,但高基数会维度爆炸

  • Target/Mean 编码:高基数类别用目标均值替代,需交叉验证/平滑防泄漏

  • Embedding:深度模型中学习低维稠密向量,捕捉类别间语义关系

  • 树模型可用 Label/Ordinal 编码,CatBoost 内置有序目标编码

标准回答

One-Hot 编码

每个类别变成一个 0/1 列,无序、不引入虚假大小关系。适合低基数(如性别、星期)。缺点是高基数下维度爆炸、矩阵稀疏,对树模型不友好。

Target(Mean)编码

用该类别下目标变量的均值替代类别,把高基数压成一列,信息量大。核心风险是目标泄漏——直接用全量统计会把标签信息泄给特征导致过拟合。必须用 K 折交叉/留一或加平滑(向全局均值收缩,低频类别更依赖先验),并只用训练集统计。适合高基数特征(如用户 ID、城市)。

Embedding 编码

在深度模型中为每个类别学习一个低维稠密向量,训练中端到端优化,能捕捉类别间语义相似性,是高基数类别在神经网络中的主流方案。

选择经验

低基数无序 → One-Hot;高基数 + 树模型 → Target 编码(防泄漏);高基数 + 深度模型 → Embedding;有序类别 → Ordinal。CatBoost 等模型内置有序目标编码可直接用。

常见误区

⚠️ 常见踩坑

Target 编码最易踩的坑是数据泄漏——在全量数据上算类别均值会把标签信息泄进特征,必须配合交叉验证折外统计与平滑,否则线下虚高、线上崩盘。

追问

追问 1Target 编码如何防止过拟合和泄漏?

三招:1)只用训练集、且对每个样本用「折外/留一」均值(不含该样本自身标签);2)加平滑,把类别均值向全局均值收缩,公式 (n·类别均值+m·全局均值)/(n+m),低频类别更靠先验;3)可加噪声。验证/测试集用训练集统计量映射。

追问 2为什么不能对无序类别直接用 Label Encoding 喂给线性模型?

Label/Ordinal 编码把类别映射成整数 0,1,2…,会引入虚假的大小和等距关系,线性模型、KNNSVM 会误以为类别间存在数值序关系。无序类别对这类模型应用 One-Hot;树模型对整数编码相对不敏感,可接受。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。