LabelEncoder仅适用于目标变量y,不支持多列特征;OrdinalEncoder专为特征X设计,支持多列、显式顺序及新类别容错;OneHotEncoder适用于无序类别,避免虚假序关系。

LabelEncoder 不能直接处理多列,且只该用于 target(y)
LabelEncoder 的设计初衷是给标签(比如分类任务的 y)编码,不是给特征(X)用的。它只接受一维输入,传入二维数组会直接报错:ValueError: Expected 2D array, got 1D array instead。
常见误用场景:把整个 DataFrame 的多列特征一股脑喂给 LabelEncoder,结果崩在 fit_transform 上。
- 正确做法:对单列
y使用,例如le.fit_transform(y_train) - 错误做法:试图用
le.fit_transform(X_train[['cat1', 'cat2']])—— 这必须改用OrdinalEncoder - 遇到未见过的新类别时,
LabelEncoder.transform()会抛出ValueError: y contains new labels,无法容错
OrdinalEncoder 支持多列批量编码,且能显式定义顺序
OrdinalEncoder 是为特征(X)设计的,原生支持二维输入,一次处理多列。更重要的是,它允许你通过 categories 参数硬编码顺序,这对“低/中/高”“小/中/大”这类有序变量至关重要。
比如颜色按深浅排序:红 → 黄 → 蓝,若让 OrdinalEncoder 默认字典序(蓝/红/黄),就破坏了业务逻辑。
立即学习“Python免费学习笔记(深入)”;
- 显式指定顺序:
OrdinalEncoder(categories=[['red', 'yellow', 'blue']]) - 默认行为是字典序,不是出现顺序,这点容易被忽略
- 支持
handle_unknown='use_encoded_value'和unknown_value=-1,可安全处理测试集新值
OneHotEncoder 在无序类别上更安全,避免引入虚假序关系
当类别之间没有天然大小关系(如 ['male', 'female']、['beijing', 'shanghai', 'guangzhou']),用 LabelEncoder 或 OrdinalEncoder 会给模型造成“male
这时 OneHotEncoder 把每个类别展开成独立二进制列,彻底切断数值关联。
- 注意
OneHotEncoder输出默认是稀疏矩阵,常需加sparse_output=False(新版 API)或.toarray() - 类别数多时(如 >20),会产生大量高维稀疏特征,影响训练速度和内存
- 不建议对目标变量
y做 one-hot —— 分类模型(如LogisticRegression)本身支持多类,y保持整数标签即可
实际选型关键看三件事:维度、顺序、是否新值
别纠结“哪个更好”,先问自己:
- 要编码的是
y还是X?→y用LabelEncoder,X别用它 - 这些类别有没有业务定义的大小次序?→ 有就用
OrdinalEncoder并传categories;没有就跳过它 - 测试数据里会不会冒出训练时没见过的类别?→ 会的话,
LabelEncoder直接挂,OrdinalEncoder可配handle_unknown,OneHotEncoder默认支持
真正容易被忽略的,是 OrdinalEncoder 的 categories 必须严格按你想要的顺序写死——漏掉一个值、顺序写反、大小写不一致,都会导致编码错位,而且这种 bug 很难从结果里一眼看出来。


















