趋近智
如前所述,神经网络需要数值输入。缩放处理现有数值特征,但我们常遇到并非天生数值的数据,特别是分类特征。比如产品类别(“电子产品”、“服装”、“食品杂货”)、用户群组(“新用户”、“回访用户”、“不活跃用户”)或颜色(“红”、“绿”、“蓝”)。直接将这些文本标签输入网络是不可行的。我们需要方法将这些类别转换为网络能理解的数值格式,同时避免意外引入误导信息。
一种简单的方法是为每个类别分配一个唯一的整数。例如,如果有一个“颜色”特征,包含“红”、“绿”、“蓝”等类别,可以这样进行映射:
然而,这会引入人为的顺序关系。网络可能将“蓝”(2)理解为“大于”“绿”(1),或者认为“红”和“蓝”之间的“距离”(2 - 0 = 2)是“红”和“绿”之间距离(1 - 0 = 1)的两倍。对于大多数分类特征(名义类别),这些数值关系没有意义,并可能干扰学习过程。网络可能根据这些任意的数值分配而非实际的类别差异来学习模式。
一种处理神经网络中名义分类特征的有效且标准的方法是独热编码(One-Hot Encoding)。其思路是为原始特征中的每个独特类别创建一个新的二元特征(取值0或1)。
对于每个数据点,对应其类别的列将赋值为1,而为该特征创建的所有其他列将赋值为0。
再次以“颜色”为例,包含“红”、“绿”、“蓝”等类别。独热编码会将这一个特征转换为三个新的二元特征:“是_红”、“是_绿”、“是_蓝”。
[1, 0, 0][0, 1, 0][0, 0, 1]图示:一个分类值(“绿”)如何通过独热编码转换为二元向量。
这种方法有显著优点:
然而,独热编码也并非没有潜在缺点:
实际操作中,pandas 和 scikit-learn 等库使独热编码变得简单。
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# 示例数据
data = pd.DataFrame({'Color': ['Red', 'Green', 'Blue', 'Green']})
# 使用 pandas get_dummies
one_hot_pandas = pd.get_dummies(data['Color'], prefix='Color')
print("Pandas get_dummies 输出:\n", one_hot_pandas)
# 使用 scikit-learn OneHotEncoder
# 编码器需要重塑数据
encoder = OneHotEncoder(sparse_output=False) # 使用 sparse_output=False 以获得密集数组
one_hot_sklearn = encoder.fit_transform(data[['Color']])
print("\nScikit-learn OneHotEncoder 输出:\n", one_hot_sklearn)
print("特征名称:", encoder.get_feature_names_out(['Color']))
pd.get_dummies通常方便进行快速检查,而sklearn.preprocessing.OneHotEncoder更适合标准机器学习流程,尤其是在一致处理训练集和测试集时。
标签编码(Label Encoding)只是简单地为每个类别分配一个唯一的整数,如本节所述(例如,红=0,绿=1,蓝=2)。
from sklearn.preprocessing import LabelEncoder
# 示例数据
data = pd.DataFrame({'Size': ['Small', 'Medium', 'Large', 'Medium']})
# 使用 scikit-learn LabelEncoder
label_encoder = LabelEncoder()
data['Size_Encoded'] = label_encoder.fit_transform(data['Size'])
print("标签编码输出:\n", data)
print("编码类别:", label_encoder.classes_) # 显示映射
尽管简单,但标签编码通常不推荐用于神经网络的输入特征,因为它会创建人为的顺序关系。网络可能错误地认为“大”(例如编码为2)在数量上“多于”“小”(例如编码为0),从而线性影响预测。
在特定情形下可以使用它,例如:
当一个特征拥有成千上万,甚至数百万个独特类别(例如用户ID、产品SKU、特定地点)时会怎样?由于维度大幅增加,独热编码变得不切实际。这里有几种方法,尽管有些更进阶:
理解数据以及每种编码方法的影响对有效地准备数据很重要。选择正确的方法确保网络收到有意义的数值表示,有助于更好的学习和模型表现。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造