类别编码:One-Hot 与有序编码
把类别值转换为模型可处理的数值,同时避免给无序类别强加不存在的大小关系。
学习前需要掌握
背景与问题
城市、颜色或产品类型不是天然可计算的连续数值。简单用 0、1、2 代替名称,可能让线性模型或距离方法错误地认为类别具有大小顺序与等距关系。
编码应表达任务中允许的关系,并在训练和预测之间保持相同类别集合与列语义。
概念定义
One-Hot 为类别创建独立指示列;有序编码把具有真实顺序的类别映射到数值等级。无序类别编号与有意义的顺序等级不同,不能只因为都是整数就互相替代。
编码器的已学状态包括类别集合、输出顺序和未知值处理方式。它们与模型参数同样需要保存和复用。
直观理解
One-Hot 像为每种颜色准备一个开关,而不是把红色排在绿色之前。一个样本打开属于它的开关;具体哪一列代表哪种颜色,应看编码器输出,不能凭输入顺序猜测。
输出列为什么不是按输入出现顺序排列
训练颜色按 red、green、blue 输入,编码器可能输出 blue、green、red 三列。此时 green 是 [0,1,0],red 是 [0,0,1],应读取 get_feature_names_out 或类别属性确认。
若未来遇到 yellow,忽略未知值的策略产生 [0,0,0]。这只是“训练集合里没有它”的表示,不代表黄色属于一种概率为零的真实业务类别;还应监控未知率。
核心原理
训练时拟合类别集合,验证和预测只应用该集合。某类没有在训练中出现时,需要明确是报错、全零、并入其他类还是采用其他处理,而不是临时新增一列破坏模型接口。
handle_unknown='ignore' 常使未知类别对应全零编码,这能保持维度,但不会自动教模型理解新类别。若又删除了一个基准类别,全零还可能与该基准表示混在一起。
有序编码只应在等级顺序确实合理时采用,并继续检查数值距离的含义。例如“低、中、高”的次序存在,也不自动说明从低到中的差与从中到高完全相同。
高基数类别、缺失值与标签驱动编码有各自边界。目标编码尤其要防止把当前样本答案写回特征,通常需要折外构造与严格验证。
计算与实现步骤
- 识别无序与有序类别。
- 确定缺失类别处理。
- 只在训练集拟合编码器。
- 对验证和测试复用列空间。
- 记录生成的特征名称。
- 检查高基数类别带来的维度与稀疏性。
代码实现
示例 1
One-Hot 编码未知类别
example_01.py用途:训练时建立类别空间,预测时安全处理新类别。
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(
handle_unknown="ignore",
sparse_output=False,
)
train = [["red"], ["green"], ["blue"]]
test = [["green"], ["yellow"]]
encoder.fit(train)
print(encoder.get_feature_names_out())
print(encoder.transform(test))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
训练时建立类别空间,预测时安全处理新类别。
Step 1 · 1–1 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from sklearn.preprocessing import OneHotEncoderStep 2 · 3–11 行
调用 fit 学习训练数据中的参数;若在 Pipeline 中,预处理器与模型会按顺序拟合。
encoder = OneHotEncoder(
handle_unknown="ignore",
sparse_output=False,
)
train = [["red"], ["green"], ["blue"]]
test = [["green"], ["yellow"]]
encoder.fit(train)
print(encoder.get_feature_names_out())
print(encoder.transform(test))预期输出或运行结果
列名包含 blue、green、red;green 行有一个 1,yellow 行为全 0。 ['x0_blue' 'x0_green' 'x0_red'] [[0. 1. 0.] [0. 0. 0.]]
常见错误 · 3 条
- 无序类别直接编码为 0/1/2
- 训练和预测独立 get_dummies 导致列不一致
- 忽略高基数问题
实际应用
- 无序类别特征
- 线性模型
- 混合类型 Pipeline
常见错误
- 无序类别直接编码为 0/1/2
- 训练和预测独立 get_dummies 导致列不一致
- 忽略高基数问题
推荐学习资料
参考库不会生成虚假资源或无效外部链接。