一句话定义:目标编码(Target Encoding)是把类别特征的每个取值,替换成该类别下目标变量的平均值(回归任务)或正例比例(分类任务)的编码方法,也叫均值编码(Mean Encoding)。
它怎么工作
假设你预测门店销售额,手里有“所在城市”这个类别。与其把城市拆成几十列 0/1(独热编码 One-Hot Encoding),不如直接写一个数:这个城市的历史平均销售额是多少。一列数字就装下了几十个城市的信息,梯度提升树(GBDT)类模型很吃这一套。
打个比方:你要评估一个新供应商靠不靠谱,最省事的办法是看“同类供应商过去的平均表现”。目标编码做的正是这件事,只不过它看的“同类”就是类别本身。
为什么它危险
问题在于算均值时用到了目标 y 本身。某个城市只有 3 条样本,销售额 100、200、300,均值 200,这个 200 是“看过答案”算出来的。极端情况下某类别只有 1 条样本,均值就等于它自己的 y,模型直接把答案抄下来,训练集上准得离谱,上线全崩。这就是目标泄漏(Target Leakage)。
正确做法:折外编码
折外编码(Out-of-Fold Encoding)把训练集切成 K 折,给第 i 折的样本算编码时,只用其余 K-1 折的数据统计均值。这样每条样本的编码值都没见过自己的 y。再叠加平滑(Smoothing):样本少的类别往全局均值上拉,(n×类别均值 + m×全局均值)/(n+m),m 是平滑强度。
| 编码方式 | 做法 | 主要问题 |
|---|---|---|
| 独热编码 | 每类一列 0/1 | 高基数时维度爆炸 |
| 计数编码 | 换成该类出现次数 | 丢掉了与目标的关系 |
| 目标编码 | 换成该类下的目标均值 | 不做折外处理必然泄漏 |
和嵌入(AI 词典:Embedding">Embedding)的区别:目标编码是无需训练的确定性统计量,嵌入是模型学出来的向量。
实际意义
用户 ID、商品 SKU、邮编这类高基数类别,目标编码往往比独热更省内存也更有效。但必须记住几条纪律:折外计算、加平滑、交叉验证(Cross-Validation)的每一折内部重新拟合映射表,否则线下评估会虚高。线上推理要用全量训练数据重算映射表,口径要和训练时一致;具体实现细节以所用库的官方文档为准。
对非技术岗也一样:用历史平均给类别打分是常识,只是别忘了一句——样本太少的类别,那个平均值不值得信。
