分类变量编码
标签编码、独热编码、序数编码,以及 pd.get_dummies() 与 sklearn OrdinalEncoder 的比较
分类变量编码 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
为什么要编码类别
大多数机器学习模型需要的是 NUMBERS,而不是“红色”或“小型”这样的文本标签。编码可以将类别变量转换为数值形式,同时保留其含义。
序数型与名义型
序数型类别具有自然顺序(小型 < 中型 < 大型)。名义型类别没有自然顺序(红色、绿色、蓝色)。正确的编码方式取决于类别的类型。
序数型数据的标签编码
LabelEncoder会将每个类别映射为一个整数。对于整数顺序具有实际意义的 ORDINAL 数据,这种方法很合适。
from sklearn.preprocessing import LabelEncoder
sizes = ["small", "large", "medium", "small"]
le = LabelEncoder()
print(le.fit_transform(sizes)) # integers (alphabetical by default)名义型数据中的风险
将标签编码应用于 NOMINAL 数据存在风险:模型可能会将红色=0、绿色=1、蓝色=2 解读为绿色“位于”红色和蓝色之间,从而凭空产生错误的顺序。请改用独热编码。
使用 get_dummies 进行独热编码
pd.get_dummies会为每个类别创建一个二进制列。每行恰好有一个列的值为 1,不会隐含任何顺序,非常适合名义型变量。
import pandas as pd
df = pd.DataFrame({"color": ["red", "green", "blue", "red"]})
print(pd.get_dummies(df, columns=["color"]))虚拟变量陷阱
当 k 个类别生成 k 列时,这些列会完全共线(它们的和始终为 1)。这就是虚拟变量陷阱,会破坏线性模型。删除一列即可解决问题。
删除首个类别参数
drop_first=True会移除一个类别,只保留 k-1 列。被删除的类别会成为隐式基准(全为零),从而消除共线性。
print(pd.get_dummies(df, columns=["color"], drop_first=True))
# one fewer column; the dropped color is the baseline机器学习库中的 OrdinalEncoder
对于管道,OrdinalEncoder是机器学习库中用于 FEATURES 标签编码的对应工具,并且允许您明确指定类别顺序。
from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder(categories=[["small", "medium", "large"]])
print(enc.fit_transform([["medium"], ["large"], ["small"]]))机器学习库中的 OneHotEncoder
OneHotEncoder是适合管道使用的独热编码工具。它会从训练数据中学习类别,并将相同的映射应用于新数据,这对生产环境至关重要。
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse_output=False)
print(ohe.fit_transform([["red"], ["green"], ["blue"]]))处理未见过的类别
测试数据中可能包含训练时从未见过的类别。请设置 handle_unknown="ignore",这样 OneHotEncoder 会输出全零,而不会引发错误。
ohe = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
ohe.fit([["red"], ["green"]])
print(ohe.transform([["blue"]])) # all zeros, no error高基数列
对包含数千个唯一值的列进行独热编码,会使特征数量急剧膨胀。对于高基数数据,可以考虑目标编码、哈希编码,或将罕见类别归入“其他”。
快速检查
请测试您对编码的理解。
回顾
编码工具箱:
- 序数型数据 -> 整数编码(
LabelEncoder/OrdinalEncoder) - 名义型数据 -> 独热编码(
pd.get_dummies/OneHotEncoder) drop_first=True可以避免虚拟变量陷阱- 对于测试数据中未见过的类别,使用
handle_unknown="ignore" - 请注意高基数列导致的特征数量膨胀
常见问题解答
「分类变量编码」课时是免费的吗?
是的 — 「分类变量编码」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「分类变量编码」这节课中我会学到什么?
标签编码、独热编码、序数编码,以及 pd.get_dummies() 与 sklearn OrdinalEncoder 的比较 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「分类变量编码」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。