在 Python 中,One-Hot Encoding(独热编码)是一种将分类变量转换为数值型变量的常用技术,它将每个类别映射为一个二进制向量,其中只有一个元素为 1,其余为 0。
以下是几种常用的实现方法:
使用 sklearn.preprocessing.OneHotEncoder(推荐用于机器学习)
这是最常用且功能强大的方法,特别适用于机器学习管道。
import numpy as np
from sklearn.preprocessing import OneHotEncoder
# 示例数据
data = np.array([['男'], ['女'], ['女'], ['男'], ['未知']])
# 初始化 OneHotEncoder
encoder = OneHotEncoder(sparse_output=False) # sparse_output=False 返回密集数组
# 拟合并转换数据
one_hot_encoded = encoder.fit_transform(data)
print("独热编码结果:")
print(one_hot_encoded)
print("特征名称:", encoder.get_feature_names_out())
输出:
独热编码结果:
[[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[1. 0. 0.]
[0. 0. 1.]]
特征名称: ['x0_男' 'x0_未知' 'x0_女']
注意:在较新版本的 scikit-learn 中,
sparse_output
参数替代了旧的
sparse参数。
使用 pandas.get_dummies()(推荐用于数据分析)
如果你在使用 Pandas 进行数据处理,get_dummies 是最简洁的方法。
import pandas as pd
# 示例数据
df = pd.DataFrame({
'gender': ['男', '女', '女', '男', '未知']
})
# 进行独热编码
df_encoded = pd.get_dummies(df, columns=['gender'], prefix='gender')
print(df_encoded)
输出:
gender_男 gender_女 gender_未知
0 1 0 0
1 0 1 0
2 0 1 0
3 1 0 0
4 0 0 1
使用 numpy.eye 和 np.unique(纯 NumPy 实现)
适用于没有引入 sklearn 或 pandas 的轻量级场景。
import numpy as np categories = np.array(['男', '女', '女', '男', '未知']) # 获取所有唯一类别并排序 unique_categories = np.unique(categories) # 创建独热编码矩阵 # np.eye 创建一个单位矩阵,索引对应类别在 unique_categories 中的位置 one_hot = np.eye(len(unique_categories))[np.searchsorted(unique_categories, categories)] print(one_hot)
输出:
[[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[1. 0. 0.]
[0. 0. 1.]]
手动实现(理解原理)
def one_hot_encode(labels, classes=None):
"""
手动实现独热编码
:param labels: 标签列表或数组
:param classes: 预定义的类别列表(可选)
:return: 独热编码矩阵
"""
if classes is None:
classes = sorted(set(labels)) # 自动获取所有唯一类别并排序
class_to_index = {cls: idx for idx, cls in enumerate(classes)}
n_classes = len(classes)
one_hot = np.zeros((len(labels), n_classes))
for i, label in enumerate(labels):
if label in class_to_index:
one_hot[i, class_to_index[label]] = 1
else:
raise ValueError(f"类别 '{label}' 不在预定义类别中")
return one_hot, classes
labels = ['男', '女', '女', '男', '未知']
encoded, classes = one_hot_encode(labels)
print("编码结果:n", encoded)
print("类别:", classes)
选择建议
| 方法 | 适用场景 | 优点 |
|---|---|---|
OneHotEncoder |
机器学习建模、Pipeline | 支持稀疏矩阵、可保存模型、处理新类别方便 |
get_dummies |
数据探索、统计分析 | 代码简洁、与 Pandas 无缝集成 |
numpy 手动实现 |
学习原理、无第三方库依赖 | 轻量、透明度高 |
注意事项
- 类别顺序:确保训练集和测试集的类别顺序一致,否则会导致特征错位。
- 新类别处理:在
OneHotEncoder中,如果测试数据出现训练时未见过的类别,默认会报错,可通过设置handle_unknown='ignore'来解决。 - 内存使用:独热编码会增加特征维度,对于高基数类别(如用户ID),建议使用目标编码(Target Encoding)或嵌入(Embedding)。
希望这些示例对你有帮助!
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/479568.html



