机器学习入门文档深度页
类别编码:One-Hot 与有序编码
把类别值转换为模型可处理的数值,同时避免给无序类别强加不存在的大小关系。
学习前需要掌握
类别变量内容待补充训练/测试边界内容待补充
背景与问题
多数传统模型需要数值输入。若把红、绿、蓝直接编码为 0、1、2,线性或距离模型会误以为类别之间存在距离和倍数关系。
概念定义
One-Hot 为每个无序类别建立独立指示列;有序编码只适用于确实存在低、中、高等顺序的类别。
直观理解
One-Hot 像为每个类别设置独立开关;有序编码则像等级刻度,只有真实存在顺序时才合理。
核心原理
训练阶段学习类别集合和输出列顺序,预测阶段必须复用。OneHotEncoder(handle_unknown="ignore") 可让未知类别产生全零编码而不是直接报错,但仍应监控未知率。
计算与实现步骤
- 1
识别无序与有序类别。
- 2
确定缺失类别处理。
- 3
只在训练集拟合编码器。
- 4
对验证和测试复用列空间。
- 5
记录生成的特征名称。
- 6
检查高基数类别带来的维度与稀疏性。
代码实现
示例 1
One-Hot 编码未知类别
One-Hot 编码未知类别
scikit-learn
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。
常见错误 · 3 条
- 无序类别直接编码为 0/1/2
- 训练和预测独立 get_dummies 导致列不一致
- 忽略高基数问题
实际应用
- 无序类别特征
- 线性模型
- 混合类型 Pipeline
常见错误
无序类别直接编码为 0/1/2
训练和预测独立 get_dummies 导致列不一致
忽略高基数问题
文档来源
02|数据预处理与特征工程原始文档
学习资料/learning_tech/02_preprocessing_feature_engineering.md- §4 类别编码
- §13 同时处理数值和类别列
推荐学习资料
暂未收录相关资料
参考库不会生成虚假资源或无效外部链接。