凌晨四点的“老王快餐店”后厨,贴着一张红色菜单:红烧肉 28 元、番茄炒蛋 18 元、清炒时蔬 12 元……店主老王想用电脑预测明天该备多少食材,可电脑不认识“红烧肉”这三个字,它只认数字。老王抓耳挠腮:怎么让那台铁疙瘩听懂我的菜单? 这就是类别编码要解决的问题——机器学习模型是“数字动物”,它吃不下文字。你给它一碗“青椒肉丝”,它只会愣住。但如果你把菜名翻译成它熟悉的数字,它就能飞快地算出明天该买多少肉、多少菜。把红绿蓝、男女生、北京上海这类文字标签转成数字,就叫类别编码。它有三种主流套路:独热编码(给每道菜开一个专属窗口)、目标编码(用常客对菜品的满意度打分代替菜名)、频率编码(按点单次数给菜排座次)。今天咱们就蹲在老王的厨房里,把这三招全学会。

岗位关联

特征工程是 AI 从业者的基本功,类别编码直接决定模型能否“吃下”真实业务数据。掌握这三种编码套路,你就能在表格数据建模中避免“编码选错、模型白费”的坑,这是从调包侠走向合格算法工程师的必经之路。

目录
  1. 可视化演示
  2. 什么是类别编码
  3. 独热编码详解
  4. 目标编码详解
  5. 频率编码详解
  6. 三种编码对比
  7. 编码选择实战
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

对比SGD与Adam优化器在损失曲面上的收敛轨迹,展示动量累积与自适应学习率的优势。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Adam vs SGD SGD: 带动量但学习率固定,轨迹振荡 Adam: 自适应学习率+动量,平滑收敛 Adam = Momentum + RMSprop

什么是类别编码

老王看着后厨那本手写菜单,忽然明白了一件事:电脑不是听不懂红烧肉,而是它对“文字”这种形式一窍不通。就像外国人看不懂中文菜单一样,机器学习模型只认数字。老王需要的是一本“翻译词典”,把菜单上的每个菜名翻成数字,这就是类别编码。

类别编码(Categorical Encoding) 是特征工程中最基础也最容易被忽视的环节。真实业务数据里,性别(男/女)、城市(北京/上海/广州)、产品类别(数码/家居/服饰)都是文字标签。模型训练时,这些字段必须变成数值矩阵才能进入算法。如果不做编码直接塞给模型,绝大多数算法会直接报错——就像你给只会说英语的厨师递了份中文菜单。

\begin{equation} \displaystyle \text{类别编码}: \quad \mathcal{C} \to \mathbb{R}^d \end{equation}

1. 类别集合 $\mathcal{C}$:这就是老王菜单上所有菜名的集合,比如 {红烧肉,番茄炒蛋,清炒时蔬}。每个元素是一个类别。

C={c1,c2,…,ck}\mathcal{C} = \{c_1, c_2, \ldots, c_k\}

2. 映射到实空间 $\mathbb{R}^d$:把每个菜名 $c_i$ 变成一个 d 维向量。d 可以等于类别数(独热编码),也可以是 1 或更低维(目标编码、频率编码)。

f:ci↦vi∈Rdf: c_i \mapsto \mathbf{v}_i \in \mathbb{R}^d

3. 特征工程中的地位:编码是数据预处理的一环,发生在收集原始数据之后、训练模型之前。它决定了模型“吃”到的特征长什么样。

原始数据→编码数值特征→训练模型\text{原始数据} \xrightarrow{\text{编码}} \text{数值特征} \xrightarrow{\text{训练}} \text{模型}

老王把这页翻译词典贴在收银机上,但它只是一张白纸。现在,他要往上面填内容了。

独热编码详解

老王想出的第一个办法:给每道菜开一个专属窗口。菜单上不是有三道菜吗?那就开三个窗口——“红烧肉窗口”、“番茄炒蛋窗口”、“清炒时蔬窗口”。顾客点哪道菜,就在对应窗口敲一下铃。三个窗口的铃铛状态就表示“今天点了哪道菜”。

这就是独热编码(One-Hot Encoding) 的核心思想:有 K 个类别,就创建 K 个虚拟维度(窗口),每个类别独占一个维度为 1,其余为 0。这样“红烧肉”就变成了向量 $[1, 0, 0]$,“番茄炒蛋”变成 $[0, 1, 0]$,“清炒时蔬”变成 $[0, 0, 1]$。三个数字的“开关组合”能唯一表示任意一道菜,且任意两个向量之间的距离都相等——老王后厨的三个窗口,互不干扰。

\begin{equation} \displaystyle \mathbf{v}_i = [\mathbb{1}(i=1), \; \mathbb{1}(i=2), \; \ldots, \; \mathbb{1}(i=k)] \end{equation}

1. 指示函数 $\mathbb{1}(i=1)$:判断第 $i$ 个类别是否是第一个类别。如果是,这个维度就是 1(铃铛响了);否则是 0(铃铛安静)。

1(i=1)={1,i=10,i≠1\mathbb{1}(i=1) = \begin{cases} 1, & i=1 \\ 0, & i \neq 1 \end{cases}

2. 向量长度为 K:总共有几个类别,向量就有几维。老王菜单有 3 道菜,所以每个向量都是 3 维。

vi∈{0,1}k\mathbf{v}_i \in \{0,1\}^k

3. 唯一性保证:每个类别的向量都是独一无二的,任意两个类别向量的内积为 0,称为正交。这意味着“红烧肉”和“番茄炒蛋”在数字空间里没有任何关联,是完全独立的两道菜。

vi⋅vj=0(i≠j)\mathbf{v}_i \cdot \mathbf{v}_j = 0 \quad (i \neq j)

但老王很快发现了问题:菜单上的菜只有 3 道,可广东茶餐厅的菜单有上百道菜!如果每道菜一个窗口,后厨得开几百个窗口,光是记住哪个窗口是哪道菜就够呛。在机器学习里,这叫维度爆炸——当类别数(基数)很大时,独热编码会生成极高维的稀疏矩阵,训练速度变慢、内存暴涨。独热编码最舒服的场景,是类别数少(一般建议少于 7 个)且类别之间没有大小顺序的无序特征,比如性别、颜色、国家代码。

目标编码详解

独热编码的窗口太多,老王换了个思路。他翻出过去三个月的记账本,惊讶地发现每道菜背后都有一个“平均满意度”:顾客给红烧肉平均打 4.5 分,给番茄炒蛋打 4.8 分,给清炒时蔬只打 3.2 分。老王心想:我不用记菜名,只记下每道菜的平均满意度数字不就行了吗?

这就是目标编码(Target Encoding) 的思路:用目标变量的均值来替换类别。在分类问题中,目标均值就是每个类别对应的标签平均值(比如点击率、转化率、好评率)。对第 $i$ 个类别,计算该类别所有样本的标签均值:$\text{enc}(c_i) = \frac{1}{n_i}\sum_{j \in c_i} y_j$。这样每个类别就压缩成了一个数字——老王不用记住“红烧肉”三个字,只需记住“打分 4.5”。

\begin{equation} \displaystyle \text{enc}(c_i) = \frac{1}{n_i} \sum_{j \in \text{Group}(c_i)} y_j \end{equation}

1. 分组 $\text{Group}(c_i)$:把所有属于第 $i$ 个类别的样本收集到一起。比如收集所有点过“红烧肉”的顾客记录。

Group(ci)={xj:类别(xj)=ci}\text{Group}(c_i) = \{x_j : \text{类别}(x_j) = c_i\}

2. 标签求和 $\sum y_j$:把这些样本的目标值(满意度评分)全部加起来。

Si=∑j∈Group(ci)yjS_i = \sum_{j \in \text{Group}(c_i)} y_j

3. 除以样本数 $n_i$:用总和除以该类别下的样本数量,得到平均分。这就是类别的新数字表示。

enc(ci)=Sini\text{enc}(c_i) = \frac{S_i}{n_i}

目标编码的魔力在于它特别适合高基数特征。比如“城市”有 500 个取值,独热编码会生成 500 列,而目标编码只生成 1 列——信息密度极高。但老王也有担忧:万一某道菜只被点过一次,那个顾客给了 5 分,这道菜就被标记为“满分神菜”,可这完全是巧合呀!这就是目标编码著名的过拟合风险。实际工程中常用平滑处理(Smoothing) 来解决:让小样本类别的均值向全局均值靠拢,公式为 $\text{enc} = \frac{n_i \cdot \bar{y}_i + m \cdot \bar{y}_{\text{global}}}{n_i + m}$,其中 $m$ 是平滑系数。当然,还有更严格的做法——在训练集和验证集上分别计算,避免数据泄露。

频率编码详解

目标编码虽好,但计算时要碰标签(y),老王嫌麻烦。他盯上了另一个更简单的数字:过去一年每道菜被点过多少次。红烧肉点了 1200 次,番茄炒蛋 800 次,清炒时蔬 400 次。老王想:干脆把这些次数直接当作菜名的数字代号吧!

这就是频率编码(Frequency Encoding):统计每个类别在数据集中出现的次数(或占比),用这个频率数字替换原来的文字标签。公式极简单:$\text{enc}(c_i) = \text{count}(c_i)$ 或 $\text{enc}(c_i) = \frac{\text{count}(c_i)}{N}$,其中 $N$ 是总样本数。老王只用数一数菜单上每道菜被划掉的次数,就能完成翻译——完全不需要看顾客满意度,没有任何过拟合风险。

\begin{equation} \displaystyle \text{enc}(c_i) = \frac{\text{count}(c_i)}{\sum_{j=1}^{k} \text{count}(c_j)} \end{equation}

1. 计数 $\text{count}(c_i)$:数一数第 $i$ 个类别在数据集中出现了多少次。老王翻开点单记录就能数出来。

ni=count(ci)n_i = \text{count}(c_i)

2. 总样本数 $\sum_{j=1}^{k} n_j$:把所有类别的出现次数加在一起,得到总记录数。

N=∑j=1knjN = \sum_{j=1}^{k} n_j

3. 计算占比:用每个类别的次数除以总数,得到 0 到 1 之间的频率。频率越高,说明这个类别越“热门”。

enc(ci)=niN\text{enc}(c_i) = \frac{n_i}{N}

但频率编码的短板也很明显:信息量有限。一个数字只能反映“热门程度”,丢失了类别与目标之间的具体关系。比如“红烧肉”和“番茄炒蛋”频率相近,但它们的顾客满意度可能天差地别——频率编码就分辨不出来了。它像老王只知道每道菜的“人气排名”,却不知道“口碑如何”。频率编码的好处是简单、稳健,在树模型上往往有不错的表现,适合作为目标编码的替代品或基线方案。

三种编码对比

现在老王手上有三本账本:独热编码的“窗口铃铛本”、目标编码的“满意度打分本”、频率编码的“点单计数本”。到底该用哪本?得看情况。

独热编码:信息无损、类别间距离相等,适合低基数无序特征,模型解释性强。但高基数时维度爆炸,训练变慢。目标编码:维度仅 1 列,与目标强相关,适合高基数特征。但有数据泄露和过拟合风险,需要平滑和交叉验证。频率编码:实现最简单、最安全,不会泄露标签信息。但丢失了类别与目标的关系,信息量有限。三者还有一个核心差异:独热编码产生的特征彼此正交、互不影响;而目标编码和频率编码都是把类别压缩成一个标量,保留了“数量关系”但失去了“独立维度”。

| 对比维度 | 独热编码 | 目标编码 | 频率编码 |

|---------|---------|---------|---------|

| 输出维度 | K 列 | 1 列 | 1 列 |

| 类别基数适应性 | 低基数(<7) | 高基数 | 高基数 |

| 是否使用标签 | 否 | 是 | 否 |

| 过拟合风险 | 低 | 高(需平滑) | 低 |

| 信息保留 | 完整 | 目标相关 | 仅频率 |

老王盯着对比表,心里有了底:独热编码是精度高但“只适合小铺子”的方案;目标编码是“信息密度大但容易走火入魔”的功夫;频率编码是“简单实用但上限有限”的稳妥招。

编码选择实战

老王发现自己面对的真实场景越来越复杂:隔壁服装店的老板娘请他帮忙分析销售数据,字段里有“服装类目”——T恤、牛仔裤、羽绒服、卫衣、连衣裙……足足 32 个类目。如果一股脑全用独热编码,表格会多出 32 列,而且大多数列都是 0,又稀疏又占内存。老王根据三本账本,总结了实战选择的标准流程。

第一步:看类别基数。如果类别数 ≤ 7 且无序,直接用独热编码——简单、可解释、效果稳;如果类别数很多(几十甚至几百),果断放弃独热,考虑目标编码或频率编码。第二步:看模型类型。线性模型(逻辑回归、线性回归)对数值的“大小”敏感,独热编码的正交性最适合它;树模型(随机森林、XGBoost、LightGBM)本身能处理乱序数字,用标签编码或频率编码也能工作,但目标编码往往能提升效果。第三步:看安全要求。如果担心数据泄露(用到了标签信息),优先频率编码或独热;如果要用目标编码,必须在训练集内做交叉验证式的编码,且对测试集使用训练集的编码映射,防止“未来信息穿越”。

\begin{equation} \displaystyle \text{决策规则} = \begin{cases} \text{One-Hot}, & k \leq 7 \; \text{且无序} \\ \text{Target}, & k \gg 7 \; \text{且树模型} \\ \text{Frequency}, & \text{需要稳健基线} \end{cases} \end{equation}

1. 条件 $k \leq 7$:类别数量小于等于 7 时,独热编码生成的列数可接受,不会造成维度爆炸。

k≤7⇒One-Hotk \leq 7 \Rightarrow \text{One-Hot}

2. 条件 $k \gg 7$:类别数量远大于 7 时,独热编码列数过多,改用目标编码把类别压缩为 1 列。

k≫7⇒Target / Frequencyk \gg 7 \Rightarrow \text{Target / Frequency}

3. 验证集评估:无论选哪种编码,最终都要在验证集上比较效果。编码没有绝对优劣,只有“适不适合当前数据”。

准确率验证=最终标准\text{准确率}_{\text{验证}} = \text{最终标准}

一周后,服装店的预测模型上线了,准确率提升了 15%。老王把三本账本整整齐齐地收进抽屉——他知道,编码只是第一步,但走对这一步,后面的模型训练就能顺风顺水。

AI 应用场景

电商平台的商品类目编码

阶段:数据预处理与特征工程

解决的问题:电商平台有数万种商品类目(如“手机壳-硅胶-透明”),直接做独热编码会生成几万列稀疏特征,模型训练内存爆炸且效果差。传统做法是手工归类或丢弃该字段,信息损失严重。AI 方案:对高基数类目使用目标编码,将每个类目的转化率均值作为编码值,既保留类目信息又不增加维度。

具体案例:某电商平台的“猜你喜欢”推荐系统,原始特征中“商品三级类目”有 2 万多个取值。业务团队用目标编码替换类目字段后,特征维度从 2 万列降为 1 列,推荐点击率提升 8%,且特征全部进入树模型后训练时间缩短 60%。

风控模型的地区编码

阶段:特征工程与模型训练

解决的问题:银行信贷风控中,“客户所在地区”是强特征,但全国有 3000 多个区县。若用独热编码,特征维度爆炸且大量稀疏列导致逻辑回归无法收敛。AI 方案:用频率编码将地区替换为客户占比或坏账率,既保留地区的风险分布特性,又避免稀疏矩阵。

具体案例:某消费金融公司的风控模型,将“客户地区”字段做频率编码后,配合 XGBoost 模型,AUC 从 0.73 提升至 0.79。同时目标编码的坏账率特征进一步帮模型识别高风险地区,审批通过率与逾期率的平衡得到改善。

Python 演示

python43 行
import pandas as pdimport numpy as npfrom sklearn.preprocessing import OneHotEncoderfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score # 构造老王快餐店的模拟数据data = pd.DataFrame({    '菜品': ['红烧肉', '番茄炒蛋', '清炒时蔬', '红烧肉', '番茄炒蛋',             '清炒时蔬', '红烧肉', '红烧肉', '番茄炒蛋', '清炒时蔬'],    '满意度': [1, 1, 0, 1, 0, 0, 1, 1, 1, 0]}) X = data[['菜品']]y = data['满意度'] # 1. 独热编码(One-Hot)one_hot = OneHotEncoder(sparse_output=False)X_one_hot = one_hot.fit_transform(X)print('独热编码维度:', X_one_hot.shape[1]) # 2. 频率编码(Frequency)freq_map = X['菜品'].value_counts(normalize=True)X_freq = X['菜品'].map(freq_map)print('频率编码示例:', X_freq.tolist()[:5]) # 3. 目标编码(Target)target_map = data.groupby('菜品')['满意度'].mean()X_target = X['菜品'].map(target_map)print('目标编码示例:', X_target.tolist()[:5]) # 用三种编码分别训练逻辑回归并对比encodings = {'独热编码': X_one_hot, '频率编码': X_freq.values.reshape(-1, 1),             '目标编码': X_target.values.reshape(-1, 1)} for name, X_enc in encodings.items():    X_train, X_val, y_train, y_val = train_test_split(        X_enc, y, test_size=0.3, random_state=42)    model = LogisticRegression()    model.fit(X_train, y_train)    acc = accuracy_score(y_val, model.predict(X_val))    print(f'{name} 准确率: {acc:.2f}')
目的:用模拟的菜品数据演示三种编码的实现方式,并对比它们对逻辑回归模型准确率的影响。
  1. OneHotEncoder(sparse_output=False)独热编码器将“菜品”列转为多列稀疏矩阵,每道菜一个维度。
  2. value_counts(normalize=True)统计每道菜出现频率并归一化为占比,得到频率编码映射表。
  3. X['菜品'].map(freq_map)用映射表把每个菜品名替换成其出现频率数字。
  4. groupby('菜品')['满意度'].mean()按菜品分组计算满意度的均值,作为目标编码的替换值。
  5. train_test_split(..., test_size=0.3)划分训练集和验证集,防止目标编码的数据泄露影响评估。

常见误区

误区我所有文字特征都用独热编码,效果绝对不会错,独热是最标准的做法,没必要学别的编码方式。

正解独热编码确实是最经典的做法,但它只适合类别数少的场景。当某列有 100 个类别时,独热会生成 99 列虚拟特征,矩阵变得稀疏且巨大,模型训练速度骤降。这就像老王给 100 道菜开 100 个窗口,后厨连站的地方都没有了。类别数多时,应该改用目标编码或频率编码。

为何常见:因为教科书和入门教程都以独热编码为例讲解,初学者容易把“演示案例”当成“通用方案”。

误区目标编码把类别压缩成一列数字,信息密度高,所以一定比独热编码效果好。

正解目标编码确实大大压缩了维度,但它有严重的数据泄露和过拟合风险。如果某类别只出现一次,它的目标均值就是那一个样本的标签本身,模型会“背答案”。而且对于线性模型,目标编码产生的单一数值特征对非线性关系表达很弱,效果可能反而不如独热。选择编码方法要看类别基数、模型类型和数据规模。

为何常见:很多人在高基数场景下用目标编码见到效果提升,就误以为它无条件优于独热,忽略了它依赖标签信息这一前提。

误区频率编码用了标签的信息,所以它和目标编码一样有数据泄露风险。

正解频率编码只用到了“类别出现的次数”,完全没有触碰目标变量 y。它统计的是类别本身的分布,和标签无关。在老王快餐店的场景里,频率编码只数“每道菜被点了多少次”,完全不看顾客给了几星好评。所以频率编码是最安全的编码方式之一,不存在数据泄露问题。

为何常见:初学者容易把“用了数据的其他信息”和“用了标签信息”混为一谈,其实只要不碰 y,就不构成数据泄露。

误区把文字变成数字就万事大吉了,可以直接送进模型训练。

正解编码只是特征工程的第一步。独热编码后常做标准化或归一化(尤其对线性模型);目标编码和频率编码后要检查数值分布是否过于集中,必要时做分箱或标准化。而且无论哪种编码,都要检查缺失值——如果某类别在训练集出现、在测试集没出现,映射表会返回 NaN,需要设置默认值填充。

为何常见:初学者把编码当终点,忽略了编码只是“翻译”,翻译完还得“排版”——也就是特征的缩放、缺失值处理。

面试题

Q1. 独热编码的核心思想是什么?

单选题 · easy

  • A.把类别映射为其出现频率
  • B.为每个类别创建一个虚拟维度← 正确答案
  • C.用目标均值替换类别
  • D.对类别进行排序编号

答案:B。独热编码为每个类别创建一个独立的虚拟维度,该类别对应位置为 1、其余为 0。就像老王给每道菜开一个专属窗口。频率编码是 B 的频率版,目标均值是 C 的目标编码,排序编号则是标签编码。

Q2. 以下哪种情况最适合使用独热编码?

单选题 · easy

  • A.城市字段有 500 个取值
  • B.性别字段有 2 个取值← 正确答案
  • C.商品 ID 有 5 万个取值
  • D.用户行为序列文本

答案:B。独热编码适合类别数少(一般 ≤7)的无序特征。性别只有 2 类,独热后仅 2 列,简洁高效。500 个城市或 5 万个商品 ID 用独热会维度爆炸,用户行为文本则属于文本特征而非类别字段。

Q3. 目标编码的主要风险是什么?

单选题 · mid

  • A.维度爆炸导致内存不足
  • B.类别间距离完全相等
  • C.小样本类别过拟合和数据泄露← 正确答案
  • D.无法处理缺失值

答案:C。目标编码用类别下的标签均值替换类别。若某类别样本很少,均值会被少数极端标签主导,造成过拟合;同时因使用了标签 y 的信息,若处理不当会数据泄露。维度爆炸是独热的问题,正交性是独热的特性。

Q4. 频率编码的计算方式是?

单选题 · mid

  • A.类别目标均值的平滑值
  • B.类别在数据集中出现的次数占比← 正确答案
  • C.类别的独热向量维度
  • D.类别的排序索引号

答案:B。频率编码就是用每个类别出现的次数除以总样本数,得到频率占比。老王数每道菜被点了多少次然后算比例。目标均值是目标编码,向量维度是独热,排序索引是标签编码。

Q5. 为什么树模型可以直接使用乱序的数字编码?

单选题 · mid

  • A.树模型不做距离计算← 正确答案
  • B.树模型内置独热编码
  • C.树模型只接受二进制输入
  • D.树模型会自动归一化数据

答案:A。树模型通过特征阈值切分做决策,不依赖特征间的距离或数值大小关系,所以无论数字是 3 还是 0.5,只要大小关系一致,切分点都能找到。而线性模型依赖特征值的大小和距离,所以独热编码更适合它。

Q6. 目标编码中平滑处理的目的是什么?

单选题 · hard

  • A.降低特征维度
  • B.让小样本类别的编码向全局均值收缩← 正确答案
  • C.加快模型训练速度
  • D.消除类别间的正交性

答案:B。平滑公式 $\text{enc} = (n_i\bar{y}_i + m\bar{y}_{\text{global}})/(n_i + m)$ 中,$m$ 越大,编码越向全局均值靠拢。这防止小样本类别的均值被偶然的极端标签主导,有效缓解过拟合。它不改变维度,也不加速训练。

Q7. 以下哪些情况适合使用目标编码?

多选题 · mid

  • A.类别数高达上千的特征← 正确答案
  • B.线性回归模型
  • C.树模型如 XGBoost 配合交叉验证← 正确答案
  • D.特征只有 2 个类别

答案:AC。目标编码适合高基数特征(如上千个城市或类目),将维度压缩为 1 列。它常用于树模型且需要配合交叉验证防止数据泄露。线性模型一般首选独热编码;只有 2 个类别时独热更简单可靠。

Q8. 关于三种编码的对比,哪些说法正确?

多选题 · hard

  • A.独热编码在低基数无序特征上表现稳定← 正确答案
  • B.频率编码不使用标签信息← 正确答案
  • C.目标编码一定优于频率编码
  • D.高基数时独热编码会维度爆炸← 正确答案

答案:ABD。独热适合类别少的无序特征;频率编码只统计次数、不碰标签,无数据泄露风险;高基数时独热的列数爆炸。目标编码不一定优于频率编码,因为它有较高的过拟合风险,效果取决于数据规模和模型,所以 C 错误。

Q9. 特征工程中的编码步骤发生在哪个阶段?

单选题 · easy

  • A.模型预测之后
  • B.数据预处理与建模之间← 正确答案
  • C.数据采集之前
  • D.模型调参之后

答案:B。编码是特征工程的核心环节,发生在数据收集之后、模型训练之前。它将原始文字特征转换成模型能消费的数值特征。老王是先收集点单数据,再查账本翻译成数字,最后才能喂给电脑预测。

Q10. 以下哪些措施可以减轻目标编码的数据泄露?

多选题 · hard

  • A.使用嵌套交叉验证计算编码值← 正确答案
  • B.在训练集和验证集上分别独立计算编码
  • C.对编码加入平滑项
  • D.只用训练集统计编码后应用到验证集← 正确答案

答案:AD。常用做法是只在训练集上统计目标均值,再把这个映射应用到验证集;更严格的做法是嵌套交叉验证,在每一折内部分别计算。B 的做法会导致验证集编码与训练分布不一致且仍可能泄露。平滑项(C)缓解过拟合而非泄露本身。