在应用任何编码技术之前,弄清分类特征本身具有不同形式是很重要的。概括来说,我们可以将它们分为两种主要类型:标称类别和序数类别。认识到这种区别是根本的,因为最佳编码策略通常取决于您正在处理的分类数据类型。使用不恰当的编码方法可能会向数据集中引入误导性信息,或者未能获取特征中包含的有价值的结构信息。标称类别标称类别表示不同的组或标签,其值之间不存在固有的顺序或排名。可以将它们视为定性分类。例如:颜色: 红色、绿色、蓝色、黄色国家名称: 美国、加拿大、墨西哥、英国产品类型: 笔记本电脑、平板电脑、智能手机性别: 男性、女性、非二元对标称特征而言,对类别进行任何数值分配都纯粹是任意的。将 1 赋值给“红色”,将 2 赋值给“绿色”,将 3 赋值给“蓝色”,并不意味着蓝色“大于”绿色,也不意味着红色和绿色之间的差异与绿色和蓝色之间的差异相同。机器学习算法,特别是线性模型或基于距离的算法(如 k-最近邻),可能会误解此类数值分配,假设原始数据中根本不存在的顺序或量级差异。这可能导致不正确的假设,并可能降低模型性能。序数类别另一方面,序数类别在其值之间具有有意义的顺序或排名,但连续类别之间的差异大小不一定已知、统一或可量化。顺序很重要,但对类别进行算术运算通常没有意义。例如:教育水平: 高中、学士、硕士、博士客户满意度: 非常不满意、不满意、中立、满意、非常满意服装尺码: 小、中、大、特大服务等级: 青铜、白银、黄金、白金在这里,我们知道“硕士”高于“学士”,“满意”代表比“中立”更好的结果。然而,我们通常不能假设“高中”和“学士”之间的“差距”与“硕士”和“博士”之间的差距相同。为这些级别分配 1, 2, 3, 4 等数值可以捕获顺序,这对于某些模型来说是宝贵的信息。然而,仍需保持谨慎,因为模型可能会按字面意思解释数值差异(例如,假设级别 1 和 2 之间的差异与级别 3 和 4 之间的差异完全相同)。为什么区别对编码很重要弄清特征是标称的还是序数的,直接影响您选择编码策略:保存信息: 目标是以数值方式表示分类信息,而不引入伪影或丢失现有结构。避免虚假顺序: 对标称数据使用为序数数据设计的编码方法(如分配连续整数)可能会引入虚假的顺序感,从而混淆学习算法。例如,将 ['USA', 'Canada', 'Mexico'] 编码为 [1, 2, 3] 可能会导致线性模型错误地推断墨西哥具有美国所代表的某种属性的三倍。捕获现有顺序: 对序数特征使用主要为标称数据设计的方法(如独热编码)可能会导致模型遗漏固有的排名信息。尽管这通常是一种安全的方法,但如果顺序本身是一个强预测因子,它可能不是最佳的。算法敏感性: 不同的机器学习算法反应不同。基于树的模型(如决策树、随机森林)通常可以有效处理原始序数编码(例如 1、2、3),因为它们根据阈值(feature <= 2)进行分割。然而,线性模型、支持向量机和神经网络对数值尺度以及编码值之间隐含的关系更敏感。digraph G { bgcolor="transparent"; rankdir=LR; node [shape=box, style="rounded,filled", fontname="sans-serif", fillcolor="#e9ecef", color="#adb5bd"]; edge [fontname="sans-serif"]; Cat [label="分类特征"]; Nominal [label="标称类别\n(无序)", fillcolor="#a5d8ff"]; Ordinal [label="序数类别\n(有序)", fillcolor="#b2f2bb"]; EncNominal [label="编码策略\n(例如:独热编码、哈希编码)", fillcolor="#d0bfff"]; EncOrdinal [label="编码策略\n(例如:序数编码、独热编码)", fillcolor="#ffd8a8"]; Cat -> Nominal [label=" 类型? "]; Cat -> Ordinal [label=" 类型? "]; Nominal -> EncNominal [label=" 选择 "]; Ordinal -> EncOrdinal [label=" 选择 "]; }确定分类特征是标称的还是序数的,有助于选择合适的编码技术。确定类型通常需要检查特征的唯一值,并运用关于这些值所代表内容的领域知识。是否存在逻辑上的进展或层级关系?如果是,则很可能是序数类别;否则,就是标称类别。考虑到这一区别,以下部分将介绍具体的编码技术,讨论它们最适合哪种数据类型,并使用常见的 Python 库演示它们的实现。我们将从通常用于标称数据的方法开始,然后介绍可以处理序数关系或解决高基数等问题的方法。