趋近智
大多数机器学习 (machine learning)算法都处理数值数据。它们能理解数字、距离和梯度,但不能直接理解“红色”、“蓝色”、“管理员”或“用户”这样的类别。当您的数据集包含类别特征(表示不同群组或标签的变量)时,您需要将它们转换为算法可以高效处理的数值格式。这种转换过程是特征工程的一个基本组成部分。选择正确的编码策略非常重要,因为它能直接影响模型性能。
下面我们来看一些常用且有效的类别变量编码技术。
独热编码(One-Hot Encoding)可能是处理标称类别特征(类别之间没有固有顺序)最常用的技术。它的工作原理是为原始特征的每个独特类别创建一个新的二元(0或1)列。对于给定的观测值,与其类别对应的列获得1,而所有其他新列获得0。
考虑一个具有“红色”、“绿色”和“蓝色”类别的特征Color。独热编码将其单列转换为三列:
| 原始颜色 | 颜色_红 | 颜色_绿 | 颜色_蓝 |
|---|---|---|---|
| Red | 1 | 0 | 0 |
| Green | 0 | 1 | 0 |
| Blue | 0 | 0 | 1 |
| Red | 1 | 0 | 0 |
实现:
您可以使用Pandas库轻松实现这一点:
import pandas as pd
# 示例DataFrame
data = {'ID': [1, 2, 3, 4], 'Color': ['Red', 'Green', 'Blue', 'Red']}
df = pd.DataFrame(data)
# 应用独热编码
df_encoded = pd.get_dummies(df, columns=['Color'], prefix='Color')
print(df_encoded)
# ID Color_Blue Color_Green Color_Red
# 0 1 0 0 1
# 1 2 0 1 0
# 2 3 1 0 0
# 3 4 0 0 1
或者,Scikit-learn的OneHotEncoder提供了更多控制,尤其是在ML管道中:
from sklearn.preprocessing import OneHotEncoder
import numpy as np
# 示例数据 (需要是二维)
colors = np.array(['Red', 'Green', 'Blue', 'Red']).reshape(-1, 1)
# 初始化并拟合编码器
encoder = OneHotEncoder(sparse_output=False) # sparse=False 给出密集数组
encoded_colors = encoder.fit_transform(colors)
print(encoded_colors)
# [[0. 0. 1.] # -> 蓝 绿 红 (顺序取决于拟合)
# [0. 1. 0.]
# [1. 0. 0.]
# [0. 0. 1.]]
print(encoder.categories_) # 显示映射
# [array(['Blue', 'Green', 'Red'], dtype='<U5')]
优点:
缺点:
Color_Red和Color_Green为0,则Color_Blue必须为1)。一些实现(如pd.get_dummies(..., drop_first=True))或模型会自动处理此问题。标签编码为每个类别分配一个独特的整数。对于我们的Color示例,它可能看起来像这样:“红色” -> 0,“绿色” -> 1,“蓝色” -> 2。
| 原始颜色 | 编码颜色 |
|---|---|
| Red | 0 |
| Green | 1 |
| Blue | 2 |
| Red | 0 |
实现:
Scikit-learn的LabelEncoder常用:
from sklearn.preprocessing import LabelEncoder
# 示例数据 (一维数组)
colors = ['Red', 'Green', 'Blue', 'Red']
# 初始化并拟合编码器
label_encoder = LabelEncoder()
encoded_colors = label_encoder.fit_transform(colors)
print(encoded_colors)
# [2 1 0 2] # <- 顺序取决于字母顺序或首次出现顺序
print(label_encoder.classes_) # 显示映射
# ['Blue' 'Green' 'Red']
优点:
缺点:
何时使用标签编码:
目标编码(Target Encoding)是一种更高级的技术,特别适用于高基数类别特征。它不是创建虚拟变量或任意数字,而是用属于该类别的观测值的目标变量均值来编码每个类别。
例如,如果您正在预测客户流失(流失则目标为1,否则为0),并且有一个“城市”特征,那么“纽约”的目标编码将是训练数据中纽约客户的平均流失率。
原理:
优点:
缺点:
目标编码功能强大,但需要仔细实现,通常涉及在交叉验证期间学到的技术或专门用于可靠处理它的库。
最佳编码方法取决于几个因素:
下面是一个简单的图示,说明了“颜色”特征的独热编码和标签编码之间的结构差异:
单个类别特征使用独热编码与标签编码的转换。独热编码创建多个二元列,而标签编码创建单个整数列。
高效编码类别变量是构建可靠机器学习模型的先决条件。进行实验并理解不同方法之间的权衡对于为您的特定数据集和建模任务找到最佳方法非常重要。编码后,这些特征以及前面讨论的数值特征,将构成算法的输入矩阵。
这部分内容有帮助吗?
OneHotEncoder 和 LabelEncoder 的详细信息和示例。pandas.get_dummies 函数的官方文档,提供独热编码的示例和参数说明。© 2026 ApX Machine LearningAI伦理与透明度•