一句话定义:独热编码(One-Hot Encoding)是把一个类别变量拆成"和类别数量一样长"的 0/1 向量,其中只有一个位置是 1,其余全是 0。
打个生活化的比方:像开大会时的座位灯牌。会场里有 50 个座位,每个座位对应一个类别。点到"猫",只有"猫"这个座位的灯亮,另外 49 盏全灭。灯牌数量永远等于类别数,谁也占不了谁的灯。
为什么非得这么"浪费":因为大多数模型只会算数,不会读字。可如果直接给类别编号——猫=0、狗=1、鱼=2——模型就会以为"鱼比狗大""猫和狗的平均值是 0.5"。这种大小关系是编号带来的假象,不是数据里真实存在的。
独热做的事很纯粹:它只回答"是不是这个类别",不添加任何额外假设。任意两个类别的向量点积为 0、距离相等,也就是在模型眼里,猫和狗、猫和鱼的陌生程度完全一样。
| 编码方式 | "猫/狗/鱼"怎么表示 | 代价 |
|---|---|---|
| 序号编码(Label Encoding) | 0 / 1 / 2 | 引入虚假的大小和顺序关系 |
| 独热编码(One-Hot Encoding) | [1,0,0] / [0,1,0] / [0,0,1] | 维度等于类别数,稀疏、占内存 |
| 嵌入(AI 词典:Embedding">Embedding) | 形如 [0.2, -0.4, …] 的稠密向量(数值仅示意) | 需要足够数据才学得准,可解释性弱 |
缺点很扎眼:类别一多就爆炸。十万个商品,一条样本就是十万维向量,其中九万九千多个零;存储浪费,计算也浪费,而且每个类别要单独学一个权重,低频类别几乎学不动。
那为什么它仍是默认起点:
- 它是"最不撒谎"的翻译方式,不引入虚假顺序,是天然的 baseline(基线)。
- 线性模型、逻辑回归、树模型对独热都很友好,每个类别对应一个权重,能直接读出"这个类别对结果有多大影响",可解释性强。
- 工程上讲究先跑通再优化:先用独热把整条流程跑出一版指标,再决定值不值得换更贵的方法。
- 它没有被淘汰,而是被"压扁"了。嵌入那一步查表,数学上等价于用一个大矩阵去乘独热向量。换句话说,Embedding 是学出来的、压缩过的独热。
什么时候该换掉:类别数是几万几十万(用户 ID、商品 ID)、类别之间本身有语义相似度可以借用、或者内存和训练时间扛不住时,就改用 Embedding、高频类别保留而低频归入"其他",或者用特征哈希(Feature Hashing)。具体工具的支持情况,以官方页面为准。
实际意义:遇到一个类别特征,先问一句"这些类别之间有内在顺序或大小关系吗"。没有,就独热;维度吃不消,再上 Embedding。日常刷推荐流,每一次点击背后往往就是几千维的 0/1 向量——笨,但诚实。作为默认起点,诚实通常比聪明更值钱。
