类别特征如何处理:Label Encoding 与 One-Hot Encoding

Label Encoding 和 One-Hot Encoding 都能把类别变成数字,但它们表达的含义完全不同。

学习路线:传统机器学习基础(21~34) · 第 25 课
第 25 课类别字段分别经过标签编码和独热编码转换成数字特征的对比图。
Learning Path

传统机器学习基础(21~34)

补齐文本分类项目背后的数据处理、算法、评估和模型选择知识。

学完本阶段你能做到:拿到一份结构化表格数据,独立完成清洗、特征工程、建模、评估、模型选择和保存,并用规范流程比较多个算法。

推荐读法:建议系统读。做项目时遇到数据和模型选择问题,也可以按需回查。

查看完整阶段 · 14 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「类别特征如何处理:Label Encoding 与 One-Hot Encoding」解决的核心问题
  • 知道它在「传统机器学习基础(21~34)」中的位置
  • 把 特征工程、分类与回归、机器学习 这些关键词联系起来

前置知识

  • 建议先读完上一篇:特征工程是什么?模型为什么不能直接理解原始数据
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【特征工程】模型不能直接理解很多现实信息,特征工程就是把信息翻译成模型能吃进去的格式。 前面或后面会反复用到它。
  • 【分类与回归】判断邮件是不是垃圾邮件是分类,预测房价是多少是回归。 前面或后面会反复用到它。
  • 【机器学习】机器学习的重点不是手写所有规则,而是准备数据、定义目标,让模型自己找到可复用的模式。 前面或后面会反复用到它。
  • 【监督学习】如果训练数据里有“题目”和“答案”,模型学会以后再给它新题目,它就尝试给出答案。 前面或后面会反复用到它。

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要把概念孤立背下来,要放回数据到结果的完整链路里。

课后练习

  • 用 3 句话向一个零基础朋友解释「类别特征如何处理:Label Encoding 与 One-Hot Encoding」。
  • 打开概念库里的「特征工程」,补一遍它和本文的关系。
  • 读下一课「数据标准化和归一化有什么区别」前,先写下你认为它会解决的问题。

自检练习与参考答案

1. 用一句话说清「类别特征如何处理:Label Encoding 与 One-Hot Encoding」解决了什么问题。

合格答案不是复述标题,而是说清它在“数据进入模型、模型学习、结果评估或项目落地”中的作用。

2. 这篇文章和上一课或下一课是什么关系?

它应该为下一课「数据标准化和归一化有什么区别」铺路:读完后要知道下一课为什么自然出现。

下一步建议读「数据标准化和归一化有什么区别」。

很多机器学习数据里都会有类别字段,比如城市、性别、职业、会员等级、商品类型。

这些字段对预测很有用,但模型不能直接读取“北京”“黄金会员”“电子产品”这些文字。我们必须先把类别转换成数字,这一步叫类别编码。

第 25 课视频 · Label Encoding 与 One-Hot Encoding(约 1 分 48 秒)

先看最常见的两种编码

第一种是 Label Encoding,也叫标签编码。

它会给每个类别分配一个数字:

普通会员 -> 0
白银会员 -> 1
黄金会员 -> 2

第二种是 One-Hot Encoding,也叫独热编码。

它会把一个类别字段拆成多列:

city=北京 -> city_北京=1, city_上海=0, city_深圳=0
city=上海 -> city_北京=0, city_上海=1, city_深圳=0

两种方法都把文字变成了数字,但它们传递给模型的含义不一样。

Label Encoding 适合什么情况

Label Encoding 适合有明确顺序的类别。

比如:

低 -> 0
中 -> 1
高 -> 2

或者:

差 -> 0
一般 -> 1
好 -> 2
优秀 -> 3

这些类别本身有大小关系,用数字表达是合理的。

代码可以这样写:

from sklearn.preprocessing import OrdinalEncoder

encoder = OrdinalEncoder(categories=[["普通会员", "白银会员", "黄金会员"]])
df["member_level_code"] = encoder.fit_transform(df[["member_level"]])

这里要注意,类别顺序最好由你自己指定,不要完全交给工具按字母或出现顺序自动决定。

One-Hot Encoding 适合什么情况

One-Hot Encoding 更适合没有大小顺序的类别。

比如城市:

北京、上海、深圳

这些城市没有谁天然比谁“大”。如果你把它们编码成:

北京=0,上海=1,深圳=2

某些模型可能会误以为深圳比北京“更大”,这就是错误的信息。

用独热编码更合适:

import pandas as pd

df = pd.get_dummies(df, columns=["city"], drop_first=False)

这样每个城市都变成一列,只表示这个样本是不是属于这个城市。

什么时候不能盲目 One-Hot

One-Hot Encoding 虽然直观,但类别很多时会让特征列数暴涨。

比如一个商品 ID 有 10 万个取值,如果全部独热编码,表格会一下多出 10 万列。这样不仅训练慢,还可能让模型更难泛化。

遇到高基数类别时,可以考虑:

  • 合并低频类别;
  • 只保留 Top N 类别;
  • 用目标编码;
  • 用 Embedding;
  • 或者根据业务重新构造更有意义的类别。

初学阶段先记住:类别少、无顺序,可以 One-Hot;类别有顺序,可以考虑有序编码。

训练和预测必须使用同一套编码规则

类别编码最容易出问题的地方,是训练和预测不一致。

比如训练时城市只有:

北京、上海、深圳

上线后来了一个新城市:

杭州

如果编码器没有处理未知类别,预测接口可能直接报错。

用 scikit-learn 时,可以这样设置:

from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
encoded = encoder.fit_transform(train_df[["city"]])

new_encoded = encoder.transform(new_df[["city"]])

注意训练集用 fit_transform,新数据只用 transform。不能在预测数据上重新 fit,否则列的含义会变。

一个简单选择表

可以先用这个规则判断:

有顺序的类别 -> Ordinal / Label Encoding
无顺序且类别不多 -> One-Hot Encoding
类别特别多 -> 先合并低频或考虑更高级方法
预测时可能有新类别 -> 编码器要支持 unknown

这不是绝对规则,但足够帮你开始做第一个版本。

本课总结

类别编码的核心不是“怎么把文字变成数字”,而是“这个数字会不会传递错误含义”。

这一课记住四句话:

  • 类别特征必须先转成数字;
  • 无序类别不要随便标签编码;
  • 独热编码会增加特征列数;
  • 编码规则要和模型一起保存。

下一课继续讲数值特征:标准化和归一化有什么区别,什么时候需要做。

Discussion

留言讨论