Published on

One-Hot Encoding

独热编码的核心原理

定义:将离散的类别特征转换为二进制向量,每个类别对应向量中的一个位置(仅该位置为1,其余为0)。

数学表示

若有 C 个类别,则每个类别编码为 C -维向量:

类别3(共5类) → [0, 0, 1, 0, 0]

张量兼容性:直接适配深度学习框架(如PyTorch/TensorFlow)的数值计算。

为什么在张量中特别有用?

(1) 保留类别独立性 避免数值编码的误导性排序(如将“红/绿/蓝”编码为1/2/3会隐含虚假的数值关系)。

  • 适合非序数分类数据(如颜色、城市、产品类型)。

(2) 与损失函数兼容 分类任务(如交叉熵损失)要求输出概率分布,独热编码天然匹配Softmax输出。

(3) 硬件加速优化 稀疏二进制向量适合GPU并行计算,提升训练效率。

实际应用示例

示例1:NumPy实现独热编码

import numpy as np

categories = ['dog', 'cat', 'bird']
num_classes = len(categories)

# 原始标签
labels = ['dog', 'bird', 'cat', 'dog']

# 转换为索引
label_indices = np.array([categories.index(label) for label in labels])

# 生成独热编码
one_hot = np.eye(num_classes)[label_indices]

print(one_hot)

输出:

[[1. 0. 0.]  # dog
 [0. 0. 1.]  # bird
 [0. 1. 0.]  # cat
 [1. 0. 0.]] # dog

示例2:PyTorch中的独热编码

import torch

labels = torch.tensor([0, 2, 1])  # 类别索引(假设共3类)
one_hot = torch.nn.functional.one_hot(labels, num_classes=3)

print(one_hot)

输出:

tensor([[1, 0, 0],
        [0, 0, 1],
        [0, 1, 0]])

注意事项

(1) 高维稀疏性问题 类别过多时(如百万级),独热编码会导致内存爆炸 → 改用嵌入层(Embedding)。

(2) 多标签分类 单个样本可能属于多个类别 → 用多标签编码(每个位置可为1或0):

[1, 0, 1]  # 同时属于类别0和类别2

(3) 数值稳定性 避免数值溢出,通常配合 float32 类型使用。

替代方案

场景替代方案优点
高基数类别嵌入层(Embedding)降维,节省内存
序数分类数值编码(0,1,2,...)保留顺序信息
树模型(如XGBoost)类别统计编码捕捉类别与目标的关系

总结

独热编码是张量中表示分类数据的黄金标准,尤其适合:

  • 低基数(类别少)离散特征
  • 需要与神经网络兼容的场景
  • 避免类别间虚假数值关系的场景

实际应用中,需结合具体任务和数据规模权衡其优缺点。

THE END